Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 3)

Автор: X11
Дата сообщения: 10.08.2009 08:28
FunCode, да я ж написал, что к гриду привязана таблица

Цитата:
Прикрутил грид к таблице


Всего в таблице базы 2 поля: ID и NAME. В поле NAME я сохраняю путь с именем файла: C:\my_folder\my_file.xls, например.
Но в самом гриде я создал ещё одно непривязанное к базе поле, properties := image;
Самого файла может и не существовать. Но иконку нужно показать. Рылся вчера в инете, нарыл, как узнавать иконку, привязанную к типу, но как вывести её в грид, так и не нашёл.
Автор: FunCode
Дата сообщения: 10.08.2009 09:50
X11
я бы сделал так, но есть некоторые "но", которые можно будет обсудить:
1. Кидаем TcxImageList на форму, добавляем в него иконки с обозначениями типов файлов.
2. У столбца Properties:=ImageComboBox, Images выбираем ImageList, теперь наполняем Items всеми иконками из ImageList при этом Value прописываем по следующему принципу - '.txt' для иконки тектового файла, '.xls' - для иконки Excel файла и т.п., а ValueType везде String.
3. Теперь задача получить набор данных не из двух столбцов, а сразу из трех. Я бы сделал это например так - SELECT ID, NAME, RIGHT(NAME, CHARINDEX('.', REVERSE(NAME))) AS EXTENSION FROM MYTABLE
пример запроса на MSSQL2000.
Автор: X11
Дата сообщения: 10.08.2009 10:42

Цитата:
1. Кидаем TcxImageList на форму, добавляем в него иконки с обозначениями типов файлов.

Не, не, так не годится. Нужно из ОСи выдирать иконки и привязки. Но главное, как потом вывести это в поле грида.
Автор: FunCode
Дата сообщения: 10.08.2009 11:06
X11

Цитата:
Нужно из ОСи выдирать иконки и привязки

ну так и наполняем ImageList иконками из ОС, а в Items выставляем привязки ...
Автор: X11
Дата сообщения: 10.08.2009 11:27
Зачем мне наполнять сотней иконок ImageList? Это не рационально.
1. Хотя бы потому, что компоненты DevExpress и так неплохо кушают.
2. В таблице 3-5 строк.
3. Возможно что пользователь будет вставлять в таблицу только экселевские файлы, или только винраровские. Ну или 2-3 разновидности типов файлов.
А так получается нужно загрузить порядка сотни типов в ImageList, а потом ещё искать их в ImageList`е.
Автор: FunCode
Дата сообщения: 10.08.2009 11:37
X11
ну елси так мало, то через OnCustomDrawCell

Добавлено:

Цитата:
А так получается нужно загрузить порядка сотни типов в ImageList, а потом ещё искать их в ImageList`е.

подгружать надо будет все, но один раз для каждого типа файла, что более рационально,
а искать ничего не надо будет, если все сделать как я выше описал, но раз так мало записей,
то можно и ручками ...
Автор: vladman
Дата сообщения: 10.08.2009 16:21
X11

Цитата:
Даже не знаю, в каком направлении копать.

Попробуйте следующее:

Код: Uses ShellAPI;
function GetFileAssociatedIcon(AFileName: TFileName): HIcon;
var
vBuffer: array[0..2048] of char;
vIconIndex: Word;
begin
StrCopy(@vBuffer, PChar(AFileName));
vIconIndex := 0;
Result := ExtractAssociatedIcon(HInstance, vBuffer, vIconIndex);
end;

procedure <YourForm>.<YourcxGridTableView>CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo:
TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
vIconHandle: HIcon;
begin
if AViewInfo.Item = <YourcxGridTableViewFileImageColumn> then
begin
vIconHandle := GetFileAssociatedIcon(AViewInfo.GridRecord.Values[<YourcxGridTableViewFilePathColumn>.index]);
DrawIcon(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle);
ADone := True;
end;
end;
Автор: quarkus
Дата сообщения: 11.08.2009 11:13
несколько вопросов по соответствующей компоненте (DevExpress.XtraScheduler.DateNavigator)
1. как убрать синий квадрат когда дата выделена (e.Selected=true)

следующий код вообще убирает дату

private void OnMonthCalendar_CustomDrawDayNumberCell(object sender, CustomDrawDayNumberCellEventArgs e)
{
if (e.Selected) e.Handled = true;
}

