![]() |
Delphi-Version: XE5
nil kann nicht zu TRichEditStrings zugewiesen werden
Hallo,
ich schreibe zZ eine Komponente und habe in einem TCollectionItem eine TStrings-Property. Deklariert ist sie als TStrings, erzeugt wird sie als TStringList.
Delphi-Quellcode:
Nun bekomme ich jedes mal den Fehler:
type
TMyItem = class(TCollectionItem) private { Private-Deklarationen } FLines: TStrings; function GetLines: TStrings; procedure SetLines(Value: TStrings); protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create; overload; constructor Create(const AFileName: TFileName); overload; destructor Destroy; overload; published { Published-Deklarationen } property Lines: TStrings read GetLines write SetLines; end; implementation constructor TMyItem.Create; begin FLines := TStringList.Create; end; constructor TMyItem.Create(const AFileName: TFileName); begin Create; Lines.LoadFromFile(AFileName); end; destructor TMyItem.Destroy; begin FLines.Free; inherited; end; function TMyItem.GetLines: TStrings; begin Result := FLines; end; procedure TMyItem.SetLines(Value: TStrings); begin FLines.Assign(Value); end; end. Zitat:
Ich habe bereits versucht, das FLines beim Assign zu casten und die Get-methode durch einen normalen Var-Zugriff zu ersetzen, leider ohne Erfolg. Es gab bereits einige Threads bezüglich dieses Problems, aber entweder lag es dort an anderen Dingen oder die Antwort hat mir auch nicht weitergeholfen. Ich hoffe, ihr könnt mir helfen... MfG; Dennis |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Wo ist das
Delphi-Quellcode:
in
inherited
Delphi-Quellcode:
?
TMyItem.Create;
Und wenn du weißt, daß es am SetLines liegt und der kein NIL verträgt, warum fängst du das da dann nicht ab?
Delphi-Quellcode:
PS:
if Assigned(Value) then
FLines.Assign(Value) else FLines.Clear;
Delphi-Quellcode:
property Lines: TStrings read FLines write AssignLines;
Der "leere" Getter weggelassen und der Setter umbenannt ... schon hat man eine Methode eingesparrt und die Andere heißt so, wie das, was sie macht. |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Naja, die Methode umzubenennen kann zwar sinnvoll sein, aber das löst ja kein Problem.
Das mit dem inherited hatte ich noch nicht eingefügt, da die klasse halt wie gesagt relativ neu ist :) Aber zurück mit dem Assigned-Überprüfen: Bisher hatte ich so etwas erstens noch nicht getan bei soetwas und es hat trotzdem gefunzt, und außerdem begreife ich nicht, wie das helfen soll? Ich will ja trotzdem irgendwie ne TStringList raushaben, egal ob die NIL ist oder nicht. Und wieso die NIL ist, verstehe ich auch nicht. Ich habe ihr doch einen Wert zugewiesen?!? Tut mir leid, aber könntest du mir das genauer erklären? Ich schätze, das habe ich noch nicht ganz verstanden... sry :) MfG |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Man setze auf die Zeile mit dem
Delphi-Quellcode:
einen Breakpoint und wundert sich, warum dort gar nicht angehalten wird.
TStringList.Create
Weil dieser Konstruktor niemals aufgerufen wird! Ein Blick in die Dokumentation ![]() |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
...und man werfe einen Blick auf die .Add methode, wo drin steht:
Delphi-Quellcode:
function TCollection.Add: TCollectionItem;
begin Result := FItemClass.Create(Self); Added(Result); end; |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Was Sir Rufo meint: Dein Create ist als
Delphi-Quellcode:
deklariert, das wird so nie aufgerufen, es muss
overload
Delphi-Quellcode:
heißen.
override
Und wie schon gesagt, fehlt dort das inherited. |
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Entweder man überschreibt den Konstruktor
Delphi-Quellcode:
TCollectionItem.Create( Collection : TCollection );
Delphi-Quellcode:
oder, wenn einen die übergebenen Werte im Konstruktor egal sind, dann überschreibt man einfach
TMyItem = class( TCollectionItem )
public constructor Create( Collection : TCollection ); override; end; constructor TMyItem.Create( Collection : TCollection ); begin inherited {Create( Collection )}; ... end;
Delphi-Quellcode:
TObject.AfterConstruction;
Delphi-Quellcode:
Für das Ableiten von Klassen unterstützt einen die IDE ("Use the force, Luke!")
TMyItem = class( TCollectionItem )
public procedure AfterConstruction; override; end; procedure TMyItem.AfterConstruction; begin inherited; ... end; Im Deklarationteil der neuen Klasse drückt man beherzt <STRG>+<LEERTASTE> und bekommt (wie durch Zauberhand) Anhang 41968 Nun wählt man sich gemütlich eine (oder auch mehrere) Einträge aus und hämmert auf <ENTER> Anhang 41969 Ah, ja ... und nun? Ein weitere beherzter Druck auf <UMSCH>+<STRG>+C bringt uns zu Anhang 41970 Also so ein Hinweis "die Klasse ist noch neu, da habe ich das
Delphi-Quellcode:
noch weggelassen" dokumentiert nur die Unkenntnis im Umgang mit der IDE. Aber gegen Unkenntnis kann man etwas unternehmen :)
inherited
|
AW: nil kann nicht zu TRichEditStrings zugewiesen werden
Ich habe nicht gesagt, dass ich es "weggelassen" habe. Ich habe es halt nur noch nicht eingefügt gehabt...
Und Dank an dieser Stelle, deine Lösung hat mir geholfen. War ein Denkfehler, das override; muss da natürlich hin... MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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 by Thomas Breitkreuz