Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ImageList im Constructor erzeugen (https://www.delphipraxis.net/10489-imagelist-im-constructor-erzeugen.html)

phlux 19. Okt 2003 19:38


ImageList im Constructor erzeugen
 
Moinsen!
Ich schreibe im Moment eine Kompo abgeleitet von der TToolbar. Jetzt möchte ich im Constructor eine ImageList erzeugen, und zwar mit folgendem Code:
Delphi-Quellcode:
constructor TDriveToolBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Flat := True;
  Height := 26;
  Width := 185;
  Align := alNone;
  ShowCaptions := True;
  EdgeBorders := [ebTop, ebBottom, ebLeft, ebRight];
  fImageList := TImageList.Create(Self);
  Images := fImageList;
  EnumDrives;
end;
Nur krieg ich jetzt als Fehler Element '' hat kein übergeordnetes Fenster. Ich weiß schon das es am Erzeugen der ImageList liegt, weil wohl noch nicht die Toolbar erstellt ist. Wenn ich jetzt allerdings das ganze in die Loaded Prozedur schreibe, wird der Code zur DesignTime nicht aufgerufen und zur Laufzeit kommt nur BS raus, sprich es läuft nicht so wie es sollte :? . Hat jemand ein Plan wie ich es zum Laufen krieg??

mfg phlux :hi:

Leuselator 20. Okt 2003 00:20

Re: ImageList im Constructor erzeugen
 
probier mal:
Delphi-Quellcode:
constructor TDriveToolBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
    if (AOwner is TWincontrol)
      then Parent := TWincontrol(AOwner);
  Flat := True;
  Height := 26;
  Width := 185;
  Align := alNone;
  ShowCaptions := True;
  EdgeBorders := [ebTop, ebBottom, ebLeft, ebRight];
  fImageList := TImageList.Create(Self);
  Images := fImageList;
  EnumDrives;
end;

phlux 20. Okt 2003 10:22

Re: ImageList im Constructor erzeugen
 
Hi Leuselator!
Danke für den Tipp, jetzt klappt das erstellen, mein einziges Problem ist
a) beim Start der Anwendung mit der Kompo gibts jetzt ne Exception TToolButton nicht gefunden.
Wichtiger jedoch und auch das Problem hier betreffend, beim Beenden gibts folgende Exception:
b) Element 'DriveToolBar1' hat kein übergeordnetes Fenster!
Was kann ich dagegen tun?

Mein Destructor sieht wie folgt aus:
Delphi-Quellcode:
destructor TDriveToolBar.Destroy;
var
  i: Integer;

begin
  fImageList.Free;
  //Gibt die erstellten TToolButtons frei
  for i := 0 to ButtonCount - 1 do
  begin
    Self.Buttons[0].Free;
  end;
  inherited Destroy;
end;
mfg phlux :hi:

Christian Seehase 20. Okt 2003 17:43

Re: ImageList im Constructor erzeugen
 
Moin Phlux,

guckst Du hier:

Nummerierung von Komponenten

mit besonderem Augenmerk auf CreateWnd.
Damit dürfte sich dann auch Dein ursprüngliches Problem erledigen.

Kamil 20. Okt 2003 18:29

Re: ImageList im Constructor erzeugen
 
Bin mir jetzt nicht 100%ig sicher aber versuchs mal mit
Code:
fImageList := TImageList.Create(nil);
Falls du TImageList.Create(self); nimms, dann musst du die Komponente nicht freigeben. Das geschieht dann automatisch.

Müsste es nicht so aussehen:
Code:
  for i := 0 to ButtonCount - 1 do
  begin
    Self.Buttons[i].Free;
  end;

phlux 20. Okt 2003 18:39

Re: ImageList im Constructor erzeugen
 
Hi Kamil!
Werde deinen Vorschlag gleich mal ausprobieren, die Buttons werden schon richtig so freigegeben. Ich kanns schlecht erklären, also wenn du dir die Buttons alle übereinander vorstellst und den untersten wegnimmst rutschen die oberen nach, nach deiner methode würde ich dann irgendwann eine Exception kriegen weil weiter oben keine Buttons mehr sind.
Edit: Nein so funktioniert es auch nicht.

Leuselator 20. Okt 2003 22:46

Re: ImageList im Constructor erzeugen
 
@Christian: ich verstehe nicht ganz, wieso die in dem von Dir verlinkten Thread genannte CreateWnd das Problem beheben soll. Allerdings würde ich das gern verstehen, da ich mit einigen meiner Komponenten auch die Fehlermeldung des nicht vorhandenen übergeordneten Fensters bekomme:-) Also: was ist der Hintergrund?

Christian Seehase 21. Okt 2003 00:51

Re: ImageList im Constructor erzeugen
 
Moin Leuselator,

der Hintergrund ist folgender:
Während Create abgearbeitet wird, existiert das übergeordnete Fenster, die Instanz der Klasse, noch nicht vollständig, bei CreateWnd hingegen schon, so dass man hier den Parent zuweisen kann.
Dies sollte man aber auch nur einmal tun, da CreateWnd öfter aufgerufen wird.

Nimmt man natürlich den Owner so funktioniert das zwar auch, wenn der Typ stimmt, aber man darf dabei nicht vergessen, dass eine visuelle Komponente immer relativ zum Parent angezeigt wird. Der Owner könnte auch nil sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz