Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)

Модерирует : ShIvADeSt

ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

   

golkanavt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DevExpress

Обмен опытом, обсуждение нюансов и решение проблем возникающих при использовании библиотеки компонент Developer Express




 
Сами прирученные компоненты частенько приходят на водопой сюда
 
DLL со скинами из библиотеки dxSkins, автор Ziltoid Подробнее... линк обновлен
Продолжение, Первая часть, вторая часть

Всего записей: 1069 | Зарегистр. 08-04-2002 | Отправлено: 10:31 07-02-2009 | Исправлено: vladman, 14:36 24-10-2009
Meister Floh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kim006
 
По первому пункту почитай про вот это - cxGrid1DBTableView1->IndexOfItem()

Всего записей: 393 | Зарегистр. 04-08-2003 | Отправлено: 22:41 04-04-2009
Kim006



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хм а где взять TableItem для IndexOfItem(), у cxGrid1TableView1 (НЕ cxGrid1DBTableView1) я не нашел ни GetColumnByFieldName ни FindItemByFieldName ?

Всего записей: 16 | Зарегистр. 04-04-2009 | Отправлено: 01:47 05-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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  

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 02:27 05-04-2009 | Исправлено: vladman, 02:31 05-04-2009
Kim006



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
меня не совсем правильно поняли:
 

Цитата:
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 чтоб проверить была ли нажата кнопка "-" на навигационной панельке...

Всего записей: 16 | Зарегистр. 04-04-2009 | Отправлено: 12:46 05-04-2009
Meister Floh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kim006

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

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

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

Не буду утверждать, но помоему решение лежит в плосткости динамического добавления обработчиков событий. Например так как тут: ms-help://embarcadero.rs2009/delphivclwin32/Menus_TMenuItem_OnClick.html - это тема в справке для студии 2009.. Вкратце вот пример...

Всего записей: 393 | Зарегистр. 04-08-2003 | Отправлено: 15:05 05-04-2009 | Исправлено: Meister Floh, 15:08 05-04-2009
xokc

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

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

Всего записей: 477 | Зарегистр. 22-09-2002 | Отправлено: 15:37 05-04-2009 | Исправлено: xokc, 15:40 05-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kim006

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

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

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

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

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

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

Meister Floh и xokc исчерпывающе написали.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 18:33 05-04-2009 | Исправлено: vladman, 18:42 05-04-2009
Kim006



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Задача ставилась четко, можно ли заменить мой самодельный цикл на что нибудь стандартное, и существует ли нужный флаг который я и собирался использовать, как я и написал в обработчике 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();
 ...

Всего записей: 16 | Зарегистр. 04-04-2009 | Отправлено: 18:44 05-04-2009
Aleksandr_N

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

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 22:44 06-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;
 

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 02:47 07-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще вопрос по гриду - как в реал-тайме узнать, есть ли у данной колонки Summary? Что-то типа GridDBTableView1.Columns[i].IsSummary?

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 08:38 07-04-2009
Aleksandr_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Пока данный код проверить не могу, Вопрос только в том, будут ли сохраняться свойства поля как маскированного? Например при вызове автофильтра на маскированном поле, в диалоге автофильтра уже присутствует маска и т.д. Не будут ли теряться эти свойства? Тем более работа осложняется тем, что поля создаются динамически...

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 11:57 07-04-2009
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Элегантно. Причем, если для стилей такой подход знаком, то с Properties как-то сразу не догадался
 
Postscriptum
GridDbColumn.Summary.FooterKind
или GroupFooterKind, GroupKind отличные от skNone (в числовом выражении - больше 0)

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 11:58 07-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr_N

Цитата:
в диалоге автофильтра уже присутствует маска

Наверное, имелось ввиду диалоге *Пользовательского фильтра* (*Custom filter*). Если именно в этом диалоге, то нет, маска при вводе значения для фильтра присутствовать не будет. Но можно подумать как это обработать, если это актуально.  
Да, динамическое создание полей немного сложнее, чем в дизайнтайме, но не более того. Всегда можно ведь подсмотреть в исходники как это делают ребята из ДевЭкспресс.
afiget
Спасибо за
Цитата:
Элегантно.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 16:04 07-04-2009
Aleksandr_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman

Цитата:
Если именно в этом диалоге, то нет

Жалко, ну что-нибудь придумаю
 

Цитата:
Всегда можно ведь подсмотреть в исходники как это делают ребята из ДевЭкспресс.

 
Честно говоря я что-то не заметил что они там делают что-то сверхординарное - банальные примеры.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:08 07-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr_N

Цитата:
Честно говоря я что-то не заметил что они там делают что-то сверхординарное - банальные примеры

Так не в примерах я предлагал подсматривать, а именно в исходниках самих компонент,  ..\ExpressQuantumGrid 6\Sources\cxGridTableView.pas, например.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 18:23 07-04-2009
Aleksandr_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Я тут ещё подумал: использовать маску типа emkRegExprEx. Но тут возникает та-же проблема. В этой маске исчезают символы типа "-", но начальные "2-24" остаются. Уточню: не запретить пользователю вводить символы кроме начальных "2-24", а именно при начале редактирования УЖЕ было "2-24". У меня не получилось создать такую маску. Не подскажете как правильно?

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 18:46 07-04-2009
TechnoDreamer

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Изучаю TcxDBTreeList.
Мне нужно, что бы цвет шрифта был соответствующим записи в БД (у каждого элемента есть свое поле FontColor).
Цвет я могу без проблем изменить в OnCustomDrawCell, а вот как мне узнать\прочитать его из БД? Т.е. нужно определить для какой записи компонент рисует ноду. Возможно ли такое вообще?

Всего записей: 259 | Зарегистр. 01-06-2008 | Отправлено: 02:47 08-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите еще такую вещь - в реалтайме делаю Summary. Хотелось бы еще сумму по группе - чего-то не получается:
 
with Form1.GridDBTableView1.DataController.Summary do
    begin
      BeginUpdate;
    try
     with FooterSummaryItems.Add as TcxGridDBTableSummaryItem do
     begin
      s:=Pokaz.Items[Pokaz.ItemIndex];
      Column:=Form1.GridDBTableView1.GetColumnByFieldName(Form1.T1.FindField(s).FieldName);
      Format := 'Сумма= ,0.00;-,0.00';
      Kind := skSum;
     end;
    finally
     EndUpdate;
    end;
    Form1.GridDBTableView1.DataController.ClearDetails;
    end;
 
Т.е. сделал Summary по полю Form1.T1.FindField(s).FieldName - все нормально отображается, суммируется. Теперь по группе:
 
    with Form1.GridDBTableView1.DataController.Summary do
    begin
     BeginUpdate;
    try
     SummaryGroups.Clear;
     with SummaryGroups.Add do
     begin
      TcxGridTableSummaryGroupItemLink(Links.Add).Column := Form1.GridDBTableView1.GetColumnByFieldName(Form1.T1.FindField(s).FieldName);
     with SummaryItems.Add as TcxGridDBTableSummaryItem do
      begin
       Column := Form1.GridDBTableView1.GetColumnByFieldName(Form1.T1.FindField(s).FieldName);
       Kind := skSum;
       Format := 'Сумма= ,0.00;-,0.00';
       Position:=spGroup;
      end;
     end;
    finally
     EndUpdate;
    end;
    Form1.GridDBTableView1.DataController.ClearDetails;
 
чего-то не появляется сумма по группе. В GridDBTableView1.OptionsView.GroupFooters=gfVisibleWhenExpanded

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 05:51 08-04-2009
infomSB



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TechnoDreamer
Конечно возможно, так пробовали ?
 
procedure TForm1.cxDBTreeList1CustomDrawCell(Sender: TObject; ACanvas:
    TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo; var ADone: Boolean);
begin
  if   not VarIsNull(AViewInfo.Node.Values[<Номер колонки со значением FontColor>]) then
   begin
    <Рисование>
   end;
end;

Всего записей: 75 | Зарегистр. 17-03-2006 | Отправлено: 09:14 08-04-2009
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)
ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru