Announcement

Collapse
No announcement yet.

TImageList, TCustomTImageList und TImagesIndex

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TImageList, TCustomTImageList und TImagesIndex

    Ich habe eine Komponente, abgeleitet von TComponent, in der ich eine ImageList (TImageList) auswählen kann. Dazu habe ich noch eine Property Image (TImageIndex) um einen entspechendes Images auszuwählen. Mein Problem ist, dass in der Combobox (im Objektinspektor) von Images kein Images angezeigt wird. Mit ist nicht ganz klar, wie ich der Variable vom Type TImageIndex klar machen soll aus welcher Imageliste die Images geladen und angezeigt werden sollen!

    Hier mal ein die Komponente:

    unit Test;

    interface

    uses
    Windows,
    SysUtils,
    Messages,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    Menus,
    StdCtrls,
    ExtCtrls,
    Buttons,
    ActnList,
    ImgList,
    Consts ;

    type
    TTest = class(TComponent)
    private
    { Private-Deklarationen }
    FImageList : TImageList;
    FImage : TImageIndex;

    protected
    { Protected-Deklarationen }
    procedure SetImage (const Value : TImageIndex); virtual;
    procedure SetImageList (const Value: TImageList);
    public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    published
    { Published-Deklarationen }
    property Images : TImageList read FImageList write SetImageList;
    property Image : TImageIndex read FImage write SetImage default -1;
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Test', [TTest]);
    end;

    { TTest }

    constructor TTest.Create(AOwner: TComponent);
    begin
    inherited create(AOwner);
    FImage := -1;
    end;

    destructor TTest.Destroy;
    begin

    inherited;
    end;

    procedure TTest.SetImageList(const Value: TImageList);
    begin
    FImageList := Value;
    if Images <> nil then
    begin
    Images.FreeNotification(Self);
    end;

    end;

    procedure TTest.SetImage(const Value: TImageIndex);
    begin
    if Value <> FImage then
    begin
    FImage := Value;
    end;
    end;

    end.

  • #2
    Problem beseitigt, durch entsprechenden Property-Edito

    Comment


    • #3
      Und wie gena

      Comment


      • #4
        Hier die Lösung:

        Ich habe eine CustomClasse zur Darstellung geschrieben

        type
        TCustomImageIndexProperty = class( TIntegerProperty, ICustomPropertyListDrawing )
        protected
        {** Descendant class must override GetImageList **}
        function GetImageList: TCustomImageList; virtual; abstract;

        function GetImageHeight( Images: TCustomImageList; ACanvas: TCanvas ): Integer; virtual;
        function GetImageWidth( Images: TCustomImageList; ACanvas: TCanvas ): Integer; virtual;
        public
        function GetAttributes: TPropertyAttributes; override;
        procedure GetValues( Proc: TGetStrProc ); override;
        procedure Edit; override;

        // ICustomPropertyListDrawing
        procedure ListMeasureHeight( const Value: string; ACanvas: TCanvas; var AHeight: Integer );
        procedure ListMeasureWidth( const Value: string; ACanvas: TCanvas; var AWidth: Integer );
        procedure ListDrawValue( const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean );
        end;

        von dierser leite ich dann einen PropertyEditor wie folgt ab,
        damit ich nicht imm auf den PropertyNamen "Image" angewiesen bin.

        TImageIndexProperty = class( TCustomImageIndexProperty )
        protected
        function GetImageList: TCustomImageList; override;
        end;

        { TImageIndexProperty }

        function TImageIndexProperty.GetImageList: TCustomImageList;
        begin
        Result := GetObjectProp( GetComponent( 0 ), 'Images' ) as TCustomImageList;
        end;

        Dann nur noch Registrieren und es geht

        procedure Register;
        begin
        .....
        RegisterPropertyEditor(TypeInfo(TImageIndex),TRech te,'ImageUserGroup',TImageIndexProperty);
        end

        Comment

        Working...
        X