Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Funktion mit eine Liste :TStrings (https://www.delphipraxis.net/65233-funktion-mit-eine-liste-tstrings.html)

Karstadt 14. Mär 2006 07:36

Datenbank: MYSQL • Version: 4.1 • Zugriff über: Direkt

Funktion mit eine Liste :TStrings
 
Delphi-Quellcode:
Function Tf_hauptfenster.GibLagerListe: TStrings;
var Lagerliste: TStrings;
begin
  Lagerliste := TStringList.Create;
  with dm.mqr_TEMP do
  begin
    Close;
    Sql.Clear;
    sql.Add('SELECT * FROM lager ORDER BY lg_bezeichnung ASC');
    open;
    While not Eof do
    begin
      Lagerliste.Add(Fieldbyname('lg_bezeichnung').asstring);
      next;
    end;
    close;
  end;
  Result := Lagerliste;
  //Lagerliste.Free;
end;
So lade ich die Lagerliste in eine TCombPox Componente. Wenn ich aber diese Zeile ( //Lagerliste.Free;) Ausdokumentiere um die Varialbe Lagerliste aus dem Speicher zu entfernen, bekomme ich beim Aufruf dieser Funktion eine Zugriffsverlestzung. Weil ich die Lagerliste aus dem Speicher entnommen haben. Aber Warum ich habe doch den Inhalt davor an ReSult übergeben..

Angel4585 14. Mär 2006 07:40

Re: Funktion mit eine Liste :TStrings
 
nein du hast nicht den INHALT sondern den ZEIGER der Liste übergeben. probier das mal mit
Delphi-Quellcode:
Result.Assign(Lagerliste)
Oder war das Append :gruebel:

denn wenn du den Zeiger übergibst und Lagerliste freigibst ist das Result auch futsch weil glaube ich auch freigegeben.

TAC 14. Mär 2006 07:45

Re: Funktion mit eine Liste :TStrings
 
moin,

die Lagerliste wird eigentlich ja nicht benötigt da es ja ein result gibt und dann sollte es auch keine Zugriffsverletztung mehr geben.

Keldorn 14. Mär 2006 07:52

Re: Funktion mit eine Liste :TStrings
 
Zitat:

Zitat von Angel4585
Delphi-Quellcode:
Result.Assign(Lagerliste)

Hallo, dann soltest du in einer AV landen, da du Result nicht erzeugt hast.

Zitat:

Zitat von Karstadt
Aber Warum ich habe doch den Inhalt davor an ReSult übergeben..

Hast du eben nicht ;-). Durch Result := Lagerliste; hast du nicht den inhalt kopiert, sondern nur den zeiger verborgen, result und Lagerliste zeigen auf das gleiche. mit result.assign(lagerliste) würdest du den inhalt kopieren, bringt dir aber auch nichts. Das Rückgabe Ergebnis mußt du dann in der aufrufenenden Proc wieder freigeben. Ich persönlcih würde die Stringlist übergeben und nicht innerhalb der Func erzeugen.
Delphi-Quellcode:
Procedure Tf_hauptfenster.blablaLagerListe(Lagerliste: TStrings); (edit: in Procedure geändert)
begin
  Lagerliste.clear;
  with dm.mqr_TEMP do
  begin
    Close;
    Sql.Clear;
    sql.Add('SELECT * FROM lager ORDER BY lg_bezeichnung ASC');
    open;
    While not Eof do
    begin
      Lagerliste.Add(Fieldbyname('lg_bezeichnung').asstring);
      next;
    end;
    close;
  end;
end;

Procedure Aufruf;
Var sl:tstings;
begin
sl:=tstringlist.create;
try
  blablaLagerListe(sl);
  machnochwasmit(sl);
finally
  sl.free;
end;
Somit hast du das create und free der stringliste an einer Stelle und minimierst die Gefahr von Speicherlecks durhc das vergessen vom freigeben der Lagerliste.

Mfg Frank

Angel4585 14. Mär 2006 07:59

Re: Funktion mit eine Liste :TStrings
 
so und jetzt machst du aus der Funktion noch eine Prozedur(keine Rückgabe) dann sollte es funktionieren :thumb:

Keldorn 14. Mär 2006 08:00

Re: Funktion mit eine Liste :TStrings
 
Zitat:

Zitat von Angel4585
so und jetzt machst du aus der Funktion noch eine Prozedur(keine Rückgabe) dann sollte es funktionieren :thumb:

blödes Copy&paste ;-)

Thanatos81 14. Mär 2006 08:02

Re: Funktion mit eine Liste :TStrings
 
Und zusätzlich noch statt
Delphi-Quellcode:
Function Tf_hauptfenster.blablaLagerListe(Lagerliste: TStrings)
folgendes:
Delphi-Quellcode:
Procedure Tf_hauptfenster.blablaLagerListe(var Lagerliste: TStringList)
Denn ansonsten wird es nichts in die übergeben StringList geschrieben und du hast nach dem Aufruf der Procedure noch den gleichen Inhalt in der SL wie vorher ;-)

Falls ich mich da in Bezug auf TStringList irre und es nicht als var übergeben werden muss, steinigt mich bitte ;-)

Keldorn 14. Mär 2006 08:03

Re: Funktion mit eine Liste :TStrings
 
du brauchst kein Var bei Objekten.

Thanatos81 14. Mär 2006 08:17

Re: Funktion mit eine Liste :TStrings
 
Oh! Okay wieder was gelernt... DAnke für den Hinweis ;-)


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