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

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

Автор: greenpc
Дата сообщения: 02.04.2009 10:27
Postscriptum
AViewInfo.GridRecord.Index
но это индексы грида. и это также будет не верное решение
У Вас база с ID'шниками ? Если да то добавьте поле в грид
и проверяйте по нему ID такой удален или нет
Автор: vladman
Дата сообщения: 02.04.2009 10:58
Postscriptum

Цитата:
if AdsTable1.AdsIsRecordDeleted(AViewInfo.GridRecord.ViewInfo.Index+1)

Если я правильно понял, то в качестве аргумента для AdsIsRecordDeleted нужно указывать индекс записи в таблице.
Уверен, что зная значение первичного ключа (ID) записи, есть возможность узнать и индекс этой записи.
Поэтому
AViewInfo.GridRecord.ViewInfo.Index+1 заменяем на что-то похожее на
<GetRecordIndexByRecordID>(Sender.DataController.Values[AViewInfo.GridRecord.Index, <YourGridTVYourIdColumn.Index]
Автор: Postscriptum
Дата сообщения: 02.04.2009 14:22
greenpc
vladman
Дело втом, что ипользую грид в программе редактор dbf, т.е. открываются любые dbf-ки и у них не обязательно есть индекыи индексные поля. Аргументом для AdsIsRecordDeleted должен быть не индекс, а номер записи (Retrieves the current record number). Я так понимаю, проблема именно в этом - как узнать номер записи из AViewInfo
Автор: vladman
Дата сообщения: 02.04.2009 15:49
Postscriptum
AViewInfo.GridRecord.RecordIndex либо AViewInfo.GridRecord.Index

Различия см. ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_Class_TcxCustomGridRecord.htm
Автор: greenpc
Дата сообщения: 02.04.2009 15:50
Postscriptum
Еще раз повторяю пробуй AViewInfo.GridRecord.Index

Цитата:
AdsIsRecordDeleted должен быть не индекс, а номер записи (Retrieves the current record number).

Номер записи реально получить ? думаю -да
в Вашей таблице AdsTable1 добавить поле где будет этот номер реально сделать?
если не хотите привязываться к номеру записи сделайте автоинкрементальное поле и работайте с ним.
PS: 4 раз говорю одно и тоже
PSS Вы уж определитесь какая грида Вам нужна

Автор: Postscriptum
Дата сообщения: 02.04.2009 16:06
greenpc

Цитата:
в Вашей таблице AdsTable1 добавить поле где будет этот номер реально сделать?
если не хотите привязываться к номеру записи сделайте автоинкрементальное поле и работайте с ним.

Я тоже повторюсь - это прога dbf-редактор. Я не могу просто так взять и добавить в чужую базу поле только лишь для того, чтоб мне было удобно. (Вернее, могу делать это при открытии базы, заполнять это поле автоинкрементным значением, а при закрытии удалять это поле. А Вы представляете, какова будет скорость открытия и закрытия больших файлов? Да и не неправильно это).
AViewInfo.GridRecord.Index вроде получилось, по крайней мере при скроллинге и перемещении курсора подсветка остается на месте. При удалении записи подсветка сразу ставится. Остался лишь косяк с тем, что при повторном удалении подсветка не убирается (а должна)
С гридом определяюсь. В Девках по сравнению с EHLib на порядок больше возможностей. Просто я не думал, что такая простая операция, как подсветка удаленных записей вызовет такие танцы с бубном. В EHLib это на порядок проще и понятнее реализуется (код я приводил).
P.S. В EHLib, кстати, чтоб обрабатывался CustomDrawCell y грида нужно свойство DefaultDrawing:=false. А в Девках ничего подобного не надо?
P.P.S. У Девок в OnCustomDrawCell есть ADone. Что это и надо ли его использовать?
Автор: vladman
Дата сообщения: 02.04.2009 17:55
Postscriptum

Цитата:
У Девок в OnCustomDrawCell есть ADone. Что это и надо ли его использовать?

Нужно хелп почитывать
ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_TcxCustomGridTableView_OnCustomDrawCell.htm

Цитата:
Я не могу просто так взять и добавить в чужую базу поле только лишь для того, чтоб мне было удобно

Так никто и не заставляет. Вставлять нужно не в AdsTable1, а в DataController TableView.
Как ваш AdsTable1 определяет уникальность той или иной записи. Без уникальности (Первичного ключа) вы не сможете редактировать, удалять записи. Насколько я помню, в dbf есть специальное поле, которое создается автоматически и отвечает за уникальность. Вот его и возьмите с AdsTable1 и поместите в грид. Visible и VisibleForCustomization этому полю можно сделать false.
Вот по этому значению и определяйте индекс записи.

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

Таблица умножения тоже кажется танцами с еще теми бубнами когда видишь ее первый раз и не пытаешься понять как это работает.
Автор: Postscriptum
Дата сообщения: 03.04.2009 01:23

Цитата:
Как ваш AdsTable1 определяет уникальность той или иной записи. Без уникальности (Первичного ключа) вы не сможете редактировать, удалять записи. Насколько я помню, в dbf есть специальное поле, которое создается автоматически и отвечает за уникальность.

Нет в dbf такого специального поля. Первичный ключ может быть, а может и не быть. Поля autoincrement в dbf тоже нет. И без униального ключа прекрасно редактируются, удаляются и добавляются записи.

Цитата:
Таблица умножения тоже кажется танцами с еще теми бубнами когда видишь ее первый раз и не пытаешься понять как это работает.

Согласен. Но, согласитесь, таблицу умножения (EHLib) выучить и понять гораздо проще, чем таблицы Брагиса (Девки)
Автор: greenpc
Дата сообщения: 03.04.2009 07:32
Postscriptum

Цитата:
Я не могу просто так взять и добавить в чужую базу поле

извините погорячился vladman меня поправил
добавить поле в гриду
Цитата:
DataController TableView.

хотя думаю Вам хватит индекса грида

Цитата:
Остался лишь косяк с тем, что при повторном удалении подсветка не убирается (а должна)

как это - повторное удаление ?
Автор: Postscriptum
Дата сообщения: 03.04.2009 08:37
greenpc

Цитата:
как это - повторное удаление ?

Ну вот так - в dbf-файлах записи из базы фактически не удаляюстя, они толко помечаются на удаление. В любом датасете, который работает с dbf-файлами можно настроить - показывать такие удаленные записи или нет. Т.е. если НЕ показывать, то для пользователя визуально происходит удаление записи, но на самом деле она в базе остается. Для того, чтобы физически удалить такие записи из dbf-файла используется процедура упаковки таблицы. А вот если настроено, чтоб показывать удаленные записи, то визуально в гриде запись при удалении как была, так и остается, вот я и подсвечиваю их красным, чтоб видно было. Но самое интересное, если такую "удаленную" запись еще раз удалить т.е. нажать в гриде Del или Ctrl+Del - ее мона восстановить - такой простенький undo/redo
Вот как-то так.
Теперь что у меня получилось: после
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
OldC: TColor;
begin
if AdsTable1.Active then
begin
oldc:=ACanvas.Canvas.Brush.Color;
aa:= AViewInfo.GridRecord.RecordIndex+1;
if AdsTable1.AdsIsRecordDeleted(aa) then
ACanvas.Canvas.Brush.Color := clRed
else
ACanvas.Canvas.Brush.Color:=oldc;
end;
у меня удаленные записи подсвечиваются. Все замечательно. Если не неподсвеченной (неудаленной) записи нажать дел, она удаляется (сразу подсвечивается красным), а вот если повторно нажать Delete, подсветка не убирается (это я протупил, надо же обработать этот и восстановить запись). Для этого сделал следующее - у Table-компонента в событии AfterDelete прописал:
if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) //проверил - типа удалена запись?
then
begin
AdsTable1.AdsRecallREcord; // Это и есть восстановление записи
AdsTable1.AdsRefreshRecord; //Обновил запись
end;

