Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verständnisproblem Stringlist mit Object (https://www.delphipraxis.net/29286-verstaendnisproblem-stringlist-mit-object.html)

TomDooley 7. Sep 2004 09:26


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:
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;
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?

Oder ist die Lösung mit Zeigern besser? Doch da müsste ich am Ende des Programms noch den Speicher freigeben....:
Delphi-Quellcode:
OnDestroy-Ereignis:
...
for i:=0 to ComboboxXY.Items.Count-1 do
  Dispose(Pointer(ComboboxXY.Items.Objects[i]))
Ich seh da irgendwie nicht wirklich durch...

es dankt und grüsst

Tom

bttb930 7. Sep 2004 09:47

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)!!!

TomDooley 9. Sep 2004 09:21

Re: Verständnisproblem Stringlist mit Object
 
hmm... dann sollte ich also eine globale Stringlist definieren??

Jens Schumann 9. Sep 2004 10:01

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:
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.
Damit das klappt was Du vorhast brauchst Du schon einen Zeiger.
Ich vermute mal Du möchtest neben dem String in der ComboBox in der Objects Eigenschaft einen Wert speichern. Das ist auch kein Problem.

TomDooley 9. Sep 2004 10:28

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:
aStr^:='TestString '+IntToStr(iCnt+1);
ListBox1.Items.AddObject('TestString '+IntToStr(iCnt+1),TObject(aStr));
ist nicht genau dass, was ich in meinem Prog. mache:

Delphi-Quellcode:
TempStr^ := IniFile.ReadString(TempStrList.Strings[i],....);
ComboboxXY.ItemsAddObject(TempStrList.Strings[i],TObject(TempStr));
TempStr^ wird nicht mit TempStrList.Strings[i] befüllt sondern mit dem entsprechenden Eintrag im Ini-File.
Code:
Beispiel INI-File:

[Section1]      //dieser Eintrag kommt in die Stringlist
Eintrag=127      //127 wird in TempStr^ abgelegt

Jens Schumann 9. Sep 2004 10:35

Re: Verständnisproblem Stringlist mit Object
 
Du musst die TStringList auch vorher mit TStringList.Create erzeugen und mit
den Sectionnamen füllen.

TomDooley 9. Sep 2004 10:45

Re: Verständnisproblem Stringlist mit Object
 
Genau. Gleich zu Beginn mach ich folgendes:

Delphi-Quellcode:
IniFile.ReadSections(TempStrList);

Jens Schumann 9. Sep 2004 17:38

Re: Verständnisproblem Stringlist mit Object
 
Zitat:

Zitat von TomDooley
Genau. Gleich zu Beginn mach ich folgendes:

Delphi-Quellcode:
IniFile.ReadSections(TempStrList);

Das steht aber nicht in Deinem Codeschnippsel

TomDooley 13. Sep 2004 07:50

Re: Verständnisproblem Stringlist mit Object
 
Du hast Recht. Sorry! Hab' ich nicht gesehen...


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