Дочерний компонент от ListBox (Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Si{R}ius, 7 Dec 2009.

  1. Si{R}ius

    Si{R}ius Member

    Joined:
    13 Nov 2008
    Messages:
    95
    Likes Received:
    36
    Reputations:
    0
    Для курсака нужно сообразить такую штуку. Нужно добавить новые поля, свойства и методы (или изменить старые).

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

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    по этой теме могу посоветовать глянуть 5005 статей по Delphi
    и там есть статейка "Прозрачный TListBox" и "Расширение компонента ListBox"
    И там создается новый объект наследник TListBox с измененными свойствами.
    Расширение компонента ListBox - довольно просто и хорошо всё описано.
     
    1 person likes this.
  3. Si{R}ius

    Si{R}ius Member

    Joined:
    13 Nov 2008
    Messages:
    95
    Likes Received:
    36
    Reputations:
    0
    Пытаюсь поместить в компонент код, меняющий цвет текста:

    Code:
     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;
    
    В компоненте у меня он выглядит так:

    Code:
    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, а как это сделать, ума не приложу..Хелпаните, кто с таким сталкивался.
     
  4. Si{R}ius

    Si{R}ius Member

    Joined:
    13 Nov 2008
    Messages:
    95
    Likes Received:
    36
    Reputations:
    0
    Где в этом коде можно объявить процедуру DrawItem?