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

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

Автор: IronMan182
Дата сообщения: 21.12.2011 15:23
А не подскажите как сделать а-ля phpAdmin
Удалить , Добавить , Изменить , рядом с каждой записью ???

Автор: dimm78
Дата сообщения: 21.12.2011 16:22

Цитата:
А не подскажите как сделать а-ля phpAdmin
Удалить , Добавить , Изменить , рядом с каждой записью ???


если имеется в виду TcxGridView, то как вариант можно создать колонку с Properies TcxButtonEdit, настроить количество и отображение кнопок (Options.ShowEditButtons := isebAlways; Properties.ViewStyle := vsButtonsOnly), ну и соответственно обработчики событий
Автор: andreybear
Дата сообщения: 22.12.2011 06:17
Подскажите, как узнать координаты произвольного band'a в BandedTableView?
Автор: marser
Дата сообщения: 22.12.2011 08:29
andreybear

Цитата:
Подскажите, как узнать координаты произвольного band'a в BandedTableView?


Код: cxGrid1BandedTableView1.ViewInfo.HeaderViewInfo.BandsViewInfo.Items[I].Bounds
Автор: andreybear
Дата сообщения: 23.12.2011 02:52
marser

Спасибо за подсказку - координаты получил.
Однако все равно не могу сообразить, как инициировать перетаскивание band'a с помощью кода и вообще, какое событие происходит при "перетаскивании". Несколько дней уже убил на это.
Автор: marser
Дата сообщения: 23.12.2011 05:49
andreybear

Цитата:
как инициировать перетаскивание band'a с помощью кода


Код: with cxGrid1BandedTableView1.Bands[I].Position do
begin
BandIndex := ???;
ColIndex := ???;
end
Автор: andreybear
Дата сообщения: 23.12.2011 06:24

Цитата:
cxGrid1BandedTableView1.OnBandPosChanged


Насколько я знаю, это событие наступает при смене позиции, т.е., например, когда пользователь отпускает бэнд в определенной позиции.


Цитата:
with cxGrid1BandedTableView1.Bands[I].Position do
begin
BandIndex := ???;
ColIndex := ???;
end


Во время перестакивания ничего не изменяется. Мне как раз и нужно, чтоб при
procedure TForm1.ViewBandDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
if State = dsDragEnter then
// создается бэнд
// в позиции мыши инициируется его перетаскивание (будто пользователь захватил мышью существующий бэнд и начал его перемещать не отпуская левой кнопки)

Даже не представляю, как это можно сделать (начать перетаскивание). Такое впечатление, что при перетаскивании band'a не возникает события ViewBand.onDragOver.
Автор: andreybear
Дата сообщения: 23.12.2011 08:51
marser


Цитата:
cxGrid1BandedTableView1.Controller.StartDragAndDrop(P: TPoint)


Пробовал - не работает.


Цитата:
Только зачем? Зная X, Y и зная Bounds уже существующих бэндов, можно вычислить BandIndex и ColIndex для нового бэнда.


Пользователь сам решает, куда поместить бэнд (создается сложная шапка таблицы из существующего набора объектов, их показателей и единиц измерения).


Цитата:
В StartDragAndDrop(P: TPoint) точка Р должна принадлежать созданному бэнду, а не X, У из события.


Насколько я понял, перетаскиваются не сами бэнды (band), а их заголовки (bandheader), поэтому координаты получаю так:

Код: band := View.Bands.Add;
band.Index := 0;
headerViewInfo := View.ViewInfo.HeaderViewInfo.BandsViewInfo.Items[band.Index].HeaderViewInfo;
rect := headerViewInfo.Bounds;
p.X := rect.Right - Round((rect.Right - rect.Left)/2);
p.Y := rect.Bottom - Round((rect.Bottom - rect.Top)/2);
Автор: andreybear
Дата сообщения: 26.12.2011 06:03
Кто-нибудь знает, какое событие генерируется при перетаскивании band'a (в начале этого процесса)?
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 12:03
Господа, как скрыть определенное значение в гриде ? есть поле даты и при определенных значениях ету дату надо скрыть , к примеру если дата равна 01.01.1800 пользователь не должен ее видеть.

Добавлено:
Да и желательно чтобы ето можно было сделать в цикле, прогнал поля, сравнил и скрыл
Автор: dimm78
Дата сообщения: 26.12.2011 12:33

Цитата:
Господа, как скрыть определенное значение в гриде ? есть поле даты и при определенных значениях ету дату надо скрыть , к примеру если дата равна 01.01.1800 пользователь не должен ее видеть.


Как вариант можно обрабатывать событие OnCustomDrawCell. Кроме того, если используется TFIBDataSet можно обработать событие OnGetText у колонки (есть ли такое событие у датасетов других производителей сказать не могу)
Автор: X11
Дата сообщения: 26.12.2011 13:08

