KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

 Result := inherited CellRect(ACol, ARow);

end;

Вы можете сделать приведение типа вашего DBGrid к TMyDBGrid (это возможно, поскольку CellRect статический метод) и вызвать CellRect:

Rectangle := TMyDBGrid(SomeDBGrid).CellRect(SomeColumn, SomeRow);

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

const Disp = 2;        //Правильно выравниваем компонент

begin

 inherited;

 if (gdFocused in State) then begin

  if (Column.FieldName = 'TYPEDescription') then begin

   dlTYPEDescription.Left := Rect.Left + DBGrid1.Left + Disp;

   dlTYPEDescription.Top := Rect.Top + DBGrid1.top + Disp;

   dlTYPEDescription.Width := Rect.Right – Rect.Left;

   dlTYPEDescription.Height := Rect.Bottom – Rect.Top;

   dlTYPEDescription.Visible := True;

  end;

 end;

end;

Dbgrid с цветными ячейками VI

Delphi 1

Установите defaultDrawing в false, и создайте собственный onDrawDataCell, в котором и задавайте нужный вам цвет ячеек. Примерно так:

procedure Tform1.DBgrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);

begin

 { выберите цвет для текста (font.color) и фона (brush.color) }

 if (field = table1Status) then begin

  { белый на красном }

  DBgrid1.canvas.font.color := clWhite;

  DBgrid1.canvas.brush.color := clRed;

 end else begin

  { черное на белом }

  DBgrid1.canvas.brush.color := clWhite;

  DBgrid1.canvas.font.color := clBlack;

 end;

 { рисуем ячейку }

 DBgrid1.canvas.textrect(rect, rect.left+2, rect.top+2, field.asString);

end;


procedure TMainForm.CharGridDrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var TheText: string;

begin

 TheText := CharGrid.Cells[Col, Row];

 with CharGrid.Canvas do begin

  { Определяем цвет фона в зависимости от состояния ячейки: }

  if gdFocused in State then Brush.Color := clYellow {Цвет ячейки с фокусом}

  else if gdSelected in State then Brush.Color := clOlive {Цвет выбранной ячейки}

  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

 G := TSampleDBGrid(myDBGrid1);

 if G.Row = I then …

 if G.Col = J then …

Дело в том, что TDBGrid является потомком TCustomGrid, который имеет несколько свойств, содержащих координаты сетки, но это не опубликовано в TDBGrid.

…из чего я могу заключить, что вы должны это сделать программным путем. Подразумеваем, что сетка уже существует, и у вас есть доступ к основной таблице TTable:

grid.colcount := dbGrid.fieldcount;

table.first;

row := 0;

while not table.eof do begin

 grid.rowcount := row + 1;

 for i := 0 to grid.colcount-1 do

  grid.cells[i,row] := dbGrid.fields[i].asString;

 table.next;

 inc(row);

end;

Могут быть ошибки, но это должно помочь.

Посмотрите на следующий код, он может вам помочь. Он берет у элемента управления свойсто 'Name' и помещает его в свойство 'Caption' метки.

unit Unit1;


interface


uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;


type TForm1 = class(TForm)

 Label1: TLabel;

 Edit1: TEdit;

 Edit2: TEdit;

 Button1: TButton;

 procedure Button1Click(Sender: TObject);

 procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

 procedure Edit2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

private

 { Private declarations }

public

 { Public declarations }

end;


var Form1: TForm1;


implementation


{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);

begin

 close;

end;


procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 Label1.Caption := TEdit(Sender).Name;

end;


procedure TForm1.Edit2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*