![]() |
Problem mit der Ausgabe des Object bei TStringList
Hallo,
ich habe ein Problem mit der TStringList, mit dem Befehl AddObject bekommt die Liste ein String und ein Object zugewiesen. Beim Auslesen kommt beim String das richtige Ergebnis, aber beim Object kommt Blödsinn raus. Was mache ich falsch?
Delphi-Quellcode:
type
TDatenNr= class(TObject) private FDatNr: integer; function GetFDatNr: integer; procedure SetFDatNr(Variable: integer); public Constructor Create; Destructor free; property DatNr: integer read GetFDatNr write SetFDatNr; end; TForm1 = class(TForm) StringEingabeEdit: TEdit; ZahlEingabeEdit: TEdit; StringAusgabeEdit: TEdit; ZahlAusgabeEdit: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Liste: TStringlist; // StringListe DatenObj: TDatenNr; // Daten-Object end; var Form1: TForm1; implementation {$R *.dfm} Constructor TDatenNr.Create; begin inherited; end; Destructor TDatenNr.free; begin end; function TDatenNr.GetFDatNr: integer; begin Result:= FDatNr; end; procedure TDatenNr.SetFDatNr(Variable: integer); begin if FDatNr <> Variable then FDatNr:= Variable; end; procedure TForm1.Button1Click(Sender: TObject); var StrEingabe: string; intZahlEingabe: integer; intZahlAusgabe: integer; begin StrEingabe:= StringEingabeEdit.Text; intZahlEingabe:= strtoint(ZahlEingabeEdit.text); DatenObj.DatNr:= intZahlEingabe; Liste.AddObject(StrEingabe,DatenObj); StringAusgabeEdit.Text:= Liste[0]; intZahlAusgabe:= TDatenNr(Liste[0]).DatNr; //<--- Hier wird nicht der // richtige Wert zurückgegeben. ZahlAusgabeEdit.Text:= inttostr(intZahlAusgabe); end; procedure TForm1.FormCreate(Sender: TObject); begin Liste:= TStringList.Create; DatenObj:= TDatenNr.Create; end; end. Bis bald Chemiker |
Re: Problem mit der Ausgabe des Object bei TStringList
Dein Problem (lang): Du erstellst immer nur ein Objekt. Wenn du nur ein Objekt erstellst, dann hast du auch immer nur eine Ablage für deine Zahl DatNr. Von daher hat dein Objekt (da du es bei jedem hinzufügen einen neuen Inhalt zuweist) auch immer nur den Wert in DatNr, welcher als letztes hinzugefügt wurde.
Dein Problem (kurz): Du hast ein und das selbe Objekt in jedem deiner StringList Einträge. Deine Lösung: lege für jeden Eintrag den du hinzufügst auch eine entsprechende Instanz des Objektes an. /EDIT: Omg, ganz übersehen den falschen Zugriff (Danke Hawkeye219) |
Re: Problem mit der Ausgabe des Object bei TStringList
Hallo,
Problem #2: du interpretierst einen String als Zeiger auf dein Datenobjekt:
Delphi-Quellcode:
Gruß Hawkeye
// intZahlAusgabe:= TDatenNr(Liste[0]).DatNr; // so nicht...
intZahlAusgabe:= TDatenNr(Liste.Objects[0]).DatNr; // ...sondern so! |
Re: Problem mit der Ausgabe des Object bei TStringList
Hallo Hawkeye219,
danke für die schnelle Antwort, jetzt funktioniert es. Bis bald Chemiker |
Re: Problem mit der Ausgabe des Object bei TStringList
Das von mir angesprochene Problem besteht auch noch weiterhin!
Zum anderen ist mir eben noch aufgefallen: Der Destructor heisst nicht "Free" sondern "Destroy" und der muss überschrieben werden. Von daher fehlt ein "Override;" und der Name muss abgeändert werden. Free kannst du aber trotzdem weiterhin verwenden um die Freigabe auszulösen, aber der Destructor bleibt Destroy! |
Re: Problem mit der Ausgabe des Object bei TStringList
Hallo Muetze1,
ist das der richtige Weg?
Delphi-Quellcode:
Destructor TDatenNr.Destroy;
begin inherited Destroy; end;
Delphi-Quellcode:
Bis bald Chemiker;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin DatenObj.Free; Liste.Free; end |
Re: Problem mit der Ausgabe des Object bei TStringList
Da fehlt aber noch mehr ! Was wird im FormClose denn genau abgehandelt ? Setze da die Action zumindest mal auf caFree.
|
Re: Problem mit der Ausgabe des Object bei TStringList
Moin Chemiker,
das Gegenstück zu Create ist Destroy. Wenn Du nun also etwas, völlig korrekt, in FormCreate erstellst, so solltest Du es im FormDestroy wieder freigeben, nicht im FormClose. @Hansa: Zitat:
|
Re: Problem mit der Ausgabe des Object bei TStringList
@Fragesteller : Christian sagt es. Create, Show, Close usw. sollten schon korrespondieren. Wird im FormShow etwas erzeugt, dann muss es im FormClose eben wieder weg. Zwiebelprinzip und das ist schon wichtig ! Leider war davon kaum was zu sehen.
|
Re: Problem mit der Ausgabe des Object bei TStringList
Hallo Hansa, Christian
eine Frage vorweg müsst Ihr eigentlich nicht auch mal schlafen? Nicht ganz ernst gemeint. Zitat:
Ich bin bis jetzt davon ausgegangen das nach dem schließen der Anwendung auch der Speicher für das Hauptform wieder freigeben wird. Und nun zu der Antwort Speicherfreigabe der Objecte wo den genau? Christian Du meinst in FormDestroy: Zitat:
Zitat:
Ich habe neuerdings immer den Speicher, bei OnClose wieder freigegeben. Es muss aber Destroy sein. Danke für die Tipp. Die Reihenfolgen der Ereignisse von Form: Beim Aufruf: 1 OnCreate 2 OnShow 3 OnActivate 4 OnPaint Das Programm läuft Das Programm wird beendet 1 OnCloseQuery 2 OnClose 3 OnDestroy Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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