AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi nil kann nicht zu TRichEditStrings zugewiesen werden

nil kann nicht zu TRichEditStrings zugewiesen werden

Ein Thema von Dennis07 · begonnen am 9. Okt 2014 · letzter Beitrag vom 10. Okt 2014
Antwort Antwort
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
479 Beiträge
 
Delphi 11 Alexandria
 
#1

nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 9. Okt 2014, 19:04
Delphi-Version: XE5
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
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 9. Okt 2014, 20:35
Wo ist das inherited in 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: 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Okt 2014 um 20:39 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
479 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 9. Okt 2014, 22:50
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
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 9. Okt 2014, 22:58
Man setze auf die Zeile mit dem 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
479 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 9. Okt 2014, 23:33
...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;
Dennis
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
664 Beiträge
 
Delphi 12 Athens
 
#6

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 10. Okt 2014, 07:44
Was Sir Rufo meint: Dein Create ist als overload deklariert, das wird so nie aufgerufen, es muss override heißen.

Und wie schon gesagt, fehlt dort das inherited.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 10. Okt 2014, 08:14
Was Sir Rufo meint: Dein Create ist als overload deklariert, das wird so nie aufgerufen, es muss 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 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 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)
step1.png
Nun wählt man sich gemütlich eine (oder auch mehrere) Einträge aus und hämmert auf <ENTER>
step2.png
Ah, ja ... und nun? Ein weitere beherzter Druck auf <UMSCH>+<STRG>+C bringt uns zu
step3.png
Also so ein Hinweis "die Klasse ist noch neu, da habe ich das inherited noch weggelassen" dokumentiert nur die Unkenntnis im Umgang mit der IDE. Aber gegen Unkenntnis kann man etwas unternehmen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (10. Okt 2014 um 08:23 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
479 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: nil kann nicht zu TRichEditStrings zugewiesen werden

  Alt 10. Okt 2014, 19:24
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
Dennis
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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