![]() |
Neue Komp m. Eig. v. Typ StringList..Was muss ich beachten?
Wenn ich ne neue Kompo erstelle und ne neue Eigenschaft vom Typ StringList hinzufüge, was muss ich dabei beachten??
Delphi-Quellcode:
private
FFelder:TStringList; published property Felder : TStringList read FFelder write FFelder; constructor Create(AOwner:TComponent);override; destructor Destroy;override;
Delphi-Quellcode:
destructor TCSAdressLabel.Destroy;
begin if assigned(ffelder) then ffelder.free; inherited; end;
Delphi-Quellcode:
Wenn ich das so mache, kann ich zwar was reinschreiben, wenn ich dann aber nochmal in den StringList-Editor rein will, schmiert Delphi ab. Kann nicht mehr speicher, kann auch die Kompo nicht mehr aus dem Form entfernen. Muss Delphi dann abschießen (Mit etwa 10 Fehlermeldungen über Adressverletzungen). Woran liegt das?
constructor TCSAdressLabel.Create(AOwner:TComponent);
begin inherited Create(aowner); ffelder := tstringlist.Create; end; |
Re: Neue Komp m. Eig. v. Typ StringList..Was muss ich beacht
Ich hab es schonmal gemacht da hat es geklappt. Leider hab ich keinen unterschied zwischen den beiden texten entdeckt der das zur auswirkung hätte. Kann es sein das ich noch irgendwas vergessen hab, was ich aber nicht entdecke?
|
Re: Neue Komp m. Eig. v. Typ StringList..Was muss ich beacht
probier
Delphi-Quellcode:
Andernfalls verlierst Du die Referenz auf die von Dir erstellte Liste und versuchst stattdessen im Destruktor die Dir übergebene Referenz freizugeben. Die jedoch wurde wahrscheinlich schon vorher freigegeben.
private
FFelder:TStringList; procedure SetFelder(const AStrings: TStrings); published property Felder : TStrings read FFelder write SetFelder; //.. end; //.. procedure .SetFelder(const AStrings: TStrings); begin Assert(Assigned(AStrings)); FFelder.Assign(AStrings); end; |
Re: Neue Komp m. Eig. v. Typ StringList..Was muss ich beacht
[Fehler] ucsqcomps.pas(76): Inkompatible Typen
|
Re: Neue Komp m. Eig. v. Typ StringList..Was muss ich beacht
mit "write FFelder" schreibt man doch in ne Variable rein. Kann doch da keine Procedure einsetzen
|
Re: Neue Komp m. Eig. v. Typ StringList..Was muss ich beacht
Diese Implementierung funktioniert bei mir einwandfrei:
Delphi-Quellcode:
Die Methode nach der write-Direktive gibt den Setter an, der Aufgerufen wird. Statt der Getter und Setter, wie in Java, C++, Smalltalk, etc. üblich, gibt es unter Delphi diese Spezialität, die Properties, um es dem Entwickler "angenehmer" zu machen. Außerdem basieren andere Konzepte zB der Object-Inspector auf dem Prinzip der Properties (in Java hingegen muss man sich für ähnlichen Komfort an genaue Namenskonventionen halten)
unit tststrings;
interface uses Classes, SysUtils; type TTstStrings = class(TComponent) private FStrings: TStrings; procedure SetStrings(const Value: TStrings); public constructor Create(AOwner: TComponent); override; destructor Destroy;override; published property Strings: TStrings read FStrings write SetStrings; end; procedure Register; implementation procedure Register; begin RegisterComponents('TstStrings', [TTstStrings]); end; { TTstStrings } constructor TTstStrings.Create(AOwner: TComponent); begin inherited; FStrings:= TStringList.Create; end; destructor TTstStrings.Destroy; begin FreeAndNil(FStrings); inherited; end; procedure TTstStrings.SetStrings(const Value: TStrings); begin Assert( Assigned(Value) ); FStrings.Assign(Value); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz