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

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

Автор: Postscriptum
Дата сообщения: 24.09.2009 13:28
Блин, помогите со старой проблемой - уже обращался я и так и не сделал - как подсветить удаленные записи в cxDBGride (без создания всяких дополнительных колонок, индексов и т.д.)? Могу даже пример выложить (только там для доступа к dbf используется компонент Advantage Tdataset Descendant). Вот смотрите - на форме 2 грида - один стандартный, один девовский. Код для стандартного:

Код:
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
OldC: TColor;
begin
if not (gdFocused in State) then
begin
// получаю по номеру записи (AdsTable1.AdsGetRecordNum) в dbf-ке - удалена ли она
if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) then
begin
OldC := dbGrid1.Canvas.Brush.Color;
dbGrid1.Canvas.Brush.Color := clRed;
dbGrid1.Canvas.FillRect(Rect);
dbGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
dbGrid1.Canvas.Brush.Color := OldC;
end;
end;
end;
Автор: Cryogen2003
Дата сообщения: 24.09.2009 13:42
Отказываюсь в своих проектах совсем от EhLib в пользу девок.
Возникли вопросы по гриду:
1) Можно ли как-нибудь показывать как было сделано в EhLib у индикатора записи номер записи? Создавать новое поле не хочу.
2) Есть ли автоматическая подсветка строк (ну там когда четные строчки подсвечиваются), либо же придется самому красить строчки?
Автор: xokc
Дата сообщения: 24.09.2009 13:57
Cryogen2003

Цитата:
1) Можно ли как-нибудь показывать как было сделано в EhLib у индикатора записи номер записи? Создавать новое поле не хочу

можно. для начала прочесть предыдущую страницу этого форума.


Цитата:
2) Есть ли автоматическая подсветка строк (ну там когда четные строчки подсвечиваются), либо же придется самому красить строчки?

Есть. Воспользоваться стилями для Odd и Even строк.
Автор: Cryogen2003
Дата сообщения: 24.09.2009 14:02
xokc
По поводу стилей спасибо, реально забыл, что все по поводу стилей.

А по поводу номера записей там просто обсуждалось, как этот номер записи получить и не более.
Автор: SIgor33
Дата сообщения: 24.09.2009 14:08
vladman

Цитата:
Используйте вместо FieldByName('Fam').AsString оператор TcxCustomEdit(Sender).EditingValue

Спасибо за совет. И еще вопросик. На этом обрабочике у меня весит несколько TcxTextEdit и TcxdateEdit которые отвечают за поля фамилия имя Отчество и дата рождения как узнать какой едит за действован и его значение и если не задейсвован то же значение нужно . Нужно это для вывода повторных значений. Поэтому я использовал FieldByName('Fam').AsString соотвественно
Автор: vladman
Дата сообщения: 24.09.2009 14:47
Chukotka

Цитата:
После этого при попытке закрыть форму с контейнером происходит ошибка.

Delphi 2007, DevExpress 45 ничего похожего не показывает
_http://rapidshare.com/files/284334389/Project5.rar.html

Добавлено:
Cryogen2003

Цитата:
1) Можно ли как-нибудь показывать как было сделано в EhLib у индикатора записи номер записи? Создавать новое поле не хочу.

Без нового поля не получится.

Цитата:
2) Есть ли автоматическая подсветка строк (ну там когда четные строчки подсвечиваются), либо же придется самому красить строчки?

Если буду использовать скины, то в большинстве такая возможность уже реализована.
Автор: Cryogen2003
Дата сообщения: 24.09.2009 15:04
vladman
Со скинами уже посмотрел, в принципе прикольно, но честно говоря не особо красиво получается. Например при Caramel голубой и карамельный. Смотрится просто убойно

По поводу индикатора понял, честно говоря очень и очень жаль. А может можно как-то с помощью стилей индикатора такое слепить?
Автор: vladman
Дата сообщения: 24.09.2009 15:15
Postscriptum

Цитата:
помогите со старой проблемой

В таком виде и не будет верно работать.
Ведь в обработчике CustomDrawCell AdsTable1.AdsGetRecordNum не меняется.
Прочитайте статью в Support Center "Row/record index confusion", ссылка на которую была приведена в моем сообщение http://forum.ru-board.com/topic.cgi?forum=33&topic=10123&start=1540#9.
Вам нужно указывать что-то вроде
if AdsTable1.AdsIsRecordDeleted(AViewInfo.GridRecord.RecordIndex).

Автор: Cryogen2003
Дата сообщения: 24.09.2009 16:03
vladman
А не подскажешь как можно сделать в этом гриде так же, как было сделано DBGridEh с поддержкой дерева.
То есть есть данные с количеством столбцов около 10. Есть id и parentid, то есть нужно в режиме грида нарисовать дерево. Такое возможно в TcxGrid или нет?
Автор: vladman
Дата сообщения: 24.09.2009 16:13
Cryogen2003

Цитата:
Со скинами уже посмотрел, в принципе прикольно, но честно говоря не особо красиво получается

Вы легко сами сможете менять цвет заливки четных и нечетных строк при примененных скинах.

Цитата:
По поводу индикатора понял, честно говоря очень и очень жаль. А может можно как-то с помощью стилей индикатора такое слепить?

С помощью стилей - нельзя, но что-то придумать можно, например:

Код: procedure <YourForm>.<YourcxGridDBTableView>CustomDrawIndicatorCell(Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo:
TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
vRect: TRect;
begin
if AViewInfo is TcxGridIndicatorRowItemViewInfo then
begin
vRect := AViewInfo.Bounds;
ACanvas.FillRect(VRect);
ACanvas.DrawComplexFrame(VRect, clBlack, clBlack, [bBottom, bLeft, bRight], 1);
InflateRect(VRect, -2, -2);
ACanvas.Font.Color := clBlack;
ACanvas.Brush.Style := bsClear;
ACanvas.DrawTexT(IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).RowViewInfo.Index),
vRect, cxAlignCenter or cxWordBreak or cxShowEndEllipsis);
ADone := True;
end;
end;
Автор: Postscriptum
Дата сообщения: 24.09.2009 16:13
vladman

Цитата:
Вам нужно указывать что-то вроде
if AdsTable1.AdsIsRecordDeleted(AViewInfo.GridRecord.RecordIndex).

Пробовал. AViewInfo.GridRecord.RecordIndex, насколько я понял - номер записи в гриде. Т.е. если, допустим, в dbf-ке удалена 3-я запись. Когда компонент настроен на показ удаленных записей - все хорошо на этой записи и AdsTable1.AdsGetRecordNum=3 и AViewInfo.GridRecord.RecordIndex+1=3. А вот если компонент настроен на скрытие удаленных записей, то в гриде на 3-й позиции окрашивается строка в красный цвет (а в dbf-ке на самом деле она 4-я), потому что на позиции AdsTable1.AdsIsRecordDeleted(AViewInfo.GridRecord.RecordIndex+1) запись-то удалена. Я понятно объяснил?
Автор: Cryogen2003
Дата сообщения: 24.09.2009 16:18
vladman
На основной форме проекта такое пишется, что запись 1 из 5000, но на других просто статусбар реально как-то не к месту, да и пользователи привыкли так сказать контролировать свой темп работы Хотя конечно можно поставить и статус бар с такими данным, просто на девок хочется перейти, но в тоже время чтобы пользователи не меняли своих привычек.

А за код, спасибо, попробую

Добавлено:
vladman
А так разве можно использовать большое количество столбцов?
Автор: Postscriptum
Дата сообщения: 24.09.2009 16:25
Cryogen2003
Тоже перешел на девок с EHLib. Без стакана хрен разберешься А если еще с английским ну очень большие проблемы...
Автор: vladman
Дата сообщения: 24.09.2009 16:28
Postscriptum

Цитата:
AViewInfo.GridRecord.RecordIndex, насколько я понял - номер записи в гриде

Нет - номер записи в датасете. Еще раз обратитесь к "Row/record index confusion" для четкого понимания что есть что.

Цитата:
А вот если компонент настроен на скрытие удаленных записей

Так что тогда должно краситься в гриде, если и датасет их (удаленные записи) не возращает? Сделайте обыкновенную проверку, что-то в виде

