Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi nil kann nicht zu TRichEditStrings zugewiesen werden (https://www.delphipraxis.net/182215-nil-kann-nicht-zu-tricheditstrings-zugewiesen-werden.html)

Dennis07 9. Okt 2014 18:04

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:
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.
Nun bekomme ich jedes mal den Fehler:
Zitat:

nil kann nicht zu TRichEditStrings zugewiesen werden
sobald ich in der IDE auf die Lines-Property zugreifen will.

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

himitsu 9. Okt 2014 19:35

AW: nil kann nicht zu TRichEditStrings zugewiesen werden
 
Wo ist das
Delphi-Quellcode:
inherited
in
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:
if Assigned(Value) then
  FLines.Assign(Value)
else
  FLines.Clear;
PS:
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.

Dennis07 9. Okt 2014 21:50

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

Sir Rufo 9. Okt 2014 21:58

AW: nil kann nicht zu TRichEditStrings zugewiesen werden
 
Man setze auf die Zeile mit dem
Delphi-Quellcode:
TStringList.Create
einen Breakpoint und wundert sich, warum dort gar nicht angehalten wird.

Weil dieser Konstruktor niemals aufgerufen wird!

Ein Blick in die Dokumentation Delphi-Referenz durchsuchenSystem.Classes.TCollectionItem.Create

Dennis07 9. Okt 2014 22:33

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;

bcvs 10. Okt 2014 06:44

AW: nil kann nicht zu TRichEditStrings zugewiesen werden
 
Was Sir Rufo meint: Dein Create ist als
Delphi-Quellcode:
overload
deklariert, das wird so nie aufgerufen, es muss
Delphi-Quellcode:
override
heißen.

Und wie schon gesagt, fehlt dort das inherited.

Sir Rufo 10. Okt 2014 07:14

AW: nil kann nicht zu TRichEditStrings zugewiesen werden
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von bcvs (Beitrag 1275496)
Was Sir Rufo meint: Dein Create ist als
Delphi-Quellcode:
overload
deklariert, das wird so nie aufgerufen, es muss
Delphi-Quellcode:
override
heißen.

Und wie schon gesagt, fehlt dort das inherited.

Zudem meine ich noch, dass die Konstruktoren völlig falsch gewählt sind und darum niemals aufgerufen werden.

Entweder man überschreibt den Konstruktor
Delphi-Quellcode:
TCollectionItem.Create( Collection : TCollection );
Delphi-Quellcode:
TMyItem = class( TCollectionItem )
public
  constructor Create( Collection : TCollection ); override;
end;

constructor TMyItem.Create( Collection : TCollection );
begin
  inherited {Create( Collection )};
  ...
end;
oder, wenn einen die übergebenen Werte im Konstruktor egal sind, dann überschreibt man einfach
Delphi-Quellcode:
TObject.AfterConstruction;
Delphi-Quellcode:
TMyItem = class( TCollectionItem )
public
  procedure AfterConstruction; override;
end;

procedure TMyItem.AfterConstruction;
begin
  inherited;
  ...
end;
Für das Ableiten von Klassen unterstützt einen die IDE ("Use the force, Luke!")

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:
inherited
noch weggelassen" dokumentiert nur die Unkenntnis im Umgang mit der IDE. Aber gegen Unkenntnis kann man etwas unternehmen :)

Dennis07 10. Okt 2014 18:24

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 06:20 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