Конференция "Компоненты" » Как связать ImageList и ImageIndex [D7, WinXP]
 
  • Сергей Бастрыгин © (20.07.07 11:25) [0]
    При создании компоненты создаю два свойства

    property ImageIndex: TImageIndex read FImageIndex write SetImageIndex;
    property Images: TCustomImageList read FImages write SetImages;

    При этом в инспекторе на всех свойствах с типом integer (Tag, Width, Height) появился выпадающий список из Images.

    А ImageIndex показывается как integer, без иконок. А хотелось что-бы именно в нем был выпадающий список с наполнением от Images.

    как мне  связать между собой ImageIndex и Images?
  • DimaBr © (20.07.07 11:29) [1]

    > При этом в инспекторе на всех свойствах с типом integer
    > (Tag, Width, Height) появился выпадающий список из Images

    Очевидно что вы неправильно зарегистрировали редактор. Поумолчанию редактор на TImageIndex уже зарегистрирован.

    Покажите ваш код регистрации
  • Сергей Бастрыгин © (20.07.07 11:46) [2]
    Редактор я не регистрировал, и не нашел как это делается на других примерах
  • DimaBr © (20.07.07 11:55) [3]
    Покажите код вашего компонета
  • Сергей Бастрыгин © (20.07.07 11:58) [4]
    TBSVButton = class(TGraphicControl)
     private
       FCaption: TCaption;
       FCaptionAlignment: TAlignment;
       FCaptionHeight: Integer;
       FCaptionAlignmentVertical: TAlignmentVertical;
       FCaptionWidth: Integer;
       FImages: TCustomImageList;
       FMouseInControl: Boolean;
       FOnMouseEnter: TNotifyEvent;
       FTransparent: Boolean;
       //    MouseTimer: TTimer;
       FRectBorder: TRect;
       FRectInner: TRect;
       FWordWrap: Boolean;
       FImageChangeLink: TChangeLink;
       FImageIndex: TImageIndex;
       MLCanvas: TMultiLine;
       procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
       procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
       procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
       function IsImageIndexStored: Boolean;
       procedure SetCaption(const Value: TCaption);
       procedure SetCaptionAlignment(const Value: TAlignment);
       procedure SetImageIndex(const Value: TImageIndex);
       procedure SetImages(const Value: TCustomImageList);
       procedure SetTransparent(const Value: Boolean);
       procedure SetWordWrap(const Value: Boolean);
       procedure ImageListChange(Sender: TObject);
       procedure SetCaptionAlignmentVertical(const Value: TAlignmentVertical);
     protected
       { Protected declarations }
       FState: TButtonState;
       procedure DoMouseEnter; virtual;
       procedure DoMouseLeave; virtual;
       procedure Paint(); override;
       property MouseInControl: Boolean read FMouseInControl;
     public
       { Public declarations }
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
       procedure Loaded; override;
       procedure SetCaptionParam;
       procedure SetRects;
     published
       property Caption: TCaption read FCaption write SetCaption;
       property CaptionAlignment: TAlignment read FCaptionAlignment write
         SetCaptionAlignment;
       property CaptionAlignmentVertical: TAlignmentVertical read
           FCaptionAlignmentVertical write SetCaptionAlignmentVertical;
       property ImageIndex: TImageIndex read FImageIndex write SetImageIndex;
       property Images: TCustomImageList read FImages write SetImages;
       property Transparent: Boolean read FTransparent write SetTransparent default
         True;
       property WordWrap: Boolean read FWordWrap write SetWordWrap stored False;
       property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
     end;

    procedure Register;

    implementation

    procedure Register;
    begin
     RegisterComponents('FregatLib', [TBSVButton]);
    end;
  • DimaBr © (20.07.07 12:19) [5]
    не видно никаких коллизий, скорее всего действует чужой редактор. Посмотрите на другом компоненте как ведут себя всойства (Tag, Width, Height)
  • Сергей М. © (20.07.07 13:36) [6]
    Оффтоп:

    а что делает перекрытый метод Loaded в public ?
  • Сергей Бастрыгин © (20.07.07 14:35) [7]

    > DimaBr ©   (20.07.07 12:19) [5]

    на других компонентах у этих свойств стоит ComboBox, но с пустым списком, у меня этот ComboBox заполняется из Images
  • Сергей Бастрыгин © (20.07.07 14:39) [8]

    > Сергей М. ©   (20.07.07 13:36) [6]
    > Оффтоп: а что делает перекрытый метод Loaded в public ?

    Там вызывается метод устанавливающий FCaptionHeight и  FCaptionWidth
  • DimaBr © (20.07.07 14:42) [9]
    Кинте TTollBar, подключите Images и посмотрите на него свойства.
  • Сергей Бастрыгин © (20.07.07 14:42) [10]
    А на самом деле у меня будет еще два свойства Images_2 и Images_3, и к ним ImageIndex_2 и ImageIndex_3. Что необходимо указать чтобы в каждом ImageIndex_X показывался свой Images_X
  • Сергей Бастрыгин © (20.07.07 14:44) [11]

    > DimaBr ©   (20.07.07 14:42) [9]
    > Кинте TTollBar, подключите Images и посмотрите на него свойства.
    >

    попробую
  • DimaBr © (20.07.07 14:52) [12]

    >  меня будет еще два свойства

    Тогда зарегистрируйте свой редактор и наполняйте его.
    Для этого напишите наследника от


    TBrImageIndexProperty = class(TIntegerProperty, ICustomPropertyDrawing,ICustomPropertyListDrawing)
     protected
       function GetImages: TCustomImageList; virtual; abstract;
     public
       function GetAttributes: TPropertyAttributes; override;
       procedure GetValues( Proc: TGetStrProc ); 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 );
       property Images: TCustomImageList read GetImages;

       procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
       procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
    end;

    { TBrImageIndexProperty }

    function TBrImageIndexProperty.GetAttributes: TPropertyAttributes;
    begin
     Result := inherited GetAttributes + [ paValueList, paDialog ] - [ paSortList, paMultiSelect, paAutoUpdate, paSubProperties, paReadOnly ];
    end;

    procedure TBrImageIndexProperty.GetValues( Proc: TGetStrProc );
    var I: Integer;
    begin
     if Images <> nil then
       for I := 0 to Images.Count - 1 do Proc( IntToStr( I ) );
    end;

    procedure TBrImageIndexProperty.ListMeasureHeight( const Value: string; ACanvas: TCanvas; var AHeight: Integer );
    begin
     if Images <> nil then
       AHeight := Max( ACanvas.TextHeight('Wg'), Images.Height + 4 );
    end;

    procedure TBrImageIndexProperty.ListMeasureWidth( const Value: string; ACanvas: TCanvas; var AWidth: Integer );
    begin
     if Images <> nil then
       AWidth := AWidth + Images.Width + 4;
    end;

    procedure TBrImageIndexProperty.ListDrawValue( const Value: string; ACanvas: TCanvas; const ARect: TRect;ASelected: Boolean );
    var R: TRect;
       X: integer;
    begin
     R := ARect;
     try
       X := StrToInt( Value );
       ACanvas.FillRect( R );
       if (Images <> nil) and (X > -1) then begin
         R.Right := R.Left + ( R.Bottom - R.Top );
         Images.Draw( ACanvas, R.Left + 2, R.Top + 2, X, True );
         R := Rect(R.Right,R.Top,ARect.Right,R.Bottom);
       end;
     finally
       {$IFDEF DELPHI6}
       DefaultPropertyListDrawValue( Value, ACanvas, R, ASelected );
       {$ELSE}
       inherited ListDrawValue( Value, ACanvas, R, ASelected );
       {$ENDIF}
     end;
    end;

    procedure TBrImageIndexProperty.PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
    begin
     DefaultPropertyDrawName(self,ACanvas, ARect);
    end;

    procedure TBrImageIndexProperty.PropDrawValue(ACanvas: TCanvas;const ARect: TRect; ASelected: Boolean);
    var R: TRect;
       B: TBitMap;
       X: integer;
    begin
     x := StrToInt( Value );
     b := TBitMap.Create;
     R := ARect;
     if X >= 0 then R.Right := R.Left + ( R.Bottom - R.Top )+2;
     try
       ACanvas.FillRect( R );
       if (Images <> nil) and (X >= 0) then begin
         b.Width := Images.Width;
         b.Height := ARect.Bottom - ARect.Top;
         Images.Draw(b.Canvas,0,0,X, True);
         b.Transparent := true;
         ACanvas.StretchDraw(Rect(ARect.Left,ARect.Top,ARect.Left+b.Width,ARect.Top+b.Height),b);
         R := Rect( R.Right, ARect.Top, ARect.Right, ARect.Bottom );
       end;
     finally
       {$IFDEF DELPHI6}
       DefaultPropertyDrawValue(self,ACanvas,R);
       {$ELSE}
       inherited PropDrawValue( ACanvas, ARect.Bottom , ASelected );
       {$ENDIF}
     end;
     b.Free;
    end;



    приблизительно так


    TBrAllImageIndexProperty = class(TBrImageIndexProperty)
     protected
       function GetImages: TCustomImageList;override;
    end;

    function TBrAllImageIndexProperty.GetImages: TCustomImageList;
    begin
     Result := nil;
     if GetComponent(0) is TBSVButton then
       Result := TBSVButton(GetComponent(0)).Images;
    end;

    procedure Register;
    begin
     RegisterPropertyEditor(TypeInfo(TImageIndex), TBSVButton,'ImageIndex',TBrAllImageIndexProperty);
    end;


  • Сергей Бастрыгин © (20.07.07 15:09) [13]
    Спасибо, есть над чем поработать, буду разбираться
  • DimaBr © (20.07.07 15:16) [14]
    Пожалуйста, обращайтесь !
  • имя (31.03.09 14:52) [15]
    Удалено модератором
  • имя (31.03.09 14:53) [16]
    Удалено модератором
 
Конференция "Компоненты" » Как связать ImageList и ImageIndex [D7, WinXP]
Есть новые Нет новых   [119092   +75][b:0][p:0.003]