Код: if AdsTable1.AdsIsRecordDeleted(...) and AdsTable1.<ShouldShowDeletedRecord> then
ACanvas.Brush.Color := clRed
else
ACanvas.Brush.Color:=OldC;
Автор: Cryogen2003
Дата сообщения: 24.09.2009 16:32
Postscriptum
Если не секрет, почему перешел с ehLib? Меня доконали ошибки, которые возникают благодаря двум пакетам. А когда были еще некоторые компоненты от TMS, то вообще ужас был

Автор: vladman
Дата сообщения: 24.09.2009 16:35
Cryogen2003

Цитата:
А так разве можно использовать большое количество столбцов?

Не совсем понял к чему это...
Postscriptum

Цитата:
Тоже перешел на девок с EHLib

You are welcome!

Цитата:
А если еще с английским ну очень большие проблемы...

Но тут мне вам тяжело помочь, разве что ссылкой http://translate.google.com
А "Row/record index confusion" обязательно прочитайте, думаю, для разбора приведенного там примера не обязательно глубоко владеть английским.
Автор: Cryogen2003
Дата сообщения: 24.09.2009 16:39
vladman
Просто привык к тому, что обычно в деревьях больше одного столбца не бывает, а тут - и столбцы, и даже бэнды есть. Сижу, просто, извиняюсь, поскуливаю от удовольствия, когда видишь насколько все продуманно в девках. Пусть не особо бывает понятно, как разрулить ту или иную ситуацию, но мягко говоря прикольно.
Автор: Postscriptum
Дата сообщения: 24.09.2009 16:42
Cryogen2003

Цитата:
Если не секрет, почему перешел с ehLib?

Впечатлился возможностми девовского грида. Единственное "но" - сложность в освоении (для меня, по крайней мере).
vladman

Цитата:
Так что тогда должно краситься в гриде, если и датасет их (удаленные записи) не возращает? Сделайте обыкновенную проверку, что-то в виде

Я уже совсем отупел. А почему тогда стандартный грид понимает и красит все правилбно - и когда удаленные записи отображаются, и когда не отображаются.

Цитата:
Нет - номер записи в датасете. Еще раз обратитесь к "Row/record index confusion" для четкого понимания что есть что.

Ну тогда должно работать при скрытии удаленных записей - но не работает же. И в статье ведь речь идет о записи, на которой фокус стоит, правильно? А в данном случае красятся записи до получения оного. Или я туплю?

Автор: Cryogen2003
Дата сообщения: 24.09.2009 16:44
Postscriptum
Ну мне тоже их грид очень нравиться, хотя в принципе 70 процентов из всего этого есть и TDBGridEh
Автор: Postscriptum
Дата сообщения: 24.09.2009 17:00
vladman
Мне кажется - мы не понимаем друг друга. Вот 1 скрин - показываются удаленные записи (3-я) и все праильно подсвечивается:


Вот 2-й скрин - не показываются удаленные записи. И зачение AViewInfo.GridRecord.RecordIndex+1=3 у четвертой строки!!! И она подсвечена как удаленная.

Автор: vladman
Дата сообщения: 24.09.2009 17:01
Postscriptum

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

Без малейшего понятия. Откуда мне знать что это за AdsTable1 и как именно работает конструкция AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum).
И что тогда красится, когда удаленные записи не отображаются? По идее все должно быть белым.

Цитата:
И в статье ведь речь идет о записи, на которой фокус стоит, правильно?

Правильно, с статье идет речь о фокусед, но это лишь для доступа к какой-то определенной записи, чтобы показать различные ее индексы. Вся ценность статьи в том, что в DataControllere есть понятие индекса для записи датасета и индекса для строки грида, и что это *две большие разницы*. Вкратце, индекс записи (Recordа) датасета не меняется при сортировках группировках, фильтрации, а индекс строк меняется.

Добавлено:
Postscriptum

Цитата:
Мне кажется - мы не понимаем друг друга. Вот 1 скрин - показываются удаленные записи (3-я):
Вот 2-й скрин - не показываются удаленные записи. И начение AViewInfo.GridRecord.RecordIndex+1=3 у четвертой строки!!!

Я же уже написал, вставьте элементарную проверку в ваш TForm4.cxGrid1DBTableView1CustomDrawCell

Код: if AdsTable1.AdsIsRecordDeleted(...) and AdsTable1.<ShouldShowDeletedRecord> then
ACanvas.Brush.Color := clRed
else
ACanvas.Brush.Color:=OldC;
Автор: Chukotka
Дата сообщения: 24.09.2009 22:03
vladman

