Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Дочерний компонент от ListBox (Delphi) (https://forum.antichat.xyz/showthread.php?t=161717)

Si{R}ius 07.12.2009 11:27

Дочерний компонент от ListBox (Delphi)
 
Для курсака нужно сообразить такую штуку. Нужно добавить новые поля, свойства и методы (или изменить старые).

Кто может подбросить идеи на этот счет?
Как можно усовершенствовать 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?


Время: 22:13