После этого стало наоборот - если нажать Del на подсвеченной (удаленной) записи - она восстанавливается (подсветка убирается), а вот если попытаться удалить запись - она не удаляется, не пойму, в чем косяк.
Автор: greenpc
Дата сообщения: 03.04.2009 09:08
Postscriptum

Цитата:
а вот если попытаться удалить запись - она не удаляется, не пойму, в чем косяк
событие какое ???
Цитата:
AfterDelete

вы удалили запись, дальше
Цитата:
if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum)
убедились что она удалена
и Восстановили ее .

вориант:создайте глобальную переменную
на событие onBeforeDelete проверьте <перемен> :=AdsIsRecordDeleted
а на AfterDelete добавьте if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) and (<перемен>)
PS:Научитесь пользоваться точками остановки- очень облегчит жизнь
Автор: vladman
Дата сообщения: 03.04.2009 10:07
Postscriptum

Цитата:
Нет в dbf такого специального поля. Первичный ключ может быть, а может и не быть. Поля autoincrement в dbf тоже нет. И без униального ключа прекрасно редактируются, удаляются и добавляются записи.

Да не может в таблице существовать двух и более одинаковых записей. Уникальность обеспечивается первичным ключом. Первичный ключ может быть как простой, так и составной (состоять их нескольких полей). И у dbf этот первичный ключ обязан быть. Может он имеет какое-то другое название, но без него никак.
Например, есть таблица с двумя полями *Имя* и *Фамилия*. Вы вставили в эту таблицу две записи со значениями *Василий*, *Пупкин*. Теперь хотите одну из низ удалить. Скажите, как драйвер БД поймет какую из них вы собираетесь удалять если для него (драйвера) они абсолютно одинаковы? Уверен, что внутри есть какой-то неявный механизм идентификации этих записей. Вот его и используйте в раскрашиваниях.
Об этом как раз говорит
Цитата:
AdsTable1.AdsGetRecordNum
.
Автор: greenpc
Дата сообщения: 03.04.2009 10:15
vladman
Может в dbf файлах может не существовать ключей вообще
информация о структуре хранится в заголовке
и переход на нужную запись осуществляется смещение относительно начала файла
Автор: vladman
Дата сообщения: 03.04.2009 10:40
greenpc

Цитата:
Может

Ну может так может. Спорить не буду. Я с dbf сталкивался раз и совсем давно .
Автор: Postscriptum
Дата сообщения: 03.04.2009 17:59
greenpc

Цитата:
вориант:создайте глобальную переменную
на событие onBeforeDelete проверьте <перемен> :=AdsIsRecordDeleted
а на AfterDelete добавьте if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) and (<перемен>)

Умные люди думают одинаково. Так и сделал в итоге, а потом пост прочитал Теперь все прекрасно работает.

Цитата:
PS:Научитесь пользоваться точками остановки- очень облегчит жизнь

Зачем так зло? Точками останова (так они правильно называются) пользуюсь с 1990 года
Автор: Postscriptum
Дата сообщения: 04.04.2009 13:12
Очередной вопрос по гриду из Девок.
Подскажите, как правильно работать с выделенными строками? Например, мне нужно скопировать выделенные строки в файл. Делаю так:

book:=cxGrid1DBTableView1.Controller.SelectedRowCount;
if Book > 1 then
begin
for i := 1 to Book-1 do
begin
AdsTable1.RecNo:=cxGrid1DBTableView1.Controller.SelectedRows[i].RecordIndex;
тут необходимые действия
end;

Все вроде хорошо, но почему-то так не работает с последней строкой в выделении, а если сделать цикл for i := 1 to Book do - пишет ListIndex out of bounds.
Пришлось сделать после цикла
AdsTable1.Next;
тут опять необходимые действия
cxGrid1DBTableView1.Controller.ClearSelection;
Так работает, но меня смущает такой подход.
P.S. Встроенного в Delphi help'а у меня нет, только скачанный с стайта в chm-ках. Там вообще мизер написано.
Автор: vladman
Дата сообщения: 04.04.2009 14:22
Postscriptum

Цитата:
Очередной вопрос по гриду из Девок.

Во-первых,
for i := 1 to Book-1 do заменить на
for i := 0 to Book - 1 do

Во-вторых,
Проверить, как нумеруются AdsTable1.RecNo: c 1 или 0? RecordIndex - c 0.
Автор: Postscriptum
Дата сообщения: 04.04.2009 16:54
vladman
Точно!
Так заработало:

book:=cxGrid1DBTableView1.Controller.SelectedRowCount;
if Book > 1 then
begin
for 0 := 1 to Book-1 do
begin
AdsTable1.RecNo:=cxGrid1DBTableView1.Controller.SelectedRows[i].RecordIndex+1;
тут необходимые действия
end;
end;
Сенкс. Это самый оптимальный способ работать с выделением?
Автор: X11
Дата сообщения: 04.04.2009 18:01

Цитата:
Подскажите, как правильно работать с выделенными строками?

в прошлых темах уже это обсудили не раз, воспользуйтесь поиском
В шапке есть Первая и Вторая части, в них поищите. Уверен, что во второй части есть.
Автор: Kim006
Дата сообщения: 04.04.2009 20:37
Есть пару вопросов по гриду,
не люблю спрашивать но уже несколько дней не могу решить:

1. Как сделать следующее:

//это совсем не катит, может можно както по другому:
TcxGridTableView * AView = (TcxGridTableView *) cxGrid1->FocusedView;
for(int Clp=0;Clp < AView->ColumnCount;Clp++)
{
if((AView->Columns[Clp]->GetAlternateCaption()) == "_XXX_")
{
if(! AView->Items[Clp]->EditValue.IsNull())
Memo1->Lines->Add(AView->Items[Clp]->EditValue );
break;
}
}

т.е. получить индекс колонки в TableView зная ее заголовок "_XXX_";

---------------

2. В обработчике cxGrid1LayoutChanged узнать что запись была удалена
(не охото отслеживать колич записей в гриде) наверняка есть какая стандартная
фича типа ->DataController->IsEditing...

---------------
QuantumGrid 6, Borland C++ 6
Автор: Meister Floh
Дата сообщения: 04.04.2009 21:41
Kim006

По первому пункту почитай про вот это - cxGrid1DBTableView1->IndexOfItem()
Автор: Kim006
Дата сообщения: 05.04.2009 00:47
хм а где взять TableItem для IndexOfItem(), у cxGrid1TableView1 (НЕ cxGrid1DBTableView1) я не нашел ни GetColumnByFieldName ни FindItemByFieldName ?
Автор: vladman
Дата сообщения: 05.04.2009 01:27
Kim006

Цитата:
Как сделать следующее:... т.е. получить индекс колонки в TableView зная ее заголовок "_XXX_";

1. Каждая колонка (Item) - это отдельный объект - TcxGridColumn, так что можно получить индекс колонки немного по-другому: например, cxGrid1TableView1Column3->Index.
Если важно отталкиваться именно от заголовка колонки, то вместо AView->Columns[Clp]->GetAlternateCaption()
нужно использовать что-то вроде этого
for(int Clp=0;Clp < AView->ItemCount;Clp++)
if((AView->Items[i]->Caption) == "_XXX_")
{
vValue = cxGrid1TableView1->DataController->Values[cxGrid1TableView1->DataController->FocusedRecordIndex, cxGrid1TableView1->Items[i]->Index]);
if (! vValue == null)
Memo1->Lines->Add(vValue);
break;
}

2. См. обработчик OnAfterDelete у TcxCustomDataController
Автор: Kim006
Дата сообщения: 05.04.2009 11:46
меня не совсем правильно поняли:


Цитата:
1. Каждая колонка (Item) - это отдельный объект - TcxGridColumn, так что можно получить индекс колонки немного по-другому: например, cxGrid1TableView1Column3->Index.


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


Цитата:
Если важно отталкиваться именно от заголовка колонки, то вместо AView->Columns[Clp]->GetAlternateCaption() нужно использовать что-то вроде этого


Не в том суть, хоть от Tag это не принципиально, просто хочется убрать цикл и использовать какой нить стандартный класс грида, если конечно такой имеется, что я и хотел выяснить.
(типа что то вроде этого ->IndexOfItem(GetColumnByFieldName("XXXX")) только для TableView а не DBTableView)


Цитата:
2. См. обработчик OnAfterDelete у TcxCustomDataController


Как до него достучатся, изначально у меня на форме только cxGrid1 и все, без единого уровня и без таблиц. Софтина конектится к mySQL (юзаю libmysql.dll, в перспективе Pervasive) серваку забирает конфигурацию и ДИНАМИЧЕСКИ отстраивает все уровни, таблицы, колонки, вложеные редакторы в колонки, и заполняет все это (это уже реализовано и работает). т.е. мне изначально доступны толко обработчики событий cxGrid1 (или я неправ), я поэтому и спрашивал есть ли какой флаг типа ->DataController->IsEditing чтоб проверить была ли нажата кнопка "-" на навигационной панельке...
Автор: Meister Floh
Дата сообщения: 05.04.2009 14:05
Kim006

