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

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

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

ShIvADeSt (07-02-2009 14:53): Продолжаем тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=10123#1
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 122

   

ShIvADeSt



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

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




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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:16 29-01-2007 | Исправлено: VitaliM, 15:47 24-11-2008
afiget



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

Цитата:
Может кто подскажет как зафиксировать колонку в cxGrid1DBTableView1

Уже было. Только у Bands.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 09:05 04-08-2008
GorBunOFF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте !
Колонки в гриде создаются динамически:
  TcxGridDBBandedColumn* AColumn = cxGridMainAreaView->CreateColumn();
Пытаюсь на каждую вновь созданную повесить свой обработчик события OnGetCellHint:
  AColumn->OnGetCellHint = ColGetCellHint;
При компиляции выдается ошибка:
[Linker Error] Unresolved external 'Cxgridcustomtableview::TcxCustomGridTableItem::SetOnGetCellHint(__closure(*)(Cxgridcustomtableview::TcxCustomGridTableItem *, Cxgridcustomtableview::TcxCustomGridRecord *, Cxgridcustomtableview::TcxGridTableDataCellViewInfo *, const Types::TPoint&, ...' referenced from ...
 
Кто подскажет что делать ?

Всего записей: 6 | Зарегистр. 12-06-2008 | Отправлено: 17:39 04-08-2008
jicoff

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GorBunOFF
 
Значит обработчик ColGetCellHint не соответствует событию. А компилятор не выдает ошибку?

Всего записей: 289 | Зарегистр. 03-03-2006 | Отправлено: 20:01 04-08-2008
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GorBunOFF
Попробуйте явно привести AColumn к TcxCustomGridTableItem.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 20:51 04-08-2008
GorBunOFF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Компилятор ошибку не выдает. Обработчик полностью соответствует :
void __fastcall А::ColGetCellHint(
      TcxCustomGridTableItem *Sender, TcxCustomGridRecord *ARecord,
      TcxGridTableDataCellViewInfo *ACellViewInfo, const TPoint &AMousePos,
      TCaption &AHintText, bool &AIsHintMultiLine, TRect &AHintTextRect)
{
 
}
Явно приводить уже пробовал. Помоему это внутренняя ошибка. Хотя кто знает ?
Если мы вешаем этот обработчик на колонку в режиме дизайна, то всё работает как нужно. Но динамически нет.
 
Я не очень силен в Паскале, но вот реализация обработчика:
  TcxGridGetCellHintEvent = procedure(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
    ACellViewInfo: TcxGridTableDataCellViewInfo; const AMousePos: TPoint;
    var AHintText: TCaption; var AIsHintMultiLine: Boolean; var AHintTextRect: TRect) of object;
 
Реализацию на С++ см. выше. На С++ AMousePos передается по ссылке, а в паскале нет. Но повторяю в Паскале шарю ошень слабо.

Всего записей: 6 | Зарегистр. 12-06-2008 | Отправлено: 08:39 05-08-2008
zver

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
jicoff
Спасибо за ответ.
Но почему-то у меня первым параметром с++ требует не TCanvas * a TMetaClass *
Я пытаюсь передать Sender->Painter->LookAndFeelPainter и получаю AV  
((TcxOffice11LookAndFeelPainter *)Sender->Painter->LookAndFeelPainter)->DrawHeader
    (Sender->Painter->LookAndFeelPainter,
    ACanvas, AViewInfo->Bounds, AViewInfo->TextBounds, AViewInfo->Neighbors,
    cxBordersAll, cxbsNormal, taLeftJustify, vaTop,
    False, True, "", ACanvas->Font, clNone, Color);

Всего записей: 66 | Зарегистр. 07-06-2004 | Отправлено: 13:23 05-08-2008
jicoff

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zver
 
Прощу прощения, ввел в заблуждение. После своего ответа сам попробовал, т.к. бывает необходимость и самому реализовывать подобные вещи.
 