Цитата:
(есть ли такое событие у датасетов других производителей сказать не могу)

это стандартное событие любого TDataSet
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 13:27
dimm78 я через
Цитата:
OnCustomDrawCell
и делал
if (AViewInfo->GridRecord->Values[23]==StrToDate("01.01.1800"))V_AboDATA_VKL->Styles->Content=cxStyle1;
У меня несколько столбцов, хотелось бы в цыкле как - то прогнать

Автор: andreybear
Дата сообщения: 26.12.2011 14:10
В параметре AViewInfo содержится вся необходимая информация, в том числе и о столбцах (AViewInfo.Item). Дополнительно организовывать цикл не нужно - "прорисовываются" все ячейки таблицы.

Код: if AViewInfo.Item.Index in [2,4,6,9] then
    // ...
// или
if AViewInfo.Item.Tag = 5 then
    // ...
// или
if AnsiCompareStr(AViewInfo.Item.Caption, 'Колонка1') = 0 then
// ...
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 14:21
andreybear
а как скрыть значение только конкретной ячейки , я то используя ACanvas - я скрываю всю строку

Цитата:
if AViewInfo.Item.Index in [2,4,6,9] then
// ...
// или
if AViewInfo.Item.Tag = 5 then
// ...
// или
if AnsiCompareStr(AViewInfo.Item.Caption, 'Колонка1') = 0 then
// ...

[2,4,6,9] - ето если я правильно понял № колонок?

Добавлено:

Цитата:
if AnsiCompareStr(AViewInfo.Item.Caption, 'Колонка1') = 0 then

мне надо сравнивать не заглавие колонки а ее значение
Автор: Cryogen2003
Дата сообщения: 26.12.2011 14:32
MagistrAnatol
TableView.DataController.Values[RecordIndex, ColumnIndex]
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 14:45
Cryogen2003
и что мне ето даст - прогнать все строки таблицы- прикольное быстродействие будет
Автор: Cryogen2003
Дата сообщения: 26.12.2011 14:53
MagistrAnatol
У тебя есть номер столбца, есть номер записи. Раз у тебя все это есть, получаешь значение. анализируешь.

а так же у тебя есть OnGetDisplayText, им и выводишь то, что хочешь.

[more=пример]
Procedure TfrmRegistry_Frame.dbgDepartureDBTableView1Column1GetDisplayText
(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
Var AText: String);
Var
Temp1: String;
Temp2: String;
Begin
AText := EmptyStr;
Temp1 := QuickTrim(VarToString(ARecord.Values[Number0]));
Temp2 := QuickTrim(VarToString(ARecord.Values[Number1]));
If IsNotClearText(Temp1) Then
Begin
AddWord(AText, Temp1, SemiColonCharWithSpace);
If IsNotClearText(Temp2) Then
AddWord(AText, Temp2, SemiColonCharWithSpace);
End
Else
If IsNotClearText(Temp2) Then
AddWord(AText, Temp2, SemiColonCharWithSpace);
End;
[/more]
Автор: andreybear
Дата сообщения: 26.12.2011 15:12

Цитата:
TableView.DataController.Values[RecordIndex, ColumnIndex]


Да, вешает напрочь в onCustomDrawCell.


Цитата:
OnGetDisplayText


Лучше будет.
Автор: Cryogen2003
Дата сообщения: 26.12.2011 15:15
andreybear
Где это вешает в OnCustonDrawCell? У меня именно так "раскрашивается" практически все гриды
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 15:17
Cryogen2003
моно и так пока более подходящего варианта никто не предложил, пасибо
И всетаки как выделить только одну ячейку цветом а не всю строку
if (AViewInfo->GridRecord->Values[13]==StrToDate("01.01.1800"))
ACanvas->Font->Color-clRed;
выделяет всю строку, а надо только одну ячейку с "01.01.1800"
Я поднял вопрос так как у меня 12 колонок с датой где может встречаться "01.01.1800", вот и попросил
подсказать как скрыть сразу все значения "01.01.1800", без перечисления колонок и проверки всех записей таблицы

Добавлено:

Цитата:
У меня именно так "раскрашивается" практически все гриды

моно примерчик

Цитата:
TableView.DataController.Values[RecordIndex, ColumnIndex]

ето в цикле проверяется вся таблица?? если записей пара сотен то не будет заметно, а вот уже при паре тысяч согласен с andreybear будут тормоза


Автор: X11
Дата сообщения: 26.12.2011 15:28

Цитата:
OnCustonDrawCell?


Быть может будет правильнее использовать OnGetContentStyle?

Тогда при печати и экспорте данные также будет выведены на принтер, как они видны в гриде. А если использовать OnCustonDrawCell, то при печати всё будет потеряно и данные на принтер уйдут в видимом формате - пользователю стоит распечатать таблицу, чтобы увидеть скрытый текст. А в OnGetContentStyle такой проблемы нет.

События похожи слегка. Вот пример



Код: procedure TfmScanner.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AStyle: TcxStyle);
begin
if (ARecord <> nil) and (AItem <> nil) then
begin
//если колонка видима и содержит текст
if (coPhoneBase.Visible) and (Length(VarToStr(ARecord.Values[coPhoneBase.Index])) > 0) then
AStyle := cxStyle14;

if (AItem.Name = 'colText') and
(not VarIsNull(ARecord.Values[colColorIndex.Index])) and
(ARecord.Values[colColorIndex.Index] <> -1)
then
begin
AStyle := cxStyle1;
AStyle.TextColor := ARecord.Values[colColorIndex.Index];
end;
end;
end;
Автор: andreybear
Дата сообщения: 26.12.2011 15:32
Cryogen2003

Цитата:
Где это вешает в OnCustonDrawCell? У меня именно так "раскрашивается" практически все гриды


Если начать присваивать значения через DataController, то вешает, а для раскраски норм.

X11

Цитата:
Тогда при печати и экспорте данные также будет выведены на принтер, как они видны в гриде. А если использовать OnCustonDrawCell, то при печати всё будет потеряно и данные на принтер уйдут в видимом формате - пользователю стоит распечатать таблицу, чтобы увидеть скрытый текст.


Это точно. Даже при редактировании ячейки данные становятся видны.

Цитата:
OnGetContentStyle

Не пробовал. Думаю, вы правы.
Автор: Cryogen2003
Дата сообщения: 26.12.2011 15:34
X11
точно, можно и так )))) просто все к стилям не привыкну никак, и из-за это "крашу" по старинке.

MagistrAnatol
ну если надо красить только одну ячейку, то и проверяй какой именно столбец краситься в текущий момент.

В приведенном примере X11:
(AItem.Name = 'colText') - как раз смотрится название столбца, которое надо раскрасить
ARecord.Values[colColorIndex.Index] - это смотрится как раз значение по этому полю, которое нужно анализировать
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 15:43
X11
красится вся строка, а мне надо только одна колонка




Добавлено:
Cryogen2003
X11
понял, не досмотрел код
универсального кода не получиться , шоб одной строкой и сразу все
идеально подошел вариант

Код: [no]
void __fastcall TfrmMain::V_AboPROEKT_DATAGetDisplayText(TcxCustomGridTableItem *Sender,
         TcxCustomGridRecord *ARecord, UnicodeString &AText)

{
if (AText=="01.01.1800")AText="";

}
[/no]
Автор: X11
Дата сообщения: 26.12.2011 15:48

Цитата:
X11
красится вся строка, а мне надо только одна колонка


Ну если покумекать немного....


Код: if AItem.Index = TcxGridDBTableView(Sender).GetColumnByFieldName('MEDIATOR_ID_TYPE').Index then
if not VarIsNull(ARecord.Values[TcxGridDBTableView(Sender).GetColumnByFieldName('MEDIATOR_ID_TYPE').Index]) then
begin
if not Assigned(AStyle) then
AStyle := TcxStyle.Create(Sender);

AStyle.TextColor := GetColorByTypeId(ARecord.Values[TcxGridDBTableView(Sender).GetColumnByFieldName('MEDIATOR_ID_TYPE').Index]);
end;
Автор: andreybear
Дата сообщения: 26.12.2011 15:53
Кто-нибудь подскажите про перетаскивание бэндов - так и не осилил! ((
Автор: MagistrAnatol
Дата сообщения: 26.12.2011 15:55
X11

Цитата:
Ну если покумекать немного....


опять же идет привязка или к имени колонки или ее индексу, я же хотел универсальный метод , но да ладно не будем развивать етот вопрос далее
Всем спасибо за помощь
Автор: Cryogen2003
Дата сообщения: 26.12.2011 16:07
MagistrAnatol
Ну тогда конкретно и проверяй ячейку. у тебя вызывается отрисовщик для каждой ячейки и так всегда. Просто смотри на тип отрисовываемого поля, а если это нужный тип, то тогда проверяй уже по нему значение. Немного притормаживать будет конечно у пользователей, но только если сразу на экране очень много столбцов и строк (видимых). Если немного, то будет работать очень быстро
Автор: X11
Дата сообщения: 26.12.2011 16:09

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


Не понятно...
То Вы хотите красить КОНРЕТНУЮ колонку, а теперь хотите универсальный метод...

Я бы вообще использовал OnGetText, как Вы раньше решили:
if (AText=="01.01.1800")AText="";

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


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