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

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

Автор: Chukotka
Дата сообщения: 05.10.2009 06:04
Есть код:

Код:
var
Gr: TcxGrid;
Tr: TcxTreeList;
begin
Gr.ScrollContent(dirUp); // НЕ работает
Tr.ScrollContent(dirUp); // работает
end;
Автор: f3ka
Дата сообщения: 05.10.2009 07:57
Chukotka
думаю что проблема в том что данные привязаны к TableView а не к Grid'y.
предлагаю так

Код: <YourTcxCustomGridView>.Controller.Scroll(sbVertical, scLineDown, ScrollBy);
Автор: X11
Дата сообщения: 05.10.2009 10:32
Господа, опять возвращаюсь к AppendRecord, если вы не против.
Проблема в том, что записи в базу физически не попадают.
Связка Fib 6.9.6, cxGrid x43, Firebird 2, D2007.

У FibDataSet установлено свойство AutoCommit в True.


Код:
with dbgIdSpr.dataController do
begin
beginupdate;
dbgSyncSPR.datacontroller.beginupdate;
Screen.Cursor := crHourGlass;
try
ForEachRow(false, FillFromSpr);

finally
endupdate;
dbgSyncSPR.datacontroller.endupdate;
Screen.Cursor := crDefault;
dxStatusBar1.Panels[1].Text := 'ОК';
Application.ProcessMessages;
end;//try
end;//with


procedure TfmMlsOptions.FillFromSpr(ARowIndex: Integer; ARowInfo: TcxRowInfo);
Var
RecIndex: integer;

begin
with dbgIdSpr.DataController do
begin
if ARowInfo.Level = Groups.GroupingItemCount then
begin

with tSprs do
try
SQLs.SelectSQL.Text := 'select id, name from ' + Values[ARowInfo.RecordIndex, dbgIdSprNAME.Index];
Open;

First;
while not Eof do
begin
dbgSyncSpr.DataController.AppendRecord;
RecIndex := dbgSyncSpr.DataController.RecordCount - 1;

dbgSyncSpr.DataController.Values[RecIndex, dbgSyncSprID_SPR.Index] := Values[ARowInfo.RecordIndex, dbgIdSprID.Index];
dbgSyncSpr.DataController.Values[RecIndex, dbgSyncSprID_IN_KVX.Index] := FBN('ID').AsInteger;
dbgSyncSpr.DataController.Values[RecIndex, dbgSyncSprVALUE_IN_KVX.Index] := FBN('name').AsString;

dxStatusBar1.panels[0].Text := FBN('name').AsString;
Application.ProcessMessages;
next;
end;//while
finally
Close;
end;//try-finally
end;//if
end;//with
end;
Автор: volser
Дата сообщения: 05.10.2009 10:39
X11
Данные нужно менять в датасете, а не в гриде.
Автор: f3ka
Дата сообщения: 05.10.2009 10:40
X11
что то мне подсказывает что надо вызывать у DataController'a метод Post... возможно с параметром True...
З.Ы. а лучше данные в датасет пихать
Автор: X11
Дата сообщения: 05.10.2009 10:45
volser, я знаю, но хочу добавлять именно с помощью грида. Я уже писал об этом на 80-81 стр.

Добавлено:
f3ka, добавил dbgSyncSpr.DataController.post; проблема не исчезла.
Автор: Cryogen2003
Дата сообщения: 05.10.2009 10:59
Добрый день всем. Хоть это недавно обсуждалось, но у меня есть некоторые глюки, с которыми не могу разобраться. Проблем с раскраской в гриде.
Код:

Код:
Procedure TfrmSelAgree.dbgAgreementsDBTableView1CustomDrawCell
(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; Var ADone: Boolean);
Begin
If AViewInfo.GridRecord.Focused Then
ACanvas.Brush.Color := clHighlight
Else
If AViewInfo.Focused Then
ACanvas.Brush.Color := clHighlight
Else
If VarToInt(odsAgreements.FieldValues['agreetype']) = 1 Then
ACanvas.Brush.Color := clInfoBk
Else
ACanvas.Brush.Color := clWhite;
End;
Автор: vladman
Дата сообщения: 05.10.2009 10:59
X11

Цитата:
На что мне ещё обратить внимание? Что я забыл?


Цитата:
но хочу добавлять именно с помощью грида

В хелпе же написано, что в случае если данные для датаконтроллера поддаются с датасета - нужно использовать вместо AppendRecord метод Append. А метод Append нельзя вызывать в внутри BeginUpdate/EndUpdate и BeginFullUpdate/EndFullUpdate блоков.
Попробуйте убрать BeginUpdate/EndUpdate.
Автор: X11
Дата сообщения: 05.10.2009 11:09

Цитата:
В хелпе же написано, что в случае если данные для датаконтроллера поддаются с датасета - нужно использовать вместо AppendRecord метод Append.

In provider and unbound modes, you can use the AppendRecord method to add a new record. AppendRecord retrieves the record index that can be used to access its field values via the Values property. The record added by AppendRecord does not require posting. Also such a record cannot be discarded by calling the Cancel method.

The record added by AppendRecord does not require posting

Получается, что post не нужно вызывать

ms-help://borland.bds5/ExpressDataController.BDS5/ExpressDataController/IDH_TcxCustomDataController_Append.htm

Автор: vladman
Дата сообщения: 05.10.2009 11:17
X11

Цитата:
Получается, что post не нужно вызывать

Но у вас же DataController находится и не в provider и не в unbound. У вас
Bound mode - The DataController is connected to a TDataSet by means of a TDataSource object.
Подробнее: ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_cd_Data_Loading_Modes.htm
Автор: X11
Дата сообщения: 05.10.2009 11:28

Цитата:
Данные нужно менять в датасете, а не в гриде.

Я пробовал, если данные добавлять через датасет, то записи добавляются также медленно, как и через грид.
Вот начало дискуссии на 80й странице
http://forum.ru-board.com/topic.cgi?forum=33&topic=10123&start=1580#13

Добавлено:

Цитата:
Но у вас же DataController находится и не в provider и не в unbound

я думал, что provider-mode это когда грид привязан к датасету

Добавлено:
Получается, что в режиме BOUND нельзя добавлять записи в цикле через cxGrid?

Добавлено:
Ну что, ж нельзя так нельзя. Переделал на работу непосредственно с датасетом, с использованием DisableControls
Автор: Chukotka
Дата сообщения: 05.10.2009 11:50
f3ka

Цитата:
думаю что проблема в том что данные привязаны к TableView а не к Grid'y.
предлагаю так

Код:
<YourTcxCustomGridView>.Controller.Scroll(sbVertical, scLineDown, ScrollBy);

ScrollBy - переменная типа Integer
Спасибо большое, все работает.

Автор: Cryogen2003
Дата сообщения: 05.10.2009 13:14
Итак, что-то я совсем запутался как работает OnCustomDrawCell в TcxGridDBTableView. Как точно знать, где находиться RecNo датасета, который привязан к этому TableView?
Просто TableView.DataController.GetFocusedRecordIndex (это показывает, в какой строке стоит фокус) или TableView.DataController.DataSource.DataSet.RecNo не проходит. Стало быть что делать?
Автор: volser
Дата сообщения: 05.10.2009 14:29
Cryogen2003
Для раскраски грида данные нужно брать с самого грида, а не с датасета. Потому что при раскраске, курсор не позиционируется в нужную позицию.
Автор: Cryogen2003
Дата сообщения: 05.10.2009 14:32
volser
ок, и как это сделать? Есть у него какой-нибудь виртуальный датасет или что-то подобное?


Добавлено:
volser
Это делается вот так?

Код:
Sender.DataController.Values[AViewInfo.GridRecord.Index, MyColumnIndex]
Автор: vladman
Дата сообщения: 05.10.2009 14:41
Cryogen2003

Цитата:
ок, и как это сделать? Есть у него какой-нибудь виртуальный датасет или что-то подобное?

Используйте параметр AViewInfo: TcxGridTableDataCellViewInfo.
Он знает все о том какая конкретно ячейка/строка/столбец обрабатывается, ее состояние - фокусед/селектед, значение в это ячейке и т.д.
ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_Class_TcxGridTableDataCellViewInfo.htm
Автор: Cryogen2003
Дата сообщения: 05.10.2009 14:44
vladman
Ну то есть как я написал в примере, как я понимаю.

P.S.: Все-таки жалко, что стандартные подходы, которые были по EhLib и Borland VCL, не проходят
Автор: vladman
Дата сообщения: 05.10.2009 14:51
Cryogen2003

Цитата:
Ну то есть как я написал в примере, как я понимаю.

Да, именно так как вы написали.

Цитата:
что стандартные подходы, которые были по EhLib и Borland VCL, не проходят

А как вы себе представляете эти стандартные подходы при перерисовке каждой ячейки, причем если эта перерисовка происходит очень часто (иногда даже когда указатель мыши отрисовывается над ячейкой). Что, каждый раз менять фокус в DataSet, например, чтобы знать значение какого-то поля? Так это было бы не просто долго, а вообще неработоспособно.
Автор: Cryogen2003
Дата сообщения: 05.10.2009 14:56
vladman
Ну в том же EhLib и Borland VCL это же работает. Да, благодаря девкам получаешь более высокий функционал, до которому EhLib как до Луны. Но все же, хочется иметь возможность совместимости или даже так - "совместимость по запросу".
Автор: vladman
Дата сообщения: 05.10.2009 15:24
Cryogen2003
Все дело как раз в этом "высоком функционале".
Автор: Cryogen2003
Дата сообщения: 05.10.2009 15:46
vladman
ну не спорю, хотя "совместимость по запросу" еще никто не отменял.
Автор: Glukodel
Дата сообщения: 05.10.2009 18:21
Бесплатное расширение DevExpress (доработанные lookup'ы)
, для решения проблем, рассмотренных ранее на форуме
здесь, здесь,
и здесь .
Из 2-х компонентов 2-й заточен чисто под Oracle, но позволяет не загружать весь справочник для работы лукапа, что крайне позитивно влияет на скорость работы
Автор: AlexPetrovich
Дата сообщения: 06.10.2009 09:31
Glukodel
Спсб!
Для себя делал подобное прямо в коде, но компонентиком более красивое решение. Очень часто бывает нужно.
Автор: JohnSilver182
Дата сообщения: 06.10.2009 09:55

Цитата:

Если для одного столбца - используйте MaskEdit в качестве EditProperty с соответствующей маской

Я сделал ... MaskEdit->EditMask=!99/99/00;1;_ и не помогла


Добавлено:

Цитата:
событие OnCustomDrawCell используя процедуру TcxCanvas.DrawText(const Text: string; R: TRect; Flags: Integer; Enabled: Boolean = True);


Там Trec .... МАМА МИА !!!!
AViewInfo.*****Bounds;
Автор: Cryogen2003
Дата сообщения: 06.10.2009 13:26
Итак, появилась мини новая проблема, чего-то совсем запутался. Если не включать OptionData->Editing, то при копировании в буфер обмена почему-то копируется вся строчка, если включать Editing, то выбирается ячейка и копируется в буфер обмена только эта ячейка, но не срабатывает DblClick. Стало быть, что делать? Нужно копировать только одну ячейку по запросу и чтоб была возможность поймать DblClick.
Автор: afiget
Дата сообщения: 06.10.2009 14:38
Хочу немного поофтопить.
Думаю, все со мной согласятся, что vladman в этой ветке делает большую работу. За это ему большое спасибо.
Автор: ant0ni02004
Дата сообщения: 06.10.2009 14:41
Cryogen2003

за это по идее rowSelect отвечает
Автор: Cryogen2003
Дата сообщения: 06.10.2009 14:45
ant0ni02004
В обычном ДБГриде да, в ДБГриде от EhLib да, а где он находиться в ДБГриде от девок?
Автор: vladman
Дата сообщения: 06.10.2009 17:14
JohnSilver182

Цитата:
Я сделал ... MaskEdit->EditMask=!99/99/00;1;_ и не помогла

Попробуйте обработать событие OnGetDataText
procedure <YourForm>.<YourcxGridDBTableViewDateColumn>GetDataText(Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
AText := FormatDateTime('dd/mm/yy', StrToDate(AText));
end;

Добавлено:
JohnSilver182
Маску нужно убрать

Добавлено:
Cryogen2003

Цитата:
Нужно копировать только одну ячейку по запросу и чтоб была возможность поймать DblClick.

Установите свойство <YourcxGridDBTableView>.OptionsBehavior.ImmediateEditor = True;

Добавлено:
afiget

Цитата:
Хочу немного поофтопить.

Вам спасибо на добром слове.
Автор: Cryogen2003
Дата сообщения: 06.10.2009 17:54
vladman
Поставил, все равно не фурычит. Сразу сваливается в редактирование поля и не ловиться DblClick при этом.

P.S.: Кстати присоединяюсь к afiget - большое спасибо, что Вы нам всегда помогаете.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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