Цитата:
Не в том суть, хоть от Tag это не принципиально, просто хочется убрать цикл и использовать какой нить стандартный класс грида, если конечно такой имеется, что я и хотел выяснить.
(типа что то вроде этого ->IndexOfItem(GetColumnByFieldName("XXXX")) только для TableView а не DBTableView)

Вот поэтому я и обратил в свое время внимание на InfoPower и EhLib, хотя с другой стороны поиск по имени осуществляется тем же самым циклом, что и у тебя, так что ничего страшного по моему..

Цитата:
Как до него достучатся, изначально у меня на форме только cxGrid1 и все, без единого уровня и без таблиц. Софтина конектится к mySQL (юзаю libmysql.dll, в перспективе Pervasive) серваку забирает конфигурацию и ДИНАМИЧЕСКИ.....

Не буду утверждать, но помоему решение лежит в плосткости динамического добавления обработчиков событий. Например так как тут: ms-help://embarcadero.rs2009/delphivclwin32/Menus_TMenuItem_OnClick.html - это тема в справке для студии 2009.. Вкратце вот [more=пример]
Код: /*
This example demonstrates how to add and delete menu items
to a popup menu at runtime and assign an event handler to
the OnClick event. Place a TPopupMenu and three buttons on
the form named "AddButton", "EditButton", and
"DestroyButton" and add OnClick events to all three buttons.
Put the TPopupMenu in the PopupMenu property of the form.
Place the PopupMenuItemsClick procedure in the TForm1 type
declaration so that it can be used as the method call for
the menu item OnClick event.
*/
void __fastcall TForm1::AddButtonClick(TObject *Sender)
{
// The owner (PopupMenu1) will cleanup this menu item.
TMenuItem *NewItem = new TMenuItem(PopupMenu1); // create the new item
int index = PopupMenu1->Items->Count;
PopupMenu1->Items->Add(NewItem);// add it to the Popupmenu
NewItem->Caption = "Menu Item " + IntToStr(index);
NewItem->Tag = index;
NewItem->OnClick = PopupMenuItemsClick;// assign it an event handler
TNotifyEvent();
}

void __fastcall TForm1::PopupMenuItemsClick(TObject *Sender)
{
TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender);
if (ClickedItem)
{
switch (ClickedItem->Tag)
{
case 0:
{
ShowMessage("first item clicked");
break;
}
case 1:
{
ShowMessage("second item clicked");
break;
}
case 2:
{
ShowMessage("third item clicked");
break;
}
case 3:
{
ShowMessage("fourth item clicked");
break;
}
}
}
}

/*
To edit or destroy an item, grab its pointer via the Items
property.
*/
void __fastcall TForm1::EditButtonClick(TObject *Sender)
{
const int index = 1;
TMenuItem *ItemToEdit = PopupMenu->Items->Items[index];
ItemToEdit->Caption = "Changed Caption";
}

void __fastcall TForm1::DestroyButtonClick(TObject *Sender)
{
const int index = 2;
TMenuItem *ItemToDelete = PopupMenu->Items->Items[index];
delete ItemToDelete;
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
const int num_items = 4;
for (int index = 0; index < num_items; ++index)
{
// The owner (PopupMenu1) will cleanup this menu item.
TMenuItem *NewItem = new TMenuItem(PopupMenu1); // create the new item
PopupMenu1->Items->Add(NewItem);// add it to the Popupmenu
NewItem->Caption = "Menu Item " + IntToStr(index);
NewItem->Tag = index;
NewItem->OnClick = PopupMenuItemsClick;// assign it an event handler
TNotifyEvent();
}
}
Автор: xokc
Дата сообщения: 05.04.2009 14:37

Цитата:
у меня на форме только cxGrid1 и все, без единого уровня и без таблиц

Ну так и подключай обработчики On.. по мере ДИНАМИЧЕСКОГО создания
Цитата:
всех уровней, таблиц, колонок, вложенных редакторов в колонки

Кроме того, у Grid есть перечень всех View, в том числе ДИНАМИЧЕСКИ созданных. В любом случае постановка задачи "я хочу в дизайн-тайме получить доступ к чему-то, созданному в ран-тайме" ущербна.
Автор: vladman
Дата сообщения: 05.04.2009 17:33
Kim006

Цитата:
Это все конечно очень интересно, только изначально у меня нет ни одной колонки и ни одного уровня

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

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

Цитата:
использовать какой нить стандартный класс грида