2. как убрать jumping (когда наводишь на граничную дату в месяце, то происходит скачок на следующий или предыдущий месяц)?
Автор: AlexPetrovich
Дата сообщения: 11.08.2009 16:43
Использую ручную фильтрацию в компоненте TcxLookupComboBox (через формирование ACombo.Properties.DataController.Filter). Если вводить данные в поле вручную, то все замечательно фильтруется. Но если присвоить ACombo.Text в коде, то фильтрация не работает. Т.е. можно присвоить любое значение которое есть в ListSource.
Как сделать, чтобы и при присвоении ACombo.Text в коде тоже происходила фильтрация, и если присвоенное значение не соответствут фильтру, то происходила очистка поля и EditValue стоновился Null ?
Автор: volser
Дата сообщения: 11.08.2009 16:51
AlexPetrovich
Фильтруй датасет на который смотрит ListSource.
Автор: AlexPetrovich
Дата сообщения: 11.08.2009 17:07
Я бы с радостью, но юзал Девовский фильтр именно потому, что он умеет делать LIKE, причем локально. А фильтр датасета так не умеет.
Автор: Martian2
Дата сообщения: 11.08.2009 17:22
Приветствую всех!
Есть проблема с RadioGroup - не привязывается нормально к источнику данных.
Как правильно привязать?
Привязываю по EditValue и SelectedIndex.Это уже изврат, но при этом вроде работает но не с NULL значениями. При попытке изменить NULL в источнике (датасете) ничего не происходит. В чем дело?
Автор: vladman
Дата сообщения: 12.08.2009 00:01
Martian2

Цитата:
Есть проблема с RadioGroup

RadioGroup - это набор Radio Buttons, представленных свойством Properties.Items.
Каждый Items (TcxRadioGroupItem) характеризуется свойством Value. Если, например, в вашем датасете текущая запись в поле связанном с RadioGroup (через свойство DataBinding.DataFiel) имеет значение 3 и, скажем, Properties.Items[2].Value = 3, то выбранным как раз и окажется этот, второй, Item. И наоборот, если вы выберете, скажем Properties.Items[0], у которого свойство Value = 8, то в соответствующее поле датасета и запишется 8. Но обычно делают Properties.Items[0].Value = 0, Properties.Items[1].Value = 1 и т.д. Пример выше был для иллюстрации общего случая. На самом деле, все зависит от того, что и как вы хотите сохранять и отображать с помощью этого контрола.
Для того чтобы в датасет записалось null - сделайте Item со значением свойства Value = Null. Не забывайте также указывать и тип значения Item'ов.
Автор: Martian2
Дата сообщения: 12.08.2009 09:33

Цитата:
Для того чтобы в датасет записалось null - сделайте Item со значением свойства Value = Null. Не забывайте также указывать и тип значения Item'ов.


Спасибо! Я вас понял. Но ситуация такая что Value не работает с источником. Привязка через свойство EditValue не дает никаких результатов. Привязка через SelectedIndex – дает отображение - то есть отображаются напрямую индексы. Соответственно NULL он не видит даже если Value NULL. При этом запись в источник не работает.
Лишь если привязать дополнительно еще и по свойству EditValue и установить режим обновления источника Never – то удается писать но писать Index а не Value. К примеру один из Item имеет индекс 5 Value = NULL. Пишется в источник 5. Если в источнике NULL – не отображается ни один из Items.
Единственный выход видится – не использовать NULL либо отождествлять его с целым, сразу при добавлении записи писать 5 допустим. Но это не правильно. Хочется чтоб с NULL тоже можно было работать.
Автор: vladman
Дата сообщения: 12.08.2009 12:33
AlexPetrovich

Цитата:
Если вводить данные в поле вручную, то все замечательно фильтруется

Решение напрашивается само собой - эмулируйте ручной ввод. Например так

