32 Урока Borland Delphi



             

Урок 31 - часть 11


III. Обработчик события OnDrawDataCell.

Большое количество задач можно решить, если использовать событие перерисовки ячейки в DBGrid. Например: выделить цветом отрицательные значения или целиком колонку, вывести картинку в ячейке DBGrid, поместить DBCheckBox или DBComboBox в ячейку и многое другое. Ниже приведен вариант, в котором отрицательные значения выделяются красным цветом:

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const

Rect: TRect; Field: TField; State: TGridDrawState);

begin

with DBGrid1.Canvas do begin

if (Not (gdFocused in State)) and

(Field.FieldName='BALANCE') and

(Field.AsFloat<0) then begin

Brush.Color:=clRed;

Font.Color:=clWhite;

end;

FillRect(Rect);

TextOut(Rect.Left, Rect.Top, Field.Text);

end;

end;
 
 
 
  1.6 Окна в Delphi Большинство видимых компонентов в Delphi (все компоненты, имеющие предком класс TWinControl) являются для Windows полноценными окнами. При доступе к этим компонентам из Windows API используется свойство Handle каждого компонента. Ниже приводится несколько “фокусов”, которые можно произвести с окнами компонентов, включая TForm.

  1. “Перетаскивание” окна без помощи Caption.
Достаточно известен способ “перетаскивания” окна приложения без Caption (caption - поле заголовка вверху формы), этот способ описан и в разделе технической информации на CD-ROM с Delphi 1.02.

Для решения этой задачи нужно переопределить обработчик события WM_NCHITTEST для окна следующим образом:
 
 
 
 

type

TForm1 = class(TForm)

. . .

private

procedure WMNCHitTest(var M: TWMNCHitTest);

message wm_NCHitTest;

. . .

end;

. . .

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);

begin

{вызов унаследованного обработчика события}

inherited;

{если событие произошло в клиентской области,}

if M.Result = htClient then

{то пусть Windows думает, что это произошло на Caption}

M.Result := htCaption;

end;

Теперь окно можно будет переместить на экране, даже если оно совсем не имеет Caption. Однако, неприятно то, что для такого окна не будут вызываться обработчики событий, связанных с мышкой (OnClick, OnMouseMove и т.д.).




Содержание  Назад  Вперед