else {ячейка не имеет фокуса и не выбрана}
if IntFromStr(TheText) <> 0 then Brush.Color := clNavy {Цвет фона подсвеченной ячейки}
else Brush.Color := clWhite; {Цвет фона нормальной ячейки}
{ Определяем цвет текста: }
if IntFromStr(TheText) <> 0 then Font.Color := clRed {Цвет текста подсвеченной ячейки}
else Font.Color := clNavy; {Цвет текста нормальной ячейки}
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, TheText);
end; {with CharGrid.Canvas}
end;
Показ Memo-поля в Dbgrid
Delphi 1
…я все же лелею надежду, что когда-нибудь увижу TMemoField.DataSize, имеющим значение, отличное от нуля. Может быть значение DataSize является размером части Memo, которая сохранилась в .db-файле? Вместо этого я теперь пользуюсь объектом TBlobStream, который вполне хорошо справляется с этой работой. Все это у меня происходит примерно так:
Var
pBuffer: PChar;
Blob: TBlobStream;
begin
{FDataField – это TMemoField}
Blob := TBlobStream.Create(FDataField, bmRead);
try
if Blob.Size > 0 then try
GetMem(pBuffer, Blob.Size);
Blob.Read(pBuffer^, Blob.Size);
{ что-то тут делаем }
FreeMem(pBuffer, Blob.Size);
except
ShowMessage('Нехватка памяти' );
end;
finally
Blob.Free
end;
Как определить изменение фокуса строки в TDBGrid?
Используйте событие OnDataChange объекта Datasource, соединенного с DBGrid. Если параметр State в обработчике событие равен dsBrowse, значит вы перешли в новую строку (или только что открыли таблицу).
Почему сетка не поддерживает такое событие? Поскольку сетка может быть не единственным элементом управления, оторбажающим данные из текущей строки и может быть не единственным элементом, позволяющим осуществлять перемещение от строки к строке. С помощью Datasource обработка события осуществляется централизованно.
Я не уверен в том, что проблему можно решить, обрабатывая событие одинарного щелчка, для отслеживания события изменения строк я рекомендую использовать событие TDatasource.OnDataChange, а для колонок — TDBGrid.OnColEnter/Exit.
Лично я пользуюсь следующей рабочей технологией:
1. Для того, чтобы обнаружить изменения текущей строки, воспользуйтесь событием TDataSource OnDataChange. OnDataChange возникает при прокрутке или щелчке на другой строке. Обработчик события может выглядеть приблизительно так:
procedure Form1.DSrc1DataChange(Sender: TObject; Field: TField);
где Field является колонкой, где произошло изменение.
Поля TTable могут использоваться для сравнения текущих выбранных строк полей (ключ) с вашими требованиями. С той же целью может быть использовано и свойство TDBGrid Fields. Для примера:
if tbl1.Fields[0].AsString = 'BlaBlaBla' then …
или
if dbGrid1.Fields[I].IsNull then …
2. Для отслеживания изменения колонки, используйте события TDBGrid OnColExit & OnColEnter. Для определения выбранной к настоящему времени колонки воспользуйтесь свойствами TDBGrid SelectedField и SelectedIndex.
Когда выбирается другая колонка другой строки, вы получаете события OnColExit, OnColEnter и OnDataChange.
3. Можно пойти и «кривым» путем, взявшись за обработку события TDBGrid OnDrawDataCell, которое возникает когда ячейка выбирается, или когда сетка скроллируется. Обработчик события может выглядеть примерно так:
procedure Form1.dbGrid1DrawDataCell(Sender: TObject; Rect: TRect; Field: TField; State: TGridDrawState);
При изменении ячейки вы получаете поток событий, поэтому вам нужно каким-то образом их фильтровать.
4. Если у вас нет проблем в создании «101 изменения» стандартных компонентов – что является проблемой для меня 8-), то попробуйте это. Это легко.
Чтобы иметь доступ к индексу строки или колонки выбранной ячейки, вы должны унаследовать ваш класс от TCustomGrid и опубликать свойства времени выполнения Row и Col (текущие строка и колонка сетки, не таблицы!!):
type TSampleDBGrid = class(TCustomGrid)
public
property Col;
property Row;
end;
в соответствующей процедуре или обработчике события осуществите приведение типа:
var G: TSampleDBGrid;
begin