![]() |
Verständnisproblem Stringlist mit Object
Hallo
Ich habe irgendwie ein Verständnisproblem mit Stringlisten und Verknüpften Objekten. Ich habe folgenden Methoden (die auch funktionieren):
Delphi-Quellcode:
Ich haben nun probiert anstatt Zeigern direkt die Instanzen zu übergeben (Strings). Jedoch bekomme ich dann in der procedure b einen Fehler... (vermutlich weil ich die Stringliste in a freigegeben habe, oder?) Müsste ich also einfach eine globale Stringlist definieren?
procedure a;
var TempStrList : TStringlist; TempStr : ^String; begin i := 0; for i to 10 do begin new(TempStr); TempStr^ := IniFile.ReadString(TempStrList.Strings[i],....); ComboboxXY.ItemsAddObject(TempStrList.Strings[i],TObject(TempStr)); end; TempStrList.Free; end; procedure b; var Tmp : ^String; begin Tmp := Pointer(ComboboxXY.Items.Objects[ComboboxXY.ItemIndex]); Edit1.Text := Tmp^; end; Oder ist die Lösung mit Zeigern besser? Doch da müsste ich am Ende des Programms noch den Speicher freigeben....:
Delphi-Quellcode:
Ich seh da irgendwie nicht wirklich durch...
OnDestroy-Ereignis:
... for i:=0 to ComboboxXY.Items.Count-1 do Dispose(Pointer(ComboboxXY.Items.Objects[i])) es dankt und grüsst Tom |
Re: Verständnisproblem Stringlist mit Object
Bei Procedure a fehlt ein end. Wo soll das sein?
Außerdem halte ich nicht viel davon mit Zeigern zu programmieren - das war früher mal notwendig, ist aber eine große Fehlerquelle und heutzutage in Delphi nicht mehr nötig! Wer das macht hat bei Fehlern selbst schuld. Niemals würde ich einen Zeiger der auf einen String zeigt auf ein TObject casten - das geht nicht gut (wie du ja siehst)!!! |
Re: Verständnisproblem Stringlist mit Object
hmm... dann sollte ich also eine globale Stringlist definieren??
|
Re: Verständnisproblem Stringlist mit Object
Hallo TomDooley,
ich nicht was Du mit TStringList erreichen möchtest. Meiner Ansicht nach brauchst Du TStringList nicht. Ich habe mal ein bißchen Source zusammengestellt.
Delphi-Quellcode:
Damit das klappt was Du vorhast brauchst Du schon einen Zeiger.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PString = ^String; // Deklaration eines Zeiger auf einen String wg der Übersicht TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } procedure ClearStrings; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var iCnt : Integer; aStr : PString; begin ClearStrings; ListBox1.Clear; For iCnt:=0 to 9 do begin New(aStr); aStr^:='TestString '+IntToStr(iCnt+1); ListBox1.Items.AddObject('TestString '+IntToStr(iCnt+1),TObject(aStr)); end; // For iCnt:=0 to 9 do end; procedure TForm1.ClearStrings; var iCnt : Integer; begin For iCnt:=0 to ListBox1.Items.Count-1 do If Assigned(ListBox1.Items.Objects[iCnt]) then Dispose(PString(ListBox1.Items.Objects[iCnt])); end; procedure TForm1.ListBox1Click(Sender: TObject); begin Label1.Caption:=PString(ListBox1.Items.Objects[ListBox1.ItemIndex])^ ; end; procedure TForm1.FormDestroy(Sender: TObject); begin ClearStrings; end; end. Ich vermute mal Du möchtest neben dem String in der ComboBox in der Objects Eigenschaft einen Wert speichern. Das ist auch kein Problem. |
Re: Verständnisproblem Stringlist mit Object
Hallo
Danke für die Erklärung... Wenn ich das richtig verstanden habe, bist Du genau gleich vorgegangen wie ich, ausser dass Du die Stringlist ausgelassen hast (dann wär' das Problem gelöst). Ich glaube aber, dass ich eine Stringlist brauche (vermutlich habe ich aber das Problem etwas zu wenig beschrieben):
Delphi-Quellcode:
ist nicht genau dass, was ich in meinem Prog. mache:
aStr^:='TestString '+IntToStr(iCnt+1);
ListBox1.Items.AddObject('TestString '+IntToStr(iCnt+1),TObject(aStr));
Delphi-Quellcode:
TempStr^ wird nicht mit TempStrList.Strings[i] befüllt sondern mit dem entsprechenden Eintrag im Ini-File.
TempStr^ := IniFile.ReadString(TempStrList.Strings[i],....);
ComboboxXY.ItemsAddObject(TempStrList.Strings[i],TObject(TempStr));
Code:
Beispiel INI-File:
[Section1] //dieser Eintrag kommt in die Stringlist Eintrag=127 //127 wird in TempStr^ abgelegt |
Re: Verständnisproblem Stringlist mit Object
Du musst die TStringList auch vorher mit TStringList.Create erzeugen und mit
den Sectionnamen füllen. |
Re: Verständnisproblem Stringlist mit Object
Genau. Gleich zu Beginn mach ich folgendes:
Delphi-Quellcode:
IniFile.ReadSections(TempStrList);
|
Re: Verständnisproblem Stringlist mit Object
Zitat:
|
Re: Verständnisproblem Stringlist mit Object
Du hast Recht. Sorry! Hab' ich nicht gesehen...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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