PDA

Просмотр полной версии : Дочерний компонент от ListBox (Delphi)


Si{R}ius
07.12.2009, 11:27
Для курсака нужно сообразить такую штуку. Нужно добавить новые поля, свойства и методы (или изменить старые).

Кто может подбросить идеи на этот счет?
Как можно усовершенствовать ListBox?

slesh
07.12.2009, 13:20
по этой теме могу посоветовать глянуть 5005 статей по Delphi
и там есть статейка "Прозрачный TListBox" и "Расширение компонента ListBox"
И там создается новый объект наследник TListBox с измененными свойствами.
Расширение компонента ListBox - довольно просто и хорошо всё описано.

Si{R}ius
25.12.2009, 23:45
Пытаюсь поместить в компонент код, меняющий цвет текста:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as TListBox do
begin
Canvas.FillRect(Rect);
Canvas.Font.Color := TColor(clGreen);
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]);
end;
end;


В компоненте у меня он выглядит так:

unit MyListBox;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMyListBox = class(TListBox)
private
{ Private declarations }
FColorText:boolean;
FCanvas: TControlCanvas;
procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);

protected
{ Protected declarations }
procedure setColorText(value:boolean);

public
{ Public declarations }
constructor Create (AOwner:TComponent); override;

published
{ Published declarations }
property ColorText: boolean read FColorText write setColorText default false;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TMyListBox]);
end;

constructor TMyListBox.Create (AOwner:TComponent);
begin
Inherited Create(AOwner);
FColorText:=false;
FCanvas:=TControlCanvas.Create;
FCanvas.Control:=Self;
end;

procedure TMyListBox.setColorText (value:boolean);
begin
with FCanvas.Control as TListBox do
begin
Canvas.FillRect(Rect);
Canvas.Font.Color := TColor(clGreen);
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]);
end;
end;
end.

Работать это дело не хочет, судя по всему, нужно применить где-то ListBox1DrawItem, а как это сделать, ума не приложу..Хелпаните, кто с таким сталкивался.

Si{R}ius
26.12.2009, 13:22
Где в этом коде можно объявить процедуру DrawItem?