Код: procedure SendTextToLookupComboBox(ALookupComboBox: TcxlookupComboBox; AText: string);
var
i: Integer;
vLayoutName : Array [0..KL_NAMELENGTH] of Char;
begin
GetKeyboardLayoutName(@vLayoutName);
try
LoadKeyboardLayout('00000419', KLF_ACTIVATE);
ALookupComboBox.SetFocus;
for i := 1 to Length(AText) do
ALookupComboBox.Perform(WM_CHAR, Ord(AText[i]), 0);
finally
LoadKeyboardLayout(@vLayoutName, KLF_ACTIVATE);
end;
end;
Автор: data man
Дата сообщения: 13.08.2009 06:22
Внимание всем, использующим Delphi c 4 по 7 !
Появился саморазмножающийся вирус поражающий Delphi !
Поражены как минимум QIP и AIMP !
Если у Вас в папке Lib есть файл SysConst.bak - значит Ваш компьютер заражен.
Лечение - копирование этого файла с именем SysConst.dcu.
Подробности здесь
Автор: JohnSilver182
Дата сообщения: 13.08.2009 14:18
cxSplitter1 - Если иметь неосторожность кликнуть мышкой , оно ВСЕ что слева двигает влево ((((
Автор: volser
Дата сообщения: 13.08.2009 14:38
JohnSilver182
Нормально поведение контрола. Событие OnBeforeClose.
Автор: JohnSilver182
Дата сообщения: 13.08.2009 15:30

Цитата:
Нормально поведение контрола. Событие OnBeforeClose.


А можно забаний такой изврат ??? ТОлько если зажал ЛКМ и повел плавно это гуд .
Автор: vladman
Дата сообщения: 13.08.2009 22:19
JohnSilver182

Цитата:
А можно забаний такой изврат

Есть несколько решений от "забанийизврат":
1. Вы, скорее всего, установили свойство HotZone в одно из значений: MediaPlayer8, MediaPlayer9, XPTaskBar, StyleSimple. Установите это свойство в nil, и будет "забаний".
2. Если всеже хочется видеть HotZone, тогда - воспользуйтесь советом volserа и пропишите в обработчике указанного события AllowClose := False; Но тогда теряется весь смысл использования HotZone.
Автор: Chukotka
Дата сообщения: 17.08.2009 04:04
Как обработать клик мышкой на закладках Docking-форм?
Автор: JohnSilver182
Дата сообщения: 17.08.2009 06:35

Цитата:
1. Вы, скорее всего, установили свойство HotZone в одно из значений: MediaPlayer8, MediaPlayer9, XPTaskBar, StyleSimple. Установите это свойство в nil, и будет "забаний".


ШАМАН !!!!


Добавлено:
А я хотел спросить по TcxLookUpComboBox

Если он связан с датасет типа
1 огурцы
Автор: f3ka
Дата сообщения: 17.08.2009 08:44
JohnSilver182
установить EditValue
Автор: JohnSilver182
Дата сообщения: 17.08.2009 09:33
f3ka Шаман !!

загадки множаться

а) dxStatusBar1 - Все пытался изменить размер панели , она как фокус пропадает , становиться своим тупым размером . Если убрать ...panels[0].Fixed:=false то оно на весь экран растягиваетсо !!

б) А как сказать из группы ExpressEditor компонентам что бы всю область заполняли ???? А то ровнять так обломно внутри контейнера !!!! Якроь ставить , а нафик !!


Автор: vladman
Дата сообщения: 17.08.2009 12:53
Chukotka

Цитата:
Как обработать клик мышкой на закладках Docking-форм?

Если речь идет о ExpressDocking Library, и DockPanel размещены в TabContainerDockSite, то у TdxTabContainerDockSite есть обработчик OnActiveChildChanged. При клике на Tab это событие как раз и возникает.

Добавлено:
JohnSilver182

Цитата:
своим тупым размером... ровнять так обломно внутри... а нафик !!

Уважаемый, послушайте, здесь не форум по красноречию младших классов вечерней школы.
Попробуйте излагаться на более внятном и понятном наречии, и вам обязательно постараются помочь найти ответы на ваши размножающиеся загадки
Автор: JohnSilver182
Дата сообщения: 17.08.2009 13:16

а) dxStatusBar1 - Если менять размеры панелей , то после потери фокуса ширина становиться старой

б) Если на панели сделал контейнер и поместил туда контрол , то ровнять контрол нужно Вручную . Нет у визуальных контролов свойства Aligh (кроме панелей и cxGrid)
Можно как то автоматизировать процесс ??

Автор: Chukotka
Дата сообщения: 17.08.2009 13:30
vladman

Цитата:
Если речь идет о ExpressDocking Library, и DockPanel размещены в TabContainerDockSite
Именно так

Цитата:
то у TdxTabContainerDockSite есть обработчик OnActiveChildChanged. При клике на Tab это событие как раз и возникает.
Мне надо перехватить правый клик мыши - хочу по нему активизировать отд меню. Так что увы, предложенный вами вариант не подходит.
Автор: vladman
Дата сообщения: 17.08.2009 13:58
JohnSilver182

Цитата:
после потери фокус

А фокус с какого котнрола теряется? Думаю, пример бы помог быстрее разобраться.

Цитата:
Нет у визуальных контролов свойства Aligh. Можно как то автоматизировать процесс ??

Cвойства Aligh есть, только это свойство не published, а public. Поэтому вы его и не ведите в Object Inspector. Автоматизировать процесс можно, поместив следующий код, например, в обработчик OnCreate вашей формы:
<YourcxEditorControl>.Align := alTop;
Автор: JohnSilver182
Дата сообщения: 17.08.2009 14:25

Цитата:
А фокус с какого котнрола теряется? Думаю, пример бы помог быстрее разобраться.

Нашел у dxStatusBar.Panel[x].MinWith + двигать мышкой бесполезно . Надо руками менять dxStatusBar.Panel[x].With


Цитата:
Cвойства Aligh есть, только это свойство не published, а public. Поэтому вы его и не ведите в Object Inspector. Автоматизировать процесс можно, поместив следующий код, например, в обработчик OnCreate вашей формы:
<YourcxEditorControl>.Align := alTop;


Мама мия !


Автор: Dm_Sok
Дата сообщения: 17.08.2009 14:37
Доброго времени суток. Подскажите плиз, можно ли в cxGride объединять ячейки горизонтально.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.