Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektzuweisung zu TStrings funktioniert nicht (https://www.delphipraxis.net/166145-objektzuweisung-zu-tstrings-funktioniert-nicht.html)

Popov 31. Jan 2012 22:59

Delphi-Version: 5

Objektzuweisung zu TStrings funktioniert nicht
 
Ich sehe wieder vor lauter Bäume den Wald nicht mehr. Seit paar Stunden sehe ich den Fehler nicht. Das Schöne dabei ist, dass ich den nicht mal reproduziert kriege. Ich habe inzwischen fünf neue, leere Projekte erstellt, diesen Code eingegeben und versucht den Fehler zu reproduzieren, aber es funktioniert immer. Nur hier nicht. Auch habe ich das schon an die 100 mal so in anderen Projekten erstellt. Das ist ein simpler Code.

List ist in diesem Fall eine ListBox.


Delphi-Quellcode:
type
  TInfo = class
    Test: String;
  end;
 
 ...
 
  Info := TInfo.Create;
  Info.Test := 'Test';

  //a := List.AddObject(Str, Info);

  a := List.Add(Str);
  List.Objects[a] := Info;

  Info := TInfo(List.Objects[a]); //Info wird hier nil
   
  ShowMessage(List[a]); // Funktioniert
  ShowMessage(Info.Test); / Es knallt

Luckie 31. Jan 2012 23:16

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Wo wird List erzeugt?

Popov 31. Jan 2012 23:19

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Ok, alles zurück. Es funktioniert. So schnell geht es manchmal mit der Lösung.

Ich sitze nun seit paar Stunden an einem Code der funktionieren sollte und nicht funktioniert.

Des Rätsels Lösung: Statt ListBox habe ich mich verknickt und Memo genommen. Das kann ja nicht funktionieren

//Edit:
Zitat:

Zitat von Luckie (Beitrag 1148606)
Wo wird List erzeugt?

Du warst schon fast auf dem richtigen Weg. ICh habe mich zu sehr auf den Code konzentriert.

DeddyH 1. Feb 2012 08:07

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Und wo ist nun der Unterschied zwischen Listbox.Items und Memo.Lines? Sind doch beides TStrings.

himitsu 1. Feb 2012 10:13

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Beim Memo/RichEdit werden die Objekts nicht gespeichert, da es keine eindeutig stabile Unterteilung der Zeilen gibt, bzw. der Benutzer durch seine Eingaben alles schrotten kann.

Leider wirft TMemoStrings keine Fehlermeldung bei Zuweisung von Objekts.

DeddyH 1. Feb 2012 10:15

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Klar, ich hätte mal einen Kaffee mehr trinken sollen :mrgreen:

himitsu 1. Feb 2012 10:19

AW: Objektzuweisung zu TStrings funktioniert nicht
 
BorCodEmba hätte auch einfach langsam mal eine Exception einbauen können. :angle2:

Popov 1. Feb 2012 10:57

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Zitat:

Zitat von himitsu (Beitrag 1148643)
BorCodEmba hätte auch einfach langsam mal eine Exception einbauen können. :angle2:

Das mit einer Exception wäre eine gute Idee gewesen. Ich saß paar Stunden an den paar Zeilen, habe 100 Abfragen eingebaut, habe die Zeilen immer und immer wieder zerlegt, es musste funktionieren, aber es funktionierte nicht. Es gibt eine Exception, aber erst beim lesen, nicht beim schreiben.

himitsu 1. Feb 2012 11:42

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Wobei dir die Exception mit dem geheimen Text ala "Zugriffsverletzung bei Adresse 00000xxx" (welche man vergessen hat uns zu verraten) dir auch zagen wollte, daß dort etwas fehlt 00000xxx = nil (mit 'nem kleinen Offset)

Und das nil hätte einen schon auf eine gute Fährte bringen können.

DeddyH 1. Feb 2012 11:46

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Trotzdem ist damit nicht leicht auf die Ursache zu schließen, hier wäre eine Exception bei AddObject wirklich angebracht gewesen.

Furtbichler 1. Feb 2012 12:22

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Menno, einfach gemein.

himitsu 1. Feb 2012 12:39

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Leere Funktionen sind halt genauso schlimm, wie leere Try-Except ... sowas macht man einfach nicht, denn das Ergebnis sieht man hier.
Delphi-Quellcode:
function TStrings.GetObject(Index: Integer): TObject;
begin
  Result := nil;
end;

procedure TStrings.PutObject(Index: Integer; AObject: TObject);
begin
end;
(wird von TMemoStrings nicht überschrieben)


Aber über die das NIL der Zugriffsverletzung bin ich damals recht schnell auf das Problem gestoßen.

Selbst hier ging es nicht und da sollte es von Codeseite kaum Probleme geben (solange mindestens eine Zeile vorhanden ist).
Delphi-Quellcode:
Memo1.Objects[0] := irgendwas;
if Memo1.Objects[0] = irgendwas then
  ...

Popov 1. Feb 2012 20:26

AW: Objektzuweisung zu TStrings funktioniert nicht
 
Zitat:

Zitat von himitsu (Beitrag 1148660)
Wobei dir die Exception mit dem geheimen Text ala "Zugriffsverletzung bei Adresse 00000xxx" (welche man vergessen hat uns zu verraten) dir auch zagen wollte, daß dort etwas fehlt 00000xxx = nil (mit 'nem kleinen Offset)

Und das nil hätte einen schon auf eine gute Fährte bringen können.

Das mit dem nil ist mir schon aufgefallen (siehe Quelltext erster Beitrag), nur war mir das nil unbegreiflich, da es in einer ListBox nicht sein dürfte. Also suchte ich den Grund für das nil. Und wie gesagt, ich war der Meinung ich nutze eine ListBox. Das zu prüfen ist mir erst eingefallen als ich den Beitrag geschrieben habe.


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