Einzelnen Beitrag anzeigen

KarllerntDelphi

Registriert seit: 21. Okt 2020
Ort: Grünstadt
20 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Generic Collections als Funktionsübergabe

  Alt 22. Nov 2020, 11:43
Delphi-Version: 10.2 Tokyo
Ich erstelle eine Liste mit Records und möchte in einer Funtkion einen Teilauschnitt davon in eine neue Liste übetragen.
Der Funktion übergebe ich als Parameter die komplette Liste und möchte die Teilliste als Funtkionsergebnis zurückbekommen.
Ich lösche die Teilliste bei Funktionseintritt.
Aber bereits da bekomme ich auf die Nase mit einer Zugriffsverletzung.
Ich verstehe nicht warum. Ich dachte bisher, in einer Funktion könnte ich den Funtionsparameter verändern.
Was mache ich falsch ? oder wie muss die Funtkion aussehen.
Mit "einfachen" Variablen wie String oder Integer funtkioniert das doch.
Danke und Gruße
Karl

Code:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Generics.Collections;

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

var
  Form1: TForm1;

type
  test = record
    feld1: Shortstring;
    feld2: Shortstring;
    feld3: Shortstring;
  end;

  ListeRecords = TList<test>;

implementation

{$R *.dfm}

function Stripped_Liste(Liste: ListeRecords; Stadt: string): ListeRecords;
var
  i: integer;
  test_rec: test;
begin
  result.Clear;
  for i := 0 to Liste.count - 1 do
  begin
    test_rec := Liste.Items[i];
    if test_rec.feld3 = Stadt then
      result.Add(test_rec);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  testrec: test;
  RecordListe: ListeRecords;
  LocalListe: ListeRecords;
begin
  RecordListe.Create;
  RecordListe.Clear;

  testrec.feld1 := 'Walter';
  testrec.feld2 := 'Müller';
  testrec.feld3 := 'Berlin';
  RecordListe.Add(testrec);

  testrec.feld1 := 'Manfred';
  testrec.feld2 := 'Bauer';
  testrec.feld3 := 'Weimar';
  RecordListe.Add(testrec);

  LocalListe.Create;
  LocalListe := Stripped_Liste(RecordListe, 'Berlin');

end;
Karl
  Mit Zitat antworten Zitat