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/)
-   -   Prism Komponente erweitern (https://www.delphipraxis.net/76181-komponente-erweitern.html)

gfjs 31. Aug 2006 04:15


Komponente erweitern
 
Guten Morgen.

Ich habe erstmals den Versuch gestartet, eine Komponente (Label) zu erweitern. Was mich dabei erst einmal zum Verzweifeln gebracht hat, waren die Fehlermeldungen bei dem Versuch
Delphi-Quellcode:
TMyLabel = class(System.Windows.Forms.Label);
einzugeben, weil Auswahlliste nach "System.", nach "System.Windows." und "System.Windows.Forms." immer noch leer blieb. Mangelndes Selbstbewußtsein ließ mich annehmen, dass ich einen Fehler gemacht hatte und ich versuchte erst einmal alles mögliche, bis ich mich entschloss das einfach zu ignorieren.

Jetzt ist mir also gelungen, die Komponente zu erweitern und es klappt auch. Allerdings bin ich mir nicht so recht sicher, ob ich alles richtig gemacht habe oder ob nur zufällig noch kein Fehler aufgetreten ist. Unsicher bin ich mir vor allem bei Create und Dispose - die kommen mir etwas dürftig vor. Deshalb bitte ich Euch, mal kurz meinen Code zu prüfen.
Delphi-Quellcode:
  TMyLabel = class(System.Windows.Forms.&Label)
    private
      FHoch : integer;
      FBreit : integer;
    published
      property Hoch : Integer read FHoch write FHoch;
      property Breit : Integer read FBreit write FBreit;
    strict protected
      procedure Dispose(Disposing: Boolean); override;
    private
      constructor Create; overload;
  end;

constructor TMyLabel.Create;
begin
  inherited Create;
  //
  // Erforderlich für die Unterstützung des Windows Forms-Designers
  //
end;

procedure TMyLabel.Dispose(Disposing: Boolean);
begin
  inherited Dispose(Disposing);
end;
Vielen Dank und noch einen schönen Tag.

Gruß Jürgen.

Jürgen Thomas 31. Aug 2006 08:09

Re: Komponente erweitern
 
Guten Morgen, Jürgen,
Zitat:

Zitat von gfjs
Auswahlliste nach "System.", nach "System.Windows." und "System.Windows.Forms." immer noch leer blieb.

Die 2005-IDE enthält viele kleine Fehler; und möglicherweise ist auch die 2006-IDE davor nicht gefeit. Ein ähnliches Problem hatten wir ja bereits diskutiert; es ist auch denkbar, dass die IDE während der Eingabe nach Fehlern sucht und deshalb nicht dazu kommt, die Felder vorzuschlagen...

An Deinem Code fallen mir folgende Punkte auf:
Delphi-Quellcode:
private
      FHoch : integer;
      FBreit : integer;
Darauf könntest Du verzichten, weil Width/Height sowieso feste Eigenschaften sind. Lass Dir lieber etwas 'Neues' einfallen.
Delphi-Quellcode:
strict protected
      procedure Dispose(Disposing: Boolean); override;
Das 'Aufräumen' übernimmt unter NET grundsätzlich der Garbage Collector:
Zitat:

Zitat von NET-SDK Destruktoren
Der Programmierer kann nicht steuern, wann der Destruktor aufgerufen wird, da dies durch den Garbage Collector bestimmt wird. Der Garbage Collector sucht nach Objekten, die von der Anwendung nicht mehr verwendet werden. Er zerstört diese Objekte und gibt ihren Speicherplatz wieder frei. Destruktoren werden darüber hinaus beim Beenden des Programms aufgerufen.

Wenn Du gezielt Massnahmen im Zusammenhang mit dem Aufräumen erzwingen willst, dann empfehlen sich Ereignisse z.B. im Zusammenhang mit Form_Close o.a. oder auch innerhalb Deiner Komponente.

Ich hoffe, das hilft Dir. Jürgen

gfjs 31. Aug 2006 08:30

Re: Komponente erweitern
 
Guten Morgen, Jürgen.

Vielen Dank für Deine Hinweise.

Das mit dem FHoch und FBreit hat (zumindest für mich) schon seine Richtigkeit. Ich speichere darin von Height/Width abweichende Werte, da das Label unter bestimmten Umständen seine Größe ändert und ich diese Werte beim Erzeugen der Labels gleich mitgeben möchte. Könnte natürlich sein, dass sich das später doch noch als Blödsinn herausstellt,. Aber ich bin gerade dabei mich in die Sache einzuarbeiten und da erschien mir das als gute Möglichkeit.

Ich wünsch Dir noch einen schönen Tag.

Gruß Jürgen.

PS. Ich glaube, ich muss mal ein paar Privatstunden bei Dir buchen.

Khabarakh 31. Aug 2006 09:21

Re: Komponente erweitern
 
Zitat:

Zitat von Jürgen Thomas
Wenn Du gezielt Massnahmen im Zusammenhang mit dem Aufräumen erzwingen willst, dann

ist das Überschreiben von Dispose genau das Richtige. Hier (noch) etwas sinnlos, da die Methode nur den Base-Call enthält, aber grundsätzlich vollkommen richtig.

Jürgen Thomas 31. Aug 2006 11:03

Re: Komponente erweitern
 
Zitat:

Zitat von Khabarakh
... ist das Überschreiben von Dispose genau das Richtige.

Kannst Du mir/uns kurz ein paar Situationen nennen, wo das Überschreiben von Dispose sinnvoll ist?

Eigentlich hatte ich auch gelernt, dass alles, was erzeugt wird, auch aufgelöst werden muss (und unter Win32 gilt das ja nach wie vor). Andererseits übernimmt der GarbageCollector genau diese Aufgabe automatisch. Dadurch bin ich selbst immer wieder unsicher (und habe meinen Namensvetter auf die NET-Doku verwiesen).

Kannst Du uns Klarheit verschaffen? Danke! Jürgen

OregonGhost 31. Aug 2006 11:21

Re: Komponente erweitern
 
Der Garbage Collector räumt zwar die .NET-Objekte auf, aber er weiß nichts von z.B. irgendwelchen Win32-Handles, Dateiressourcen oder ähnlichem. Diese werden typischerweise in der Dispose-Methode freigegeben, was insbesondere auch die kontrollierte Freigabe von Objekten ermöglicht.
Im MSDN gibt es dazu einiges zu lesen.

gfjs 31. Aug 2006 11:30

Re: Komponente erweitern
 
Da hab' ich ja eine richtige Lawine losgetreten. Vielen Dank für die rege Beteiligung. Was ich aber noch immer nicht weiß: Ist mein "constructor create; overload;" nun richtig oder nicht - und warum? Im Moment scheint alles glatt zu gehen, aber man kann ja nie wissen.

Gruß Jürgen

DGL-luke 31. Aug 2006 11:54

Re: Komponente erweitern
 
overload? eher override.

gfjs 31. Aug 2006 11:58

Re: Komponente erweitern
 
@ DGL-luke

Wie in meinem ersten Beitrag beschrieben, erzeugt override eine Fehlermeldung.

Gruß Jürgen


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