Выбрать главу

Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия?

Ответ:

В примере создается компонент, унаследованный от TTrackbar который переопределяет метод CreateParams и убират флаг TBS_ENABLESELRANGE из Style. Константа TBS_ENABLESELRANGE обьявленна в модуле CommCtrl.

Пример:

uses CommCtrl, ComCtrls;

type TMyTrackBar = class(TTrackBar)

 procedure CreateParams(var Params: TCreateParams); override;

end;

procedure TMyTrackBar.CreateParams(var Params: TCreateParams);

begin

 inherited;

 Params.Style := Params.Style and not TBS_ENABLESELRANGE;

end;

var MyTrackbar : TMyTrackbar;

procedure TForm1.Button1Click(Sender: TObject);

begin

 MyTrackBar := TMyTrackbar.Create(Form1);

 MyTrackbar.Parent := Form1;

 MyTrackbar.Left := 100;

 MyTrackbar.Top := 100;

 MyTrackbar.Width := 150;

 MyTrackbar.Height := 45;

 MyTrackBar.Visible := true;

end;

Вопрос:

Мне нужен временный canvas, но когда я пытаюсь его создать получаю сообщения об ошибках. Как создать TCanvas?

Ответ:

Создайте Bitmap и используйте свойство canvas класса TBitmap. Пример создает Bitmap, рисует на его canvas'е, выводит этот canvas на форму и освобождает bitmap.

Пример:

procedure TForm1.Button1Click(Sender: TObject);

var bm : TBitmap;

begin

 bm := TBitmap.Create;

 bm.Width := 100;

 bm.Height := 100;

 bm.Canvas.Brush.Color := clRed;

 bm.Canvas.FillRect(Rect(0, 0, 100, 100));

 bm.Canvas.MoveTo(0, 0);

 bm.Canvas.LineTo(100, 100);

 Form1.Canvas.StretchDraw(Form1.ClientRect,Bm);

 bm.Free;

end;

Вопрос:

В некоторых видео режимах прозрачная часть glyph'а стандартного TBitBtn становится видной. Как этого избежать?

Ответ:

В примере используется техника закраски прозрачной части glyph'а цветом кнопки на которой он находится — таким образом glyph кажется прозрачным.

Пример:

function InitStdBitBtn(BitBtn : TBitBtn; kind : TBitBtnKind) : bool;

var

 Bm1 : TBitmap;

 Bm2 : TBitmap;

begin

 Result := false;

 if Kind = bkCustom then exit;

 Bm1 := TBitmap.Create;

 case Kind of

 bkOK : Bm1.Handle := LoadBitmap(hInstance, 'BBOK');

 bkCancel : Bm1.Handle := LoadBitmap(hInstance, 'BBCANCEL');

 bkHelp : Bm1.Handle := LoadBitmap(hInstance, 'BBHELP');

 bkYes : Bm1.Handle := LoadBitmap(hInstance, 'BBYES');

 bkNo : Bm1.Handle := LoadBitmap(hInstance, 'BBNO');

 bkClose : Bm1.Handle := LoadBitmap(hInstance, 'BBCLOSE');

 bkAbort : Bm1.Handle := LoadBitmap(hInstance, 'BBABORT');

 bkRetry : Bm1.Handle := LoadBitmap(hInstance, 'BBRETRY');

 bkIgnore : Bm1.Handle := LoadBitmap(hInstance, 'BBIGNORE');

 bkAll : Bm1.Handle := LoadBitmap(hInstance, 'BBALL');

 end;

 Bm2 := TBitmap.Create;

 Bm2.Width := Bm1.Width;

 Bm2.Height := Bm1.Height;

 Bm2.Canvas.Brush.Color := ClBtnFace;

 Bm2.Canvas.BrushCopy(Rect(0, 0, bm2.Width, bm2.Height), Bm1, Rect(0, 0, Bm1.width, Bm1.Height), Bm1.canvas.pixels[0,0]);

 Bm1.Free;

 LockWindowUpdate(BitBtn.Parent.Handle);

 BitBtn.Kind := kind;

 BitBtn.Glyph.Assign(bm2);

 LockWindowUpdate(0);

 Bm2.Free;

 Result := true;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 InitStdBitBtn(BitBtn1, bkOk);

end;

Вопрос:

Создание PolyPolygon используя массив точек?

Ответ:

Polygon — метод компонента TCanvas получает в качестве параметра динамический массив точек. Функция PolyPolygon() из Windows GDI получает указатель на массив точек.

Пример:

procedure TForm1.Button1Click(Sender: TObject);

var

 ptArray : array[0..9] of TPOINT;

 PtCounts : array[0..1] of integer;

begin

 PtArray[0] := Point(0, 0);

 PtArray[1] := Point(0, 100);

 PtArray[2] := Point(100, 100);

 PtArray[3] := Point(100, 0);

 PtArray[4] := Point(0, 0);

 PtCounts[0] := 5;

 PtArray[5] := Point(25, 25);

 PtArray[6] := Point(25, 75);

 PtArray[7] := Point(75, 75);

 PtArray[8] := Point(75, 25);

 PtArray[9] := Point(25, 25);

 PtCounts[1] := 5;

 PolyPolygon(Form1.Canvas.Handle, PtArray,PtCounts,2);

end;

Вопрос:

Как создать невизуальный компонент без иконки, которая изображается в палитре компонентов в "design-time" (вроде TField)?

Ответ:

Невизуальные компоненты без иконки удобны для субкомпонентов, связанных с какими-то другими компонентами. Создайте компонент как обычно, но используйте RegisterNoIcon вместо RegisterComponent.

Вопрос:

Как показывать нестандартный встроенный редактор (inplace editor) в ячейке stringgrid (например combobox).

Ответ:

См. пример

Пример:

procedure TForm1.FormCreate(Sender: TObject);

begin

 {Высоту combobox'а не изменишь, так что вместо combobox'а будем изменять высоту строки grid'а !}

 StringGrid1.DefaultRowHeight := ComboBox1.Height;

 {Спрятать combobox}

 ComboBox1.Visible := False;

 ComboBox1.Items.Add('Delphi Kingdom');

 ComboBox1.Items.Add('Королевство Дельфи');

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

 {Перебросим выбранное в значение из ComboBox в grid}

 StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] :=ComboBox1.Items[ComboBox1.ItemIndex];

 ComboBox1.Visible := False;

 StringGrid1.SetFocus;

end;

procedure TForm1.ComboBox1Exit(Sender: TObject);

begin

 {Перебросим выбранное в значение из ComboBox в grid}

 StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] :=ComboBox1.Items[ComboBox1.ItemIndex];

 ComboBox1.Visible := False;