DBGrid1DrawColumnCell зарисовывает Title.Caption

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
andal
незнакомец
Сообщения: 9
Зарегистрирован: 21.03.2007 10:00:47

DBGrid1DrawColumnCell зарисовывает Title.Caption

Сообщение andal »

Добавляю колонку

Код: Выделить всё

DBGrid1.Columns.Add.Title.Caption := 'ФИО';

Затем в DBGrid1DrawColumnCell пытаюсь его заполнить

Код: Выделить всё

  if (Column.Title.Caption = 'ФИО')
   then
     with TDBGrid(Sender).Canvas do
      begin
       colText :=
       trim(DataModule1.selfromdict('Sotrud',
       DataSource1.DataSet.FieldByName('ID_Sotrud').Text,'Famil'))+' '+
       trim(DataModule1.selfromdict('Sotrud',
       DataSource1.DataSet.FieldByName('ID_Sotrud').Text,'Imya'))+' '+
       trim(DataModule1.selfromdict('Sotrud',
       DataSource1.DataSet.FieldByName('ID_Sotrud').Text,'Otches'));
       FillRect(Rect);
       TextOut(Rect.Left + 2, Rect.Top + 2,trim(colText));
      end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);


В результате получаю в Title наложение последней записи и названия колонки. Борюсь второй день. Кто-нибудь сталкивался?
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

изврат, какой сервер БД ?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

PS.
Перед процедурой происовки, например при создании формы, создай локальные переменные, в которые загониш указателит на нужные поля - во первых увеличется скорость, т.к. не нужно будет каждый раз их искать (FieldByName - очень медленная процедура), во вторых - читать станет проще.
andal
незнакомец
Сообщения: 9
Зарегистрирован: 21.03.2007 10:00:47

Сообщение andal »

изврат, какой сервер БД ?


Да знаю я, что можно sql-запросом можно все, что угодно получить, но вот захотелось поизвращаться. ;)

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


И это я тоже понял. Как мне в условии прописать, чтобы title пропускалось при отрисовке?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Я не уверен в правильности - но посмотри на параметр State этого метода - кажется тебе надо обработать состояние gdFixed

а вобще для твого примера лучше использовать калькулируемое поле, или (что проще для тебя) - собрать ФИО до кучи ешё в запросе в вычисляемую колонку
andal
незнакомец
Сообщения: 9
Зарегистрирован: 21.03.2007 10:00:47

Сообщение andal »

alexs писал(а): не уверен в правильности - но посмотри на параметр State этого метода - кажется тебе надо обработать состояние gdFixed


Спасибо тебе, добрый человек!

if (Column.Title.Caption = 'ФИО') and not (gdFixed in state)

заработало.
victorgugo
новенький
Сообщения: 17
Зарегистрирован: 04.03.2009 02:11:20

Сообщение victorgugo »

при вызове процедуры:

procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);

возникает ошибка:

Unit1.pas(37,67) Error: Identifier not found "TGridDrawState"

Кто знает чем может быть вызвана даная проблема и как ее устранить?
Заранее спасибо!
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

"TGridDrawState" определен в модуле "Grids"
У Вас в uses прописан "Grids"?

Указывайте версию fpc и Lazarus
victorgugo
новенький
Сообщения: 17
Зарегистрирован: 04.03.2009 02:11:20

Сообщение victorgugo »

Lazarus-0.9.24-fpc-2.2.0-20071114-win32.exe

В uses добавил Grids и всё заработало!
Большое спасибо!
Ответить