Autor Beitrag
M.Mü
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: Mo 24.04.06 23:02 
Hallo,

versuche mich gerade an meiner ersten eigenen Komponente ILSpeedButton: ein SpeedButton, dem man über eine ImageList Bitmaps zuweisen kann. Nur bin ich mir net ganz sicher, ob die Programmierung dessen in Ordnung ist.
Was mir zum Beispiel aufgefallen ist: Immer wenn ich im Objektinspektor die ImageList zuweise, wird dort nicht der Name der ImageList angezeigt, sondern "ILSpeedButton1." also der Name des SpeedButtons mit einem Punkt.

Hier der Quellcode:
Die auskommentierten Zeilen mit "oZ" ist eine Version gewesen, in der ich keinen Zeiger sondern ein Objekt FImageLIst verwendet hatte, allerdings mit dem gleichen Ergebnis.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit ILSpeedButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Buttons, Dialogs, Graphics;

type
  TILSpeedButton = class(TSpeedButton)
  private
    { Private-Deklarationen }
    FImageIndex: Byte;
    {oZ: FImageList: TImageList;}
    FImageList: ^TImageList;
    procedure SetImageIndex(ImageIndex: Byte);
    procedure SetImageList(ImageList: TImageList);
    function GetImageList: TImageList;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;

  published
    { Published-Deklarationen }
    property ImageIndex: Byte read FImageIndex write SetImageIndex;
    {oZ: property ImageList: TImageList read FImageList write SetImageList;}
    property ImageList: TImageList read GetImageList write SetImageList;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('eigene Komponente', [TILSpeedButton]);
end;

constructor TILSpeedButton.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TILSpeedButton.Destroy;
begin
  {oZ: if FImageList <> nil then FImageList.Free;}
  
  inherited;
end;

procedure TILSpeedButton.SetImageIndex(ImageIndex: Byte);
var Bitmap: TBitmap;
begin
  if FImageList <> nil then
  begin
    Bitmap := TBitmap.Create;
    FImageList.GetBitmap(ImageIndex,Bitmap);
    Glyph.Assign(Bitmap);
    Bitmap.Free;
    FImageIndex := ImageIndex;
  end;
end;

function TILSpeedButton.GetImageList: TImageList;
begin
  result := FImageList^;
end;

procedure TILSpeedButton.SetImageList(ImageList: TImageList);
begin
  FImageList := @ImageList;
  SetImageIndex(0);
  {oZ: if ImageList <> nil then
  begin
    if FImageList = nil then FImageList := TImageList.Create(self);
    FImageList.Clear;
    FImageList.AddImages(ImageList);
    SetImageIndex(0);
  end;}

end;

end.


Worin kann der Fehler liegen?

VG M.Mü

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 25.04.06 08:16 
Hmmm.. eine Variable vom Type TImageList ist bereits ein Zeiger auf ein Objekt. Weiterhin kopierst du die ImageList in der Set-Methode, das muss eigentlich auch nicht sein. Du willst doch schließlich, das sich alle Änderungen der ImageList sofort auf den Speedbutton auswirken, insofern ist die statische Zuweisung and das Glyph des Speedbuttons auch nicht korrekt.

Ich hab die Sourcen grad nicht parat, aber ich denke, Du müsstest die Paint-methode überschreiben, um statt des Glyph die entsprechende Bitmap aus der Imagelist zu zeichnen.

Ansonsten denkst du imho einen Tick zu kompliziert mit deinen Bemühungen, die Eigenschaften lokal zu kopieren.

_________________
Na denn, dann. Bis dann, denn.
M.Mü Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: Di 25.04.06 22:21 
Ich denke zu kompliziert? oh, jetzt bricht gerade ne Welt zusammen. :-( Nein, im ernst: Sieht so aus, als hätt ich etwas mehr Nachholbedarf als gedacht.

Die Set-Methode ist doch aber nötig, um das erste Bild zu setzen. Andernfalls müsst ich doch erst den Index beschreiben, um überhaupt ein Bild auf dem Button erscheinen zu lassen.
Wie kann ich die Zuweisung an das Glyph machen, wenn nicht so (also statisch).

Kannst Du mir es bitte erklären oder zumindest einen nützlichen Link geben.

Mein Quellcode schaut jetzt so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit ILSpeedButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Buttons, Dialogs, Graphics;

type
  TILSpeedButton = class(TSpeedButton)
  private
    { Private-Deklarationen }
    FImageIndex: Byte;
    FImageList: TImageList;
    procedure SetImageIndex(ImageIndex: Byte);
    procedure SetImageList(ImageList: TImageList);
    function GetImageList: TImageList;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;
  published
    { Published-Deklarationen }
    property ImageIndex: Byte read FImageIndex write SetImageIndex;
    property ImageList: TImageList read FImageList write SetImageList;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('M.Mue', [TILSpeedButton]);
end;

constructor TILSpeedButton.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TILSpeedButton.Destroy;
begin
  inherited;
end;

procedure TILSpeedButton.SetImageIndex(ImageIndex: Byte);
var Bitmap: TBitmap;
begin
  if FImageList <> nil then
  begin
    Bitmap := TBitmap.Create;
    FImageList.GetBitmap(ImageIndex,Bitmap);
    Glyph.Assign(Bitmap);
    Bitmap.Free;
    FImageIndex := ImageIndex;
  end;
end;

function TILSpeedButton.GetImageList: TImageList;
begin
  result := FImageList;
end;

procedure TILSpeedButton.SetImageList(ImageList: TImageList);
begin
  FImageList := ImageList;
  SetImageIndex(0);
end;

end.


Hab Dank.

VG M.Mü

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 25.04.06 22:41 
Merk dir doch einfach den ImageIndex und die ImageList. Ich hab mir den Quellcode eines TSpeedbutton nicht angeschaut, aber prinzipiell solltest du eben auf die Glyph-Eigenschaft verzichten und entweder die Get-Methode des Glyphs überschreiben, sodaß beim Get immer das bild aus der ImageList genommen wird. Wenn das nicht geht, musst Du die Paint-Methode eben überschreiben und dann nicht das Glyph auf den Button pinseln, sondern das Bild aus der Imagelist.

_________________
Na denn, dann. Bis dann, denn.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 16.06.06 14:50 
warum eigentlich eine eigene Komponente? Wie wärs so:
ImgList.GetBitmap(0,Form1.SpeedButton1.Glyph);

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)