Цитата:
Delphi 2007, DevExpress 45 ничего похожего не показывает

Судя по поведению, похоже что у DockManager'a не установлена опция doTabContainerCanClose - при нажатии кнопки закрытия Float-формы последовательно закрываются вкладки таб-контейнера.
Не могли бы выложить код проекта, чтобы я попробовал скомпилить у себя (не уверен. правда, что 45 версия обратно совместима с 42, но все же)
Автор: vladman
Дата сообщения: 25.09.2009 00:11
Chukotka

Цитата:
похоже что у DockManager'a не установлена опция doTabContainerCanClose

Да, собственно, и не было никакого DockManager . Но даже с DockManager'ом и с установленным этим свойством - все работает верно.

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

Да чего же не мог. Вот, пожалуйста _http://rapidshare.com/files/284534776/FloatTabContainer.rar.html
Автор: Postscriptum
Дата сообщения: 25.09.2009 00:27
vladman

Цитата:
или еще лучше:
Самой первой строкой в этом же обработчике
if not <YourCheckBox>.Checked then Exit;

Точно! Вот я протупил! Спасибо. Наконец-то сработало!
Автор: Chukotka
Дата сообщения: 25.09.2009 09:00
vladman

Цитата:
Да, собственно, и не было никакого DockManager . Но даже с DockManager'ом и с установленным этим свойством - все работает верно.
Откомпилировал Ваш пример - он работает и у меня. Но если установить у DockManager'a опцию doFreeOnClose - возникает вышеописанная ошибка.
Не могли бы вы проверить работу примера с установленной опцией doFreeOnClose?
Автор: vladman
Дата сообщения: 25.09.2009 10:16
Chukotka

Цитата:
Не могли бы вы проверить работу примера с установленной опцией doFreeOnClose?

Да, при установленном doFreeOnClose тоже вываливается с ошибкой List index out of bounds. И, вы правы, это происходит только в случае размещения панелей в TabContainer.
Вообще-то странно. Эту ошибку должны были исправить еще в 2007 году в версии 5.33. Может снова в каком-то релизе внесли. Немного позже посмотрю что именно они исправили относительно этого бага в 5.33.
Автор: Radio_Kat
Дата сообщения: 25.09.2009 10:20

Цитата:
Radio_Kat
А можно сслыку на ваш пост в суппорте, если не секрет, конечно.
Может дело в компонентах доступа к БД? FireBird 2.5 вторая бета еще по-моему.

vladman, там такой дико плохой английский что даже стыдно.
видио которое проблемму демонстрирует вот тут:
http://rapidshare.com/files/284257918/avi_prime.rar.html

пока сапорт пишет:

With the FireBird 2.5 I ran your example, I've tried to reproduce the problem you described, but failed, sorry.
I ran your example with the FireBird 2.5, but failed to reproduce the problem you described, sorry.
....
Thank you for the video.
Sorry, I can't reproduce this issue at our end. Please specify the exact TreeList version you're using.

так что даже не знаю в чем может быть проблемма.
Автор: FunCode
Дата сообщения: 25.09.2009 10:49

Цитата:
Radio_Kat
там такой дико плохой английский что даже стыдно.
видио которое проблемму демонстрирует вот тут

улыбнуло
Автор: Postscriptum
Дата сообщения: 25.09.2009 11:16
Подскажите, а можно в девовском DBGride егошными средствами например выделить несколько ячеек в одном столбце и вычислить их сумму?
Автор: vladman
Дата сообщения: 25.09.2009 11:38
Postscriptum

Цитата:
Подскажите, а можно в девовском DBGride егошными средствами например выделить несколько ячеек в одном столбце и вычислить их сумму?

Можно, обратите внимание на свойство DataController.Summary.Option.soMultipleSelectedRecords. Подробнее - ms-help://borland.bds5/ExpressDataController.BDS5/ExpressDataController/IDH_TcxDataSummary_Options.htm

Добавлено:
Radio_Kat

Цитата:
так что даже не знаю в чем может быть проблемма.

Можно попробовать все тоже сделать на Firebird 2.1. Если не решит проблему, попробовать другие компоненты доступа.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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