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

» Использование DevExpress

Автор: xokc
Дата сообщения: 20.06.2006 19:43
Vic
Переписать событие View.DataController.OnCompare

Добавлено:
Такой вопрос: компонент TdxBarCombo - изменяем в нем строку и НЕ нажимая Enter кликаем любую кнопку на dxBar - текст в TdxBarCombo возвращается в исходное значение. Как изменить такое поведение на то, которое присуще обычным Edit?
Автор: Alex47
Дата сообщения: 21.06.2006 08:15
Vic
Я для этого иногда делаю дополнительную (невидимую) unbound колонку, которая первой ставится в сортировку. В последних записях в эту колонку можно поместить, к примеру, - 1, а в остальных - 0. Это даст требуемый порядок сортировки.
Использовать OnCompare, к сожалению, не всегда удается - замедляется обработка.
Автор: Vic
Дата сообщения: 21.06.2006 09:21
Alex47

Цитата:
Я для этого иногда делаю дополнительную (невидимую) unbound колонку, которая первой ставится в сортировку. В последних записях в эту колонку можно поместить, к примеру, - 1, а в остальных - 0. Это даст требуемый порядок сортировки.
Использовать OnCompare, к сожалению, не всегда удается - замедляется обработка.


Пример привести можешь, а то что-то недогнал?
Автор: jicoff
Дата сообщения: 21.06.2006 10:57
Vic

Речь идет о том, чтобы в запросе добавить еще одно поле (константу), и при сортировке ставить его вначало, например, пять строк с двумя полями:

0 С1
0 С2
0 С3
1 С4
1 С5

Alex47

Метод хорош, если запретить в гриде сортировку. В противном случае при нажатии на заголовок любой колонки все перемешается.
Автор: Alex47
Дата сообщения: 21.06.2006 11:23
Vic
Идея простая (реализация зависит от проекта):
1. Добавляем во View в дизайнере служебную unbound (не привязанную к полю
таблицы) колонку. Выставляем для нее visible = False и сортировку по возрастанию.
Тип колонки - Integer.
2. Теперь в run time надо решать две проблемы. Для "двух строк", которые должны
быть последними, надо в unbound колонку программно занести 1, а для остальных
строк - занести туда 0. Если зти строки в процессе работы динамически меняются, то
надо подобрать обработчики, в которых будут обновляться значения по разным
строкам в этой колонке. Вторая проблема - возможная смена порядка сортировки
юзером. То есть, если пользователь, к примеру, сменил порядок сортировки в
колонке N на "по возрастанию", то результирующий порядок сортировки по гриду
будет: сортировка во возрастанию по колонке unbound, сортировка во возрастанию по
колонке N.

Добавлено:
jicoff

Цитата:
Метод хорош, если запретить в гриде сортировку. В противном случае при нажатии на заголовок любой колонки все перемешается.

Это надо разруливать в обработчиках
Автор: jicoff
Дата сообщения: 21.06.2006 11:53
Alex47

А у тебя есть готовое решение?
Автор: Alex47
Дата сообщения: 21.06.2006 12:32
jicoff

Цитата:
А у тебя есть готовое решение?


Для общего случая решения у меня нет - пока не требовалось. Есть проект в котором реализован ввод новых строк так, чтобы они всегда попадали вниз. Там используется сортировка по unbound колонке.
Автор: korobovmax
Дата сообщения: 22.06.2006 08:42
Как заставить вывалиться редактор (читай PopupControl) TcxPopupEdit'а?

Ещё: можно привести пример с посылом форме PostMessage, о котором упоминали уже несколько раз?    
Автор: jicoff
Дата сообщения: 22.06.2006 10:51
korobovmax

Что значит вываливаться? Есть такое свойство GridView.OptionsBehavior.ImmediateEditor, которое сразу показывает редактор после получения фокуса ячейкой.
Автор: korobovmax
Дата сообщения: 22.06.2006 10:55
jicoff, классно. А мне надо заставить показать редактор без передачи фокуса.
Автор: jicoff
Дата сообщения: 22.06.2006 11:02
korobovmax

Это как это? Дело в том, что пока ячейка не получила фокус, никакого редактора она не содержит. Есть только Properties, что, как догадываешься, не редактор.
Автор: korobovmax
Дата сообщения: 22.06.2006 11:14
Блин, да всё ясно.
Я хочу, чтобы показался PopupControl.

Добавлено:
(<ГридВъюКолумн>.Properties as TcxPopupEditProperties).PopupControl.Show;
Вопрос снят. Спасибо, что я понял, чего хочу

Но есть ещё с PostMessage. Можно примерчик увидеть?
Автор: jicoff
Дата сообщения: 22.06.2006 11:49
korobovmax

Не знаю, что ты конкретно хочешь, но, например:

// определяешь свое значение сообщения
const
WM_SETNOTEDATA: = WM_APP + 100;

// в классе описываешь процедуру
<Class name> = class ...
...
procedure WMSetNoteData(var Message: TMessage); message WM_SETNOTEDATA;
...
end;

procedure <Class name>.WMSetNoteData(var Message: TMessage);
begin
if Message.wParam >= 0 then
begin
... // здесь пишишь все, что надо для вызова PopupControl
end;
end;

// вызываешь
PostMessage(Handle, WM_SETNOTEDATA, GridView.Controller.FocusedRecordIndex, 0);

Автор: hobest
Дата сообщения: 23.06.2006 02:23
Использую Express компоненты еще конца прошлого года. Есть ли продвижение в плане возможностей, стандартного меню и т.д. TcxSpreadSheet?
Автор: Vic
Дата сообщения: 23.06.2006 08:32
xokc

Цитата:
Переписать событие View.DataController.OnCompare


Так ничего умного и непридумал, реализовывал кто или нет, пример покажите, в Гриде есть 2 строки, которые всегда должны быть последние, как организовать, чтобы эти 2 строки неучавствовали в сортировке? Или после сортировки перегнать их в конец?
Автор: Alex1978
Дата сообщения: 23.06.2006 08:44
procedure TMainForm.tbvPersonsDataControllerCompare(
ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
begin
if (V1 <> 'последняя') and (V2 <> 'предпоследняя') then
Compare := AnsiCompareStr(V1,V2)
else
begin
if (V1 = 'последняя') and (V2 <> 'предпоследняя') then
Compare := 1;
if (V1 = 'предпоследняя') and (V2 <> 'последняя') then
Compare := 1;
if (V1 = 'последняя') and (V2 = 'предпоследняя') then
Compare := 1;
if (V1 = 'предпоследняя') and (V2 = 'последняя') then
Compare := -1;
end;
end;

Где-то так, писал на скорую руку но исходи из этого
Параметр Compare может иметь три значения: 1, -1 или 0. Единица означает, что первый элемент больше (или должен быть размещён после) второго элемента. Минус одни означает, что первый элемент меньше чем (или должен быть размещён перед) второй элемент. Ноль означает, что два элемента равны.



Добавлено:
Имею проблему. Самому разобраться пока (два дня) не получается.

Проблема имеется в связке FIBPlus + cxGrid (текущей записью после Insert и Post становиться не вновь добавленная запись).

Есть тест-пример, если кто согласиться помочь, буду очень признателен. Пишите в ПМ.
Автор: Deeptown12
Дата сообщения: 23.06.2006 09:58
Проблема с работой в последний DevExpress
при выборе даты в любом компоненте испольющем дату вылетает ошибка
(касаемо работы с датой и с cxDataEdit особенно)
Overflow while converting variant type (Integer) into type (Data)
что делать
верс 5.17
Автор: Vic
Дата сообщения: 23.06.2006 10:40
К тому, что ты набросал добавил для правильности
Alex1978

Цитата:
procedure TMainForm.tbvPersonsDataControllerCompare(
ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
begin
if (V1 <> 'последняя') and (V2 <> 'предпоследняя') and (V1 <> 'предпоследняя' ) and (V2 <> 'последняя') then
Compare := AnsiCompareStr(V1,V2)
else
begin
if (V1 = 'последняя') and (V2 <> 'предпоследняя') then
Compare := 1;
if (V1 = 'предпоследняя') and (V2 <> 'последняя') then
Compare := 1;
if (V1 = 'последняя') and (V2 = 'предпоследняя') then
Compare := 1;
if (V1 = 'предпоследняя') and (V2 = 'последняя') then
Compare := -1;
end;
end;


Сообщаю результат, запускаю прогу (на свойствах колонки сортировки нет) записи последние все ок, щелкаю по колонке, все сортируется нужные записи внизу, щелкаем еще раз, меняем сортировку записи уползают на самый верх, т.е. стоят первые, что-то никак недоганю, что здесь не так?
Автор: Alex1978
Дата сообщения: 23.06.2006 10:57
Vic
if (V1 <> 'последняя') and (V2 <> 'предпоследняя') and (V1 <> 'предпоследняя' ) and (V2 <> 'последняя') then
Compare := AnsiCompareStr(V1,V2)
else
begin
if (V1 = 'последняя') and (V2 <> 'предпоследняя') then
if Сортировка = возрастание
Compare := 1
else
Compare := -1;
b т.д.
end;

Проверь так
Автор: jicoff
Дата сообщения: 23.06.2006 11:01
Vic

Конечно, теперь вместо 1 - -1 должны быть.
Автор: Vic
Дата сообщения: 23.06.2006 11:16
Всем спасибо все просто супер

Автор: mln141
Дата сообщения: 23.06.2006 14:16
Deeptown12

Цитата:
Проблема с работой в последний DevExpress
при выборе даты в любом компоненте испольющем дату вылетает ошибка
(касаемо работы с датой и с cxDataEdit особенно)
Overflow while converting variant type (Integer) into type (Data)
что делать
верс 5.17


Эта ошибка тянется уже больше года. См. стр. 16-17. Лично я из-за этого до сих пор пользую старую версию.
Автор: baraka
Дата сообщения: 23.06.2006 15:44
Есть два вопроса:
1. При Copy&Paste из Word-a или Explorer-a текста в кодировке EASTEUROPE_CHARSET диакритические знаки заменяются на обычные. Ктонибудь сталкивался с этим? (Использую последние версии DevEx).
2. Как, если это возможно, отлавливать OnPaste событие чтобы на лету менять содержимое clipboard-a ?
Автор: reenoip
Дата сообщения: 23.06.2006 16:55
Deeptown12, исправил глюк с датой (делал для проекта с ADO, хотя, это и не суть) по советам местных мозгов так:

"NullDate = -700000;"
на
"NullDate = -1;"

в файлах:

...\ExpressEditors Library 5\Sources\cxDateUtils.pas
и
...\ExpressBars 5\Sources\dxBarExtItems.pas

После этого нужно обязательно перекомпилировать компоненты.

Добавлено:
"Мозги", только без обид, я любя
Автор: Alex47
Дата сообщения: 23.06.2006 16:59
mln141
Deeptown12

Мы работаем с D6 и DevExp v 5.9. Вроде те, старые глюки ( стр 16-17) не проявляются.
Borland в D6 что-то намудрил с variants. Этому и был посвящен Update Pack 3.
Сейчас думаем переходить на последнюю версию DevExp, поэтому интересует точная информация о вылетах, желательно на примере демок DevExp.
Автор: mln141
Дата сообщения: 23.06.2006 17:15
Alex47
Я работаю с 6 стройкой, поэтому про Д6 ничего сказать не могу. Глюк тестировал не полнолстью (беру новых девок, ставлю, запускаю старый проект - вылетает и откатываюсь к старым девкам). С 0 проект с новыми девками создавать не пробовал - жалко тратить время.
Автор: jicoff
Дата сообщения: 23.06.2006 17:17
Мы тоже работаем с 5.9 версией, правда на CB6. А когда под D6 вышел UP3? Вероятно эта ошибка проявится и в CB6, так как используется библиотека D6.
Автор: Alex47
Дата сообщения: 23.06.2006 18:57
Полазил немного по конференциям, чтобы вспомнить, что было год назад.
Вот ответ DevExpress для D6 (26.8.2005):
"You should make sure you have General Update Pack 2, Runtime Library Update 2 and 3 installed. Runtime Library Update 2 fixes some problems with variant operations"
То есть, речь шла о Runtime Library Update 2, а не 3. Замечу, что тогда этот совет не помог,
и скоро появился fix from support (Issue ID 23412). У нас этого fix не было, но был fix от VadimLou (стр 19).
Далее 20 декабря 2005 г появилось сообщение от Bob Walsh:
Every control that handles date gave me this message "Overflow while
converting variant of type (Integer) into type (Date)" even though I've
changed three versions of QuantumGridSuites 5.8, 5.9 and finally 5.11.
How come you couldn't fix this famous problem from version 5.8 to
version 5.11.
DevExpress скромно промолчал.
Еще есть сообщение подобное сообщению от reenoip:
"De library has a constant for a NULL value date (this is the problem).
Search in all units of developer express for the line:
NullDate = -700000;
Change this in:
NullDate = -2;
My problem was solved.

Так, что пока вопрос о том, работают ли без глюков последние версии DevExpress с D6 остается открытым.
Автор: mln141
Дата сообщения: 23.06.2006 21:23
reenoip
Alex47
У меня все заработало (правда девки не последние -мартовские)
Автор: Alex47
Дата сообщения: 23.06.2006 22:35
mln141
Заработало со стройкой?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Kylix


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