Потратил много времени, благо оно было. Пришел к неутешительному результату. Даже асм код смотрел в отладчике, и делал аналогичную реализацию на нем же. Методы класса, полагаю, извращение Борладна, в спп стандарте скорее всего нет такого, хотя они не противоречат ему. Борланд придумал это в паскале и возложил на компилятор правильную работу с ними, а в спп не перенес его нормальную поддержку.
 
Так вот, DevExpress нигде не создают объекты типа TcxLookAndFeelPainter. В нем и во всех его наследниках есть только методы класса, а это означает, что для работы с ними достаточно получить ссылку на таблицу методов и смещение на конкретный метод при вызове, что и делает код: Sender.Painter.LookAndFeelPainter.DrawHeader. Правильнее было бы на спп так:
 
  if(Sender->Painter->LookAndFeelPainter->ClassNameIs("TcxOffice11LookAndFeelPainter"))
  {
    TcxOffice11LookAndFeelPainter *plaf = new TcxOffice11LookAndFeelPainter;
    plaf->DrawHeader(Sender->Painter->LookAndFeelPainter, ...
    ...
    delete plaf;
  }
 
но при этом регистр EAX дожен содержать указатель на метакласс, а он содержит указатель на объект, как и положено в спп, да и в паскале, если это не метод класса. В итоге получаем не правильно сгенерированный код на спп.
 
Полагаю, этого нельзя делать - ((TcxOffice11LookAndFeelPainter*)Sender->Painter->LookAndFeelPainter), т.к. указатель на метакласс (TcxOffice11LookAndFeelPainterClass) и на объект (TcxOffice11LookAndFeelPainter*) не одно и тоже.
 
 
P.S. К тому же при вызове метода класса запихивается лишнее значение в стэк и при возврате не очищается.

Всего записей: 289 | Зарегистр. 03-03-2006 | Отправлено: 15:21 05-08-2008 | Исправлено: jicoff, 15:26 05-08-2008
zver

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
jicoff
Да всё интересно и печально одновременно...
Выдержка с офф сайта:

Цитата:
 
Reactivated by MisterHoops at 06.09.2006 4:13:38
 
Article A615 calls the DrawHeaderPressed() and DrawHeader() methods but when I tried I couldn't avoid access violations.
 
Thanks, Simon
 
Processed (Answered) by Developer Express Team at 06.09.2006 11:26:01  
 
Hi Simon,
 
We understand what you wish to achieve and should mention that it is impossible o use just the same approach as I have implemented in the Delphi project attached to article A615. The DrawHeader method is declared as a class procedure in our source code and there is a problem in calling class methods (static in C++) in C++Builder. Unfortunately, we have failed to find a solution to this problem and we have tried to do this multiple times.
 
Thanks,
Plato

 

Всего записей: 66 | Зарегистр. 07-06-2004 | Отправлено: 15:43 05-08-2008
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как быть? Читал, что в x37 (в деффках) Нет скинов. Можно ли их будет их прошлой версии доставить?
Или лучше откатиться на x35? В x36 глюки с шедулером, даже если я его не использую.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 16:05 05-08-2008
jicoff

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zver
 
Можно извернуться, если только один класс TcxOffice11LookAndFeelPainter используется - проще, а так для всех придется делать. Создать паскалевский модуль, описать наследника от этого класса, для всех методов класса создать копии, но уже нормальные методы,  которые вызываю каждый свой прототип, приводить к наследнику в нужном месте и вызывать вновь созданные методы.
 
Мне почти удалось приблизиться к правильному вызову из спп, однако осталась проблема - в стек попрежнему запихивается значение, которое не очищается при возврате, но это почти тоже, что описывал выше, но без паскалевского модуля.
 
    typedef TRect __fastcall (__closure *cfHeaderContentBounds)(TMetaClass* vmt, const TRect &ABounds, TcxBorders ABorders);
    typedef TRect __fastcall (*HeaderContentBounds)(TMetaClass* _ax, TMetaClass* vmt, const TRect &ABounds, TcxBorders ABorders);
    union
    {
      cfHeaderContentBounds pcf;
      HeaderContentBounds pfn;
    }
    uni;
 
    uni.pcf = (cfHeaderContentBounds)&plaf->HeaderContentBounds;
    uni.pfn(vmtPainter, vmtPainter, R, AViewInfo->Borders);

Всего записей: 289 | Зарегистр. 03-03-2006 | Отправлено: 17:03 05-08-2008
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Короче в x37 тот же глюк с шедулером, что и в x36. Хотя я шедулер не использую.
 
Добавлено:
Откатился на майских девок, x36, советую не включать шедулер при установке.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 17:08 05-08-2008
zver

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

Код:
if (Sender->Painter->LookAndFeelPainter->ClassNameIs("TcxOffice11LookAndFeelPainter"))
{
TMetaClass* vmtPainter=Sender->Painter->LookAndFeelPainter;
TRect R=AViewInfo->Bounds; //R.Right=R.Right-10;
/*typedef TRect __fastcall (__closure *cfHeaderContentBounds)(TMetaClass* vmt, const TRect &ABounds, TcxBorders ABorders);
    typedef TRect __fastcall (*HeaderContentBounds)(TMetaClass* _ax, TMetaClass* vmt, const TRect &ABounds, TcxBorders ABorders);
    union
    {
      cfHeaderContentBounds pcf;
      HeaderContentBounds pfn;
    }
    uni;
    TcxOffice11LookAndFeelPainter *plaf = new TcxOffice11LookAndFeelPainter;
    uni.pcf = (cfHeaderContentBounds)&plaf->HeaderContentBounds;
    uni.pfn(vmtPainter, vmtPainter, R, AViewInfo->Borders); */
 
 
typedef void __fastcall (__closure *cfDrawHeaderBorder)(TMetaClass* vmt, Cxgraphics::TcxCanvas* ACanvas, const Types::TRect &R, TcxNeighbors ANeighbors, Cxgraphics::TcxBorders ABorders);
typedef void __fastcall (*DrawHeaderBorder)(TMetaClass* _ax, TMetaClass* vmt, Cxgraphics::TcxCanvas* ACanvas, const Types::TRect &R, TcxNeighbors ANeighbors, Cxgraphics::TcxBorders ABorders);
union
    {
      cfDrawHeaderBorder pcf;
      DrawHeaderBorder pfn;
    }
    uni;
    TcxOffice11LookAndFeelPainter *plaf = new TcxOffice11LookAndFeelPainter;
    uni.pcf = (cfDrawHeaderBorder)&plaf->DrawHeaderBorder;
    uni.pfn(vmtPainter, vmtPainter, ACanvas, R, AViewInfo->Neighbors, AViewInfo->Borders);

 
>>>>>>>>>>>>>>>>AV

Всего записей: 66 | Зарегистр. 07-06-2004 | Отправлено: 18:08 05-08-2008
GorBunOFF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вобчем по поводу ошибки посоветовать нечего. Жаль.

Всего записей: 6 | Зарегистр. 12-06-2008 | Отправлено: 08:49 06-08-2008
Ziltoid

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, не подскажете, как можно решить такую проблемку...
Надо покрасить ячейки грида и дерева по условию. Понятно, что об этом говорили не раз и надо, как доктор прописал, мастерить стили и вешаться на OnGetContentStyle.
 
Традиционно решить можно так (утрированный примерчик):
 
if ANode.Values[<Индекс>] = <Значение> then
   AStyle := cxStyle1 else
   AStyle := cxStyle2;
 
Проблема в том, что настройки грида и дерева (имена полей, их тип, ширина и тд) берутся из настроечной базы (по сути метаданные) и все это добро создается на лету - и запрос к БД, и колонки. К тому же некоторые поля в запросе есть, но в гриде(дереве) не отображаются. Через это не факт еще, что поле, по значению которого надо красить ячейку(ячейки), есть в гриде(дереве) и проверять здесь надо значение поля в запросе.
Только при этом он как-то странно красит. Если фокуса на записи, ячейку(ячейки) которой надо, нет, то раскраски нет. Стоит переместить фокус на эту запись, как раскрашивается предыдущая, на которой стояли и текущая, которую надо было изначально раскрасить. Перемещаешься на другую запись, раскраска исчезает. А если сделаешь тупо, как в утрированном примерчике, все прекрасно красится. Почему так?
 
Код:
// ColorHandler - класс-менеджер для работы с цветовыми схемами (может быть, если в метаданных есть описание цветовых схем, а может и не быть)
  if ColorHandler = nil then Exit;
// CSI - структура описывающая одну цветовую схему (условие раскраски, раскрашиваемые поля, индекс стиля в репозитории)
  CSI := ColorHandler.GetColor(Q.Fields);
   if CSI <> nil then
// Если условие (нужное поле в запросе Q равно значению, заданному в условии) выполнилось, в AStyle сунем стиль, найденный в репозитории по индексу (стили тоже  
// создаются на лету)
 
    AStyle := TcxStyle(Styles.Items[CSI^.StyleIndex]) else
    AStyle := DefaultStyle;
 
Может, я что-то не так делаю?

Всего записей: 24 | Зарегистр. 30-05-2008 | Отправлено: 09:15 06-08-2008
XeoNu905097

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. при преходе с v28 на v37 добавилоось масса dxSkins... и увеличился модуль EXE в 2х.
как можно гарантированно убрать dxSkins из Units - добавляются при компиляции.
2. как можно в cxDBTreeList добавить фильтры (ангалогично cxGrid-у) или какой альтернативный компонент использовать ?

Всего записей: 27 | Зарегистр. 05-08-2008 | Отправлено: 09:36 06-08-2008
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XeoNu905097
уже обсуждали - никак, пока что единственный способ - не устанавливать скины
 
Добавлено:
Применяй к своему экзешнику упаковщики, например UPX или ASPack.
ASPack есть бесплатная редакция. Прекрасно упаковывает.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 09:43 06-08-2008
afiget



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

Цитата:
ASPack есть бесплатная редакция

Не нашел такой на сайте. Есть только ASPack Free Trial.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 10:41 06-08-2008
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот и используй, в триальной версии некоторые ограничения, как то несохранение параметров.
 
Добавлено:
Вот, погуглил
http://www.google.com/search?hl=ru&q=%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D1%8B%D0%B9+%D1%83%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D1%89%D0%B8%D0%BA+exe+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
 
Добавлено:
http://softsearch.ru/programs/44-094-exe-upakovschik-download.shtml
 
Добавлено:
http://www.wasm.ru/toollist.php?list=8
UPX бесплатный, но старые версии  пакера неправильно упаковывают "совеременные" exe, проги после упаковки не запускаются или глючат
 
Добавлено:
и для UPX`а я где-то видел GUI интерфейс, хотя можно сделать bat`ничек с параметрами и кинуть в папку проекта
 
Добавлено:
Вопрос по удалению в цикле. Есть cxGrid, подключенный к датасету. Нужно пробежаться по гриду и удалить записи, удовлетвлряющие некоторым условиям? Как лучше это сделать?
Вот примерный код:

Код:
 
 
      for i := dbgReklama.ViewData.RecordCount - 1 downto 0 do begin
        with dbgReklama.ViewData.Records do begin
          if Values[dbgReklamadatas.index] = '' then continue;
           bRecordNOTDel := Values[.....;
            if bRecordNOTDel then
              continue
            else
               удаляем эту строку...
 
        end;//with
      end;//for
 
 
 

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 11:47 06-08-2008
Darl

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GorBunOFF
 
OnGetCellHint:  
AColumn->OnGetCellHint = (TcxGridGetCellHintEvent)&ColGetCellHint;

Всего записей: 140 | Зарегистр. 10-07-2002 | Отправлено: 14:59 06-08-2008
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, кто даст пример, как правильно удалять в цикле записи в сгруппированном гриде (TcxGridDBTableView)? Замучался уже. (

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 17:11 06-08-2008
   

Страницы: 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 122

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress 2
ShIvADeSt (07-02-2009 14:53): Продолжаем тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=10123#1


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru