Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringList als Result (https://www.delphipraxis.net/23690-tstringlist-als-result.html)

Generalissimo 8. Jun 2004 00:23


TStringList als Result
 
Wie kann ich eine TStringList als Rückgabewert einer Funktion realisieren.
Mein Problem ist, ich will aus einem Dialog in dem eine TStringList gefüllt wird
diese exportieren ins Hauptformular um dort sie weiterverarbeiten zu können.

Jetzt mache ich es so.

Hauptformular:

Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FVarList:=TStringList.Create;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
FVarList.Free;
end;

procedure TfrmMain.GetVarList;
begin
 With TfrmVarList.Create(nil) do
 begin
  ShowModal;
  FVarList:=GetList;
  Realease
 end;
end;
Dialog:

Delphi-Quellcode:
procedure TfrmVarList.FormCreate(Sender: TObject);
begin
FList:=TStringList.Create;
end;

procedure TfrmVarList.FormDestroy(Sender: TObject);
begin
FList.Free;
end;

function TfrmVarList.GetList:TStringList;
begin
 Result:=FList;
end;
Das will aber nicht. Da gibts immer ne Zugriffsverletzung.

negaH 8. Jun 2004 00:29

Re: TStringList als Result
 
probier mal:

Delphi-Quellcode:
procedure TfrmMain.GetVarList;
begin
  with TFrmVarList.Create(Self) do
  try
    ShowModal;
    Self.FVarList.Assign(GetList);
  finally
    Release;
  end;
end;
und achte nebenbei mal auf deine Formatierungen und den try finally Block umd Resourcen zu schützen.

Gruß Hagen

Generalissimo 8. Jun 2004 00:42

Re: TStringList als Result
 
jetzt ist zwar die fehlermeldung weg, aber dennoch wird nicht der inhalt
der einen liste der anderen zugewiesen

Luckie 8. Jun 2004 02:49

Re: TStringList als Result
 
Mach es mit einer Klassen-Methode. (Ist auch der bessere Stil, finde ich.)

Hauptformular:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    if TForm2.GetUserInput(sl) then
      Listbox1.Items.Text := sl.Text;
  finally
    FreeAndNil(sl);
  end;
end;
Eingabeformular:
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class function GetUserInput(out sl: TStringList): Boolean;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

class function TForm2.GetUserInput(out sl: TStringList): Boolean;
begin
  with TForm2.Create(nil) do
  begin
    ShowModal();
    sl.Add(Edit1.Text);
    Result := length(Edit1.Text) <> 0;
    Free();
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  ModalResult := mrOK;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ModalResult := mrCancel;
end;
Klappt wunderbar.

mirage228 8. Jun 2004 05:46

Re: TStringList als Result
 
Hi Luckie,

ich würde es persönlich so machen:

Delphi-Quellcode:
class function TForm2.GetUserInput(List: TStrings): Boolean;
begin
  with TForm2.Create(nil) do
  begin
    ShowModal();
    if Assigned(List) then
      List.Add(Edit1.Text);
    Result := length(Edit1.Text) <> 0;
    Free();
  end;
end;
Dann kann man jeden Nachfahren von TStrings einsetzen und auch z.B. ComboBox1.Items als Parameter angeben - also eine vorhandene Liste weiterbenutzen.

mfG
mirage228

shmia 8. Jun 2004 09:07

Re: TStringList als Result
 
Nö, eher so: :angle2:
Delphi-Quellcode:
class function TForm2.GetUserInput(List: TStrings): Boolean;
begin
  with TForm2.Create(nil) do
  begin
    try
       Result := (ShowModal = mrOK); // Bediener entscheidet mit OK oder Cancel-Button
       if Assigned(List) then
         List.Add(Edit1.Text);
    finally
       Free;
    end;
  end;
end;

Luckie 8. Jun 2004 09:08

Re: TStringList als Result
 
Ja, ja, ja. Es ging mir ja nur um das Prinzip. Btw ist die Prüfung überflüssig. Wie willst du die Methode ohne Übergabe eines korrekten Paramters aufrufen, ohne das der Compiler mekert?


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