Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stringlisten in mehreren Prozeduren nutzen (https://www.delphipraxis.net/98227-stringlisten-mehreren-prozeduren-nutzen.html)

WIng2005 23. Aug 2007 14:14


Stringlisten in mehreren Prozeduren nutzen
 
Hallo,

wenn ich wie folgt Stringlisten nutze, bekomme ich eine
Zugriffsverletzung:

Delphi-Quellcode:

var sl:TStringlist;


Procedure A;
Begin
SL := TStringList.Create;
SL('Text ; Text');

b;
c;
end;



Procedure b;
Begin
SL.Add('Text ; Text');      //<-Exception
end;

Procedure c;
Begin
SL.SaveToFile('datei.csv');
end;
Muss die Stringlist nach jedem Schreiben geschlossen werden? Wenn ja, wie hänge ich an?

MFG
Steffen

s-off 23. Aug 2007 14:19

Re: Stringlisten in mehreren Prozeduren nutzen
 
Hallo,

die Stringliste ist nur dort gültig, wo Du sie erzeugst.

Du solltest sie also global erzeugen.

Edit:
Schwachsinn - ich meine natürlich, dass sie nur dort gültig ist, wo Du sie deklarierst.

Edit2:
Zitat:

Zitat von WIng2005
Muss die Stringlist nach jedem Schreiben geschlossen werden? Wenn ja, wie hänge ich an?

Nein.

Allgemein:
Wenn Du eine Stringliste in allen Methoden einer Klasse benutzen möchtest, dann solltest Du sie auch in der Klasse deklarieren.
Am Beispiel einer Klasse TForm1 sieht das dann ungefähr so aus:

Delphi-Quellcode:
Unit Unit1;

Interface

Uses
   Windows,
   Messages,
   SysUtils,
   Variants,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs;

Type
   TForm1 = Class(TForm)
      Procedure FormCreate(Sender: TObject);
      Procedure FormDestroy(Sender: TObject);
   private
      sl: TStringlist;
   End;

Var
   Form1: TForm1;

Implementation

{$R *.dfm}

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   sl := TStringlist.Create;
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
   FreeAndNil(sl);
End;

End.
Du könntest dann auf 'sl' in allen Methoden Deiner Klasse 'TForm1' zugreifen.
Willst Du auch in klassenfremden Methoden auf sl zugreifen, so musst Du die Sichtbarkeit erhöhen, oder eine Property mit entsprechenden read/write-Methoden zur Verfügung stellen, oder die Stringliste global deklarieren.

Edit3:
Rechtschreibfehler in Edit2 behoben :mrgreen:

DeddyH 23. Aug 2007 14:35

Re: Stringlisten in mehreren Prozeduren nutzen
 
Ich kann das Problem nicht nachvollziehen :gruebel:
Hier mal eine Testunit:
Delphi-Quellcode:
unit UnitNix;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
    sl: TStringList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  sl := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(sl) then
    FreeAndNil(sl);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(sl) then
    begin
      sl.Add('eine Zeile');
      Button2Click(self);
      Button3Click(self);
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(sl) then
    sl.Add('eine weitere Zeile');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Assigned(sl) then
    sl.SaveToFile('C:\blablubb.txt');
end;

end.

RavenIV 23. Aug 2007 15:16

Re: Stringlisten in mehreren Prozeduren nutzen
 
Das sollte so aber funktionieren...

s-off 23. Aug 2007 15:22

Re: Stringlisten in mehreren Prozeduren nutzen
 
Vielleicht hat er seine Variable in einer Klasse deklariert. Lt. seines Quelltextes sieht es zwar nach einer globalen Deklaration aus, aber vielleicht ist das einfach nur ein Copy&Paste-Fehler...

DeddyH 23. Aug 2007 15:24

Re: Stringlisten in mehreren Prozeduren nutzen
 
Somit fischen wir mal wieder im Trüben.

RavenIV 23. Aug 2007 15:27

Re: Stringlisten in mehreren Prozeduren nutzen
 
Vielleicht kommt der Fehler auch daher:
Delphi-Quellcode:
Button2Click(self);
Button3Click(self);
Das self bezieht sich nämlich auf das Form und nicht auf den Button1.
Besser wäre vermutlich:
Delphi-Quellcode:
Button2Click(Sender);
Button3Click(Sender);

DeddyH 23. Aug 2007 15:37

Re: Stringlisten in mehreren Prozeduren nutzen
 
Moment, bei mir kommt kein Fehler, nicht verwechseln ;)

s-off 23. Aug 2007 15:48

Re: Stringlisten in mehreren Prozeduren nutzen
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(sl) then
    FreeAndNil(sl);
end;

Was bezweckst Du in dem Fall eigentlich mit dem 'Assigned'?

Edit: Delphi-Tag geöffnet

mkinzler 23. Aug 2007 15:49

Re: Stringlisten in mehreren Prozeduren nutzen
 
Er fragt ab, ob die Variable ein Objekt referenziert


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr.
Seite 1 von 3  1 23      

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