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 Constructor löscht Entwurfszeitinhalte (https://www.delphipraxis.net/67080-constructor-loescht-entwurfszeitinhalte.html)

helen 9. Apr 2006 11:45


Constructor löscht Entwurfszeitinhalte
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen, ich habe mir eine Komponente gebastelt, welche Images in einem Image darstellt.
Die Komponente liegt im Anhang und funktioniert auch in soweit, dass ich neue Images einfügen, verschieben, und resizen kann.

Das Problem ist nur:
Wenn ich das Image der TImageInImage Komponente in der Entwurfszeit ändere ist die Änderung zur Laufzeit verschwunden.

Ich habe den Verdacht, dass der Constructor beim Starten die Änderungen überschreibt.

Der Code zum Benutzen der Komponente lautet:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
  var img : TImageInImage_Element;
begin
  img := TImageInImage_Element.Create(ImageInImage1);
//         img.Image.Picture.LoadFromFile('Bild2.jpg');

         ImageInImage1.Images.Add (img);

  img.Top := 0;
  img.Left := 0;
end;
Zweites Problem: wenn ich
Delphi-Quellcode:
img.Image.Picture.LoadFromFile('Bild2.jpg');
ausführen lasse, kommt die Fehlermeldung Unbekannte Dateierweiterung .jpg. Wie kann ich das Problem beheben?

Danke für die Hilfe.
Gruß
Helen

Aenogym 9. Apr 2006 11:48

Re: Constructor löscht Entwurfszeitinhalte
 
hi,

zu deinem zweiten problem: binde die unit jpeg in deine uses ein ;)

aeno

SirThornberry 9. Apr 2006 11:53

Re: Constructor löscht Entwurfszeitinhalte
 
der Construktur kann die Änderungen doch gar nicht überschreiben. Schließlich werden dinge die im Objectinspektor zugewiesen werden (in der DFM gespeichert) erst nach dem creieren und somit erst nach aufruf des Constructors geladen.

helen 9. Apr 2006 12:15

Re: Constructor löscht Entwurfszeitinhalte
 
Aber warum gehen die Daten dann verloren?

Hawkeye219 9. Apr 2006 12:18

Re: Constructor löscht Entwurfszeitinhalte
 
Zitat:

Zitat von SirThornberry
der Construktur kann die Änderungen doch gar nicht überschreiben. Schließlich werden dinge die im Objectinspektor zugewiesen werden (in der DFM gespeichert) erst nach dem creieren und somit erst nach aufruf des Constructors geladen.

Das ist nicht ganz richtig, das Laden der .dfm-Datei ist ein Bestandteil des Constructors. Durch ein Überschreiben des Constructors kann man durchaus Änderungen durchführen. Es kommt ganz auf die Reihenfolge der Anweisungen an:

Delphi-Quellcode:
constructor TForm1.Create(aOwner: TComponent);
begin
  Button1.Caption := 'Hallo Welt!';
  inherited;
end;

constructor TForm1.Create(aOwner: TComponent);
begin
  inherited;
  Button1.Caption := 'Hallo Welt!';
end;
Im ersten Beispiel sieht man im Button die im Objektinspektor eingestellte Beschriftung, im zweiten Beispiel die vom Programm geänderte. Änderungen, die im Eventhandler für OnCreate durchgeführt werden, überschreiben immer die im Objektinspektor eingestellten Werte.

Gruß Hawkeye

SirThornberry 9. Apr 2006 12:36

Re: Constructor löscht Entwurfszeitinhalte
 
die Einstellungen die im Objectinspektor getätigt werden werden aber nicht während des Creierens zugewiesen sondern erst nach dem der Constructor abgearbeitet wurde. Denn bevor nicht aus dem Constructor zurück gekehrt wurde ist kein Instanzhandle vorhanden dem man entsprechende Dinge zuweisen kann. Schließlich wird ja mit "instanz.property := value" gearbeitet und solange die instanz nicht bekannt ist (wird ja erst vom Constructor zurück geliefert) kann nix zugewiesen werden. Eine Ausnahme stellt de TForm da weil dort die DFM (Ressource) im Constructor geladen wird.

Hawkeye219 9. Apr 2006 12:51

Re: Constructor löscht Entwurfszeitinhalte
 
Yep, meine Ausführung bezogen sich auch auf TForm, da Helen in ihrem ersten Posting FormCreate ins Spiel brachte. Somit sind wir einer Meinung :)

Gruß Hawkeye

SirThornberry 9. Apr 2006 12:54

Re: Constructor löscht Entwurfszeitinhalte
 
jup, in dem Sinne sind wir dann einer Meinung. In diesem konkreten Beispiel ging es dann darum das seine neue Klasse (welche wohl auf dem Form liegt (zumindest eine instanz davon)) im Konstruktor einstellungen aus der DFM überschreibt. Ich hab die Befürchtung das er denkt im Construktor bereits auf eingenschaften zugreifen zu können die im Objectinspektor (dfm) ingestellt wurden.

Hawkeye219 9. Apr 2006 13:23

Re: Constructor löscht Entwurfszeitinhalte
 
Ich habe mir den Quelltext der Komponente mal angesehen und den Fehler (wahrscheinlich) gefunden. Die Komponente TImageInImage enthält eine Subkomponente vom Typ TImage. Einstellungen an dieser Subkomponente zur Designzeit werden nicht in der .dfm-Datei gespeichert, weil ein Aufruf von SetSubComponent fehlt.

Der Constructor von TImageInImage muß folgendermaßen abgeändert werden:

Delphi-Quellcode:
Constructor TImageInImage.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);

  _ImageListe := TImageInImage_List.Create (Self);

  _Image := TImage.Create(Self);
  _Image.Parent := Self;
  _Image.Align := alClient;
  _Image.SetSubComponent(True); // <<-- diese Zeile ist neu!
end;
Gruß Hawkeye

helen 9. Apr 2006 13:50

Re: Constructor löscht Entwurfszeitinhalte
 
Super!!!
Das hatte gefehlt.
Vielen Dank Hawkeye.

Gruß
Helen


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 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