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

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

Автор: MyNameIsNataly
Дата сообщения: 30.11.2009 09:29
vladman

Цитата:


Цитата: появляется другой "глюк", о котором, если нужно сообщу отдельно

Думаю что нужно.
Автор: vladman
Дата сообщения: 30.11.2009 09:55
Vadim153

Цитата:
По какому событию вычислить значение Поля3 и как его ввести в нужную ячейку текущей строки грида?


Попробуйте обработать событие onBeforePost DataControllera вашего cxGrid. Например:

Код: procedure <YourForm>.<YourcxGridTableView>DataControllerBeforePost(ADataController: TcxCustomDataController);
begin
ADataController.Values[ADataController.FocusedRecordIndex, <YourcxGridTableView>Column3.Index] :=
ADataController.Values[ADataController.FocusedRecordIndex, <YourcxGridTableView>Column1.Index] +
ADataController.Values[ADataController.FocusedRecordIndex, <YourcxGridTableView>Column2.Index];
end;
Автор: neznayka3
Дата сообщения: 30.11.2009 10:04
cxTreeList.OptionsView.CheckGroups=true; в событии OnNodeCheckChanged смотрю какие ноды выбраны. как сменить шрифт у строк, которые отмечены? и если CellSelect=false как ставить\снимать выделение щелкая по строкам мышью или пробелом?

OnNodeCheckChanged не подходит. если изменить предка, то событие вызывается для всех потомков. какое событие выбрать, чтобы оно срабатывало один раз? при выделение нодов подгружаю данные из БД.
Автор: Einsiedler
Дата сообщения: 30.11.2009 23:38
Скачал исходники с DevExpres v47 и не могу никак их ручками поставить. Кто-нибудь ставил вручную девы? У меня линкер падает на dxdbtrC6.bpk (при его сборке пишет Fatal: Access violation. Link terminated). Плиз..., помогите!!!
Автор: vladman
Дата сообщения: 30.11.2009 23:39
MyNameIsNataly

Цитата:
Назвала бы "эстетический глюк". Когда указатель стоит в поле (у которого св-во TcxDBVerticalGrid.OptionsData.Edit = True), при Refresh датасета значения в этом поле начинают пробегать, видимо, вместе с fetch-ем полей в датасете.

Интересно, не замечал такого. А есть запускаемый модуль иллюстрирующий ошибку. Конечно, желательно и исходники к нему.
Как заплатку к проблеме могу предложить попробовать перед вызовом Refresh отключать от DataControllera TcxDBVerticalGrid его DataSource, а после Refresh снова подключать.
Автор: Einsiedler
Дата сообщения: 30.11.2009 23:43
Кто-нибудь может скинуть DevExpress v47 на мою почту, а то баллов не хватает забрать его с обменника, а проект горит. НУ ОО..че... НЬ НАДО!!! Плиз...
Автор: vladman
Дата сообщения: 30.11.2009 23:43
neznayka3

Цитата:
при наборе список показывает не все записи, а только первую, хтя DropDownRows=8. и не работает переход по записям клавишей "стрелка вниз" - стоит на 1 записи

Скорее всего по умолчанию ADOQuery1 при открытии не "Фетчит" все записи. Попробуйте что-то из разряда FetchAll, либо ADOQuery1.Last. Точнее, к сожалению, не могу подсказать - с ADOQuery не приходилось сталкиваться.

Добавлено:
Einsiedler

Цитата:
Кто-нибудь может скинуть DevExpress v47 на мою почту, а то баллов не хватает забрать его с обменника, а проект горит. НУ ОО..че... НЬ НАДО!!! Плиз...

Раз вы знаете про обменник, раз вы это написали здесь, и не написали свою просьбу в ветке "Коммерческие компоненты и утилиты для Delphi/BCB", то наверняка читали там шапку и знакомы с правилами и, также, не могли не заметить реакцию на подобные сообщения. Почему вы решили, что в этой ветке это приветствуется? Каким образом ваша просьба "скинуть" имеет отношение к "Обмену опытом, обсуждению нюансов и решению проблем возникающих при использовании библиотеки компонент Developer Express"?

По поводу "ручками поставить" - есть некоторые альтернативы. Какие? Были ссылки и обсуждения в "Коммерческих компонентах...".

Добавлено:
neznayka3

Цитата:
cxTreeList.OptionsView.CheckGroups=true; в событии OnNodeCheckChanged смотрю какие ноды выбраны. как сменить шрифт у строк, которые отмечены?

Событие OnNodeCheckChanged не совсем подходит для этих целей. Данную задачу легко решить с помощью обработки события onCustomDrawDataCell вашего cxTreeList. Например:

Код:
uses
cxLookAndFeelPainters, Graphics;
...
procedure <YourForm>.<YourcxTreeList>CustomDrawDataCell(Sender: TcxCustomTreeList; ACanvas: TcxCanvas; AViewInfo:
TcxTreeListEditCellViewInfo; var ADone: Boolean);
begin
if AViewInfo.Node.CheckState = cbsChecked then
ACanvas.Font.Style := [fsBold];
end;
Автор: sldaac
Дата сообщения: 01.12.2009 08:05
Einsiedler

Цитата:
НУ ОО..че... НЬ НАДО!!! Плиз...

Обратись в личку к xMesSir или feandy , может помогут.
Автор: SIgor33
Дата сообщения: 01.12.2009 08:17
neznayka3
иcпользуй cxdbLookupComboBox там есть свойсво Lookuplist пишешь туда исходную таблицу и все замечательно выводиться хоть 100 значений на букву д
Автор: Vadim153
Дата сообщения: 01.12.2009 11:31
vladman


Цитата:
Попробуйте обработать событие onBeforePost DataControllera вашего cxGrid ...

Спасибо за ответ. Но теперь следющая проблема нарисовалась.
Одно поле имеет свойство LookupComboBox и ссылается по ID к БД. Расчет получается по: Поле1(ID)+Поле2, т.е.: 4(это ID)+2(для примера). А требуется 100р.(то, на что ссылается ID)+2.
Автор: vladman
Дата сообщения: 01.12.2009 11:42
Vadim153

Цитата:
Но теперь следющая проблема нарисовалась.

Получив ID, можно "сходить" в БД и получить значение (ваши 100р.), которое соответствует полученному ID, и затем использовать его для получения значения вычисляемого поля.
Автор: SIgor33
Дата сообщения: 01.12.2009 12:19
помогите помечать галочкой выбранные строки cxGrid для дальнешей обработки
Автор: MyNameIsNataly
Дата сообщения: 01.12.2009 13:08
vladman


Цитата:
Интересно, не замечал такого. А есть запускаемый модуль иллюстрирующий ошибку. Конечно, желательно и исходники к нему.
Как заплатку к проблеме могу предложить попробовать перед вызовом Refresh отключать от DataControllera TcxDBVerticalGrid его DataSource, а после Refresh снова подключать.


Переписывала частично код, хотя без каких-либо фундаментально изменений, и манипулировала с настройками верт. грида. Такое мелькание пропало (причем о данной ситуации сообщил коллега, который запускал пр-му у пользователя) и,к сожалению, не удалось повторить. Возьму на заметку и когда смогу повторить - отпишу.
Автор: vladman
Дата сообщения: 01.12.2009 17:02
SIgor33

Цитата:
помогите помечать галочкой выбранные строки cxGrid для дальнешей обработки

How to set up an unbound item in a data-aware View
Автор: Vadim153
Дата сообщения: 01.12.2009 17:34
vladman

Цитата:
Получив ID, можно "сходить" в БД и получить значение (ваши 100р.), которое соответствует полученному ID, и затем использовать его для получения значения вычисляемого поля.

Это понятно, предполагал, что можно будет прочитать отображаемое значение в ячейке, те же 100р.
Автор: vladman
Дата сообщения: 02.12.2009 01:00
Vadim153

Цитата:
предполагал, что можно будет прочитать отображаемое значение в ячейке, те же 100р.

Тогда используйте функцию GetDisplayText. Например

Код: .... :=
StrToInt(ADataController.GetDisplayText(ADataController.FocusedRecordIndex, <YourcxGridTableView>LookupColumn.Index)) +
.....
Автор: SIgor33
Дата сообщения: 02.12.2009 08:10
vladman
спасибо
Автор: sam291074
Дата сообщения: 03.12.2009 19:41
При компиляции проекта под XP и Win7 получаются разные размеры формы (по высоте), использующей Ribbon. С этим можно как-то бороться? (CG2009, Dev46)
Автор: vladman
Дата сообщения: 03.12.2009 21:21
sam291074

Цитата:
При компиляции проекта под XP и Win7 получаются разные размеры формы (по высоте), использующей Ribbon. С этим можно как-то бороться? (CG2009, Dev46)

Вроде бы как поправили в v6.47, если конечно это ваш случай.
Bug Report Details: Ribbon Form - In Windows 7 RTM, the non-client area is incorrectly painted
Автор: Cryogen2003
Дата сообщения: 04.12.2009 16:49
Как узнать в TcxGrid, когда кликнули на индикаторе?

Добавлено:
Или ещще лучше, как включить выделение по Ctrl в гриде? В исходниках нашел такую вещь, что если включено CellMultiSelect, то Ctrl не обрабатывается.

Добавлено:
Итак, понял в чем прикол, считаю это багом со стороны DevExpress. Кто-нибудь стуканитесь к ним в саппорт и объсните ситуацию.
При включенном OptionSelection.CellMultiSelect нельзя отмечать с помощью Ctrl записи, работает только через шифт.

В принципе после нехитрых манипуляций код начинает работать правильно.
Итак стало быть само исправление, модуль cxGridCustomTableView.
Само тело процедуры procedure TcxCustomGridTableController.MultiSelectMouseDown
(не в подпроцедуры) надо изменить текст на :

Код:
APressedRecord := TcxGridRecordHitTest(AHitTest).GridRecord;
ASelectionShift := AShift - [ssLeft, ssRight, ssMiddle, ssDouble];
AssignSelectionAnchor;
if (ASelectionShift = [ssCtrl]) and SupportsRecordSelectionToggling then
ProcessRecordSelectionToggling
else
if (ASelectionShift = [ssCtrl]) and Not SupportsRecordSelectionToggling then
DoMouseRangeSelection((ssCtrl in AShift) or not SupportsAdditiveSelection, AHitTest)
else
if (ASelectionShift = [ssShift]) or (ASelectionShift = [ssCtrl, ssShift]) then
DoMouseRangeSelection(not (ssCtrl in AShift) or not SupportsAdditiveSelection, AHitTest)
else
ProcessNormalSelection;
Автор: X11
Дата сообщения: 04.12.2009 23:22

Цитата:
Или ещще лучше, как включить выделение по Ctrl в гриде?

CellMultiSelect := false
MultiSelect := True
Автор: sam291074
Дата сообщения: 05.12.2009 11:23
vladman

Цитата:
Вроде бы как поправили в v6.47, если конечно это ваш случай.
Bug Report Details: Ribbon Form - In Windows 7 RTM, the non-client area is incorrectly painted

Да похоже не мой это случай. Смысл в том, что когда компилиш под XP в обоих системах пр запуске exe форма практически одинакова по высоте. А вот когда компилиш под 7, в XP при запуске exe высота увеличивается.

Пробовал 47ю. Все тоже самое.
Автор: sam291074
Дата сообщения: 05.12.2009 19:17
Разобрался, все дело в системных шрифтах. Они просто меняются по гарнитуре и размеру от системы к системе, от этого и проблемы. Вопрос снимаю.
Автор: Vadim153
Дата сообщения: 06.12.2009 00:48
vladman

Цитата:
Тогда используйте функцию GetDisplayText. Например

Спасибо, все работает, "р." легко убирается.
Почему рекомендуете событие onBeforePost DataControllera обрабатывать?
Было бы логичнее не ждать Post, а сразу при изменении значения в ячейке, пересчитывать и изменять значение в соседней ячейке.
Пробовал несколько вариантов, но работает как-то криво ...
Например, OnDataControllerRecordChanged, OnDataControllerDataChanged.
Что посоветуете?
Автор: vladman
Дата сообщения: 06.12.2009 22:47
Vadim153

Цитата:
Пробовал несколько вариантов, но работает как-то криво ...
Например, OnDataControllerRecordChanged, OnDataControllerDataChanged.

Эти два события срабатывают позже onBeforePost. Так что для вашего случая они почти равносильны onBeforePost.

Цитата:
Было бы логичнее не ждать Post, а сразу при изменении значения в ячейке, пересчитывать и изменять значение в соседней ячейке. ... Что посоветуете?

В таком случае могу посоветовать вам обрабатывать событие OnEditKeyDown.
Автор: Cryogen2003
Дата сообщения: 07.12.2009 08:03
X11
Этот способ я у них в исходниках раскопал еще в пятницу, но не устроил он. Пользаки хотят выделять несколько ячеек, например с ИД клиента. Просто привыкли к таким вещам в EhLib, а сейчас они этого не видят.
А так, весь свой основной проект перевел на девок и полностью убрал EhLib. Цель достигнута, весь проект выглядит как более-менее одно целое с общим дизайном, а не как было раньше - в одних формах EhLib, в другим RX, в следующих TMS, и еще где-то Jedi
В свое время писало слишком много людей данный проект, вот и писали все как им угодно.

Теперь в принципе хотелось бы что-бы по поводу выделения Ctrl в режиме CellMultiSelect данный режим работал в следующей версии, да в принципе и хотелось бы понять, как можно выделять столбцы со всем их содержимым для последующего копирования в буфер обмена. Написал что-то на скорую руку, но реализация меня не совсем устраивает
Если кого интересует, то могу выложить код и вместе подумаем.
Автор: X11
Дата сообщения: 07.12.2009 10:38

Цитата:
хотелось бы понять, как можно выделять столбцы со всем их содержимым для последующего копирования в буфер обмена

Ты имеешь ввиду все записи? Ctrl+A, Datacontroller.SelectAll
По крайней мере, когда нажимаешь Ctrl+A, то у девок, в отличие от Eh выделяются записи корректно.

А если ещё включить PullFocusing в группе настроек OptionBehavior?
Автор: Cryogen2003
Дата сообщения: 07.12.2009 11:01
X11
Неее, интересует именно, чтобы выделить содержимое несколько столбцов.

Накатал миничасть для этого, но не совсем устроило.

Код:
Procedure TfrmRegistry.dbgRegistryBandedTableView1ColumnHeaderClick
(Sender: TcxGridTableView; AColumn: TcxGridColumn);
Var
Column: TcxGridDBBandedColumn;
Begin
If Not CtrlPressed Then
Begin
fFieldNeedSort := (AColumn As TcxGridDBBandedColumn).DataBinding.FieldName;
acSort.Execute;
End
Else
Begin
Column := (AColumn As TcxGridDBBandedColumn);
Column.Selected := Not Column.Selected;

dbgRegistryBandedTableView1.DataController.BeginUpdate;
Try
dbgRegistryBandedTableView1.DataController.ClearSelection;
dbgRegistryBandedTableView1.DataController.SelectRows(Number0,
Pred(dbgRegistryBandedTableView1.DataController.GetRowCount));
Finally
dbgRegistryBandedTableView1.DataController.EndUpdate;
End;

CtrlPressed := False;
End;
End;
Автор: X11
Дата сообщения: 07.12.2009 11:30

Цитата:
PullFocusing - это что такое? Впервые слышу

Это свойство позволяет выделять записи мышкой. Тянешь мышкой - записи выделяются
Автор: AlexMoor
Дата сообщения: 07.12.2009 11:44
Уважаемые гуру!
Есть маленький вопрос по dxStatusBar.
Для стандартного StatusBar'а для определения панели, в которой произведен клик (левый, правый, без разницы) или для вычисления над какой панелью находится мышь использовал приблизительно такой код (естественно с вариациями для обоих случаев):

Код:
var
PanelRect : TRect;
MousePos : TPoint;
begin
MousePos := StatusBar.ScreenToClient(Mouse.CursorPos);
SendMessage(StatusBar.Handle, SB_GETRECT, Индекс_панели, Integer(@PanelRect));
if PtInRect(PanelRect, MousePos) then...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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