Цитата:
типа что то вроде этого ->IndexOfItem(GetColumnByFieldName("XXXX")

А какие классы грида Вы считаете нестандартными? и гду Вы видите в выражении *IndexOfItem(GetColumnByFieldName("XXXX")* класс?
А по поводу

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

Meister Floh и xokc исчерпывающе написали.
Автор: Kim006
Дата сообщения: 05.04.2009 17:44

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

Задача ставилась четко, можно ли заменить мой самодельный цикл на что нибудь стандартное, и существует ли нужный флаг который я и собирался использовать, как я и написал в обработчике cxGrid1LayoutChanged.

Ладно, вопрос снят, придется и дальше использовать перебор колонок; с delete все понятно, впринципе динамическое прикручивание обработчика тоже сойдет (правда придется отключить либо отлавливать еще и Ctrl + Del), спасибо за примерчик Meister Floh.

Если кому интересно, вот что получилось:

#include <cxNavigator.hpp>

void __fastcall TForm1::NavigatorButtonsClick(TObject *Sender, int AButtonIndex, bool &ADone)
{
ADone=true; //отключает стандартную (внутреннию) обработку событий нажатия кнопок
// TcxCustomNavigatorButtons *Button = dynamic_cast<TcxCustomNavigatorButtons *>(Sender);

if(AButtonIndex)
{
AnsiString BtnName="";
switch (AButtonIndex)
{
case NBDI_FIRST: BtnName = "First"; break;
case NBDI_PRIORPAGE: BtnName = "PriorPage"; break;
case NBDI_PRIOR: BtnName = "Prior"; break;
case NBDI_NEXT: BtnName = "Next"; break;
case NBDI_NEXTPAGE: BtnName = "NextPage"; break;
case NBDI_LAST: BtnName = "Last"; break;
case NBDI_INSERT: BtnName = "Insert"; break;
case NBDI_APPEND: BtnName = "Append"; break;
case NBDI_DELETE: BtnName = "Delete"; break;
case NBDI_EDIT: BtnName = "Edit"; break;
case NBDI_POST: BtnName = "Post"; break;
case NBDI_CANCEL: BtnName = "Cancel"; break;
case NBDI_REFRESH: BtnName = "Refresh"; break;
case NBDI_SAVEBOOKMARK: BtnName = "SaveBookmark"; break;
case NBDI_GOTOBOOKMARK: BtnName = "GotoBookmark"; break;
case NBDI_FILTER: BtnName = "Filter"; break;
default: break;
}
Application->MessageBox(BtnName.c_str(), "Navigator", MB_OK);
}
}

...
AView->OptionsView->Navigator=true;
AView->NavigatorButtons->OnButtonClick = NavigatorButtonsClick;
TNotifyEvent();
...
Автор: Aleksandr_N
Дата сообщения: 06.04.2009 21:44
Подскажите по cxGrid.

В поле использую стандартную маску типа "!2-24-0000;1;_". В итоге сразу во всех строках этого столбца отображается вид маски "2-24- " или "2-24-____". Можно ли скрыть маску в поле, как это было в dxGrid v3, т.е. маска отображалась только тогда, когда ячейка редактировалась. Накладывать маску на элемент редактирования не предлагать - теряются некоторые свойства.

Спасибо...
Автор: vladman
Дата сообщения: 07.04.2009 01:47
Aleksandr_N

Цитата:
Подскажите по cxGrid. ...
т.е. маска отображалась только тогда, когда ячейка редактировалась

Можно решить проблему обрабатывая событие OnGetProperties для соответствующей cxGridDBColumn/cxGridColumn.
Для упрощения написания такого обработчика необходимо проделать некоторые вспомогательные дейсвия, а именно - создать (поместить на форму) cxEditRepository, или воспользоваться уже существующим. В cxEditRepository создать два MaskEdit Item'а. У первого все свойства оставить по умолчанию, в частности EditMask = ''. У второго установить EditMask = '!2-24-0000;1;_' (Ваша маска). Сам обработчик может выглядеть так:

Код:
procedure <YourForm>.<YourColumn>GetProperties(Sender: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties);
begin
if (ARecord = ARecord.GridView.Controller.FocusedRecord) and Sender.Editing then
AProperties := <YourEditRepositoryMaskItem2>.Properties
else AProperties := <YourEditRepositoryMaskItem1>.Properties;
end;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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