Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi function FillString_list(Value: array of [string; TCode]) (https://www.delphipraxis.net/215846-function-fillstring_list-value-array-%5Bstring%3B-tcode%5D.html)

ebi 16. Sep 2024 20:10

function FillString_list(Value: array of [string; TCode])
 
Hallo Zusammen,

kann man eine Function mit variablem Übergabe-Parameter entwickeln?

Delphi-Quellcode:
type
  TCode = record
    Wort: string;
    Bezeichnung: string;
  end;

  TSteuerung = class
  const
    Ebene: array [1 .. 3] of string = ('G17', 'G18', 'G19');
  public
    Name: string;
    Nullpunkt: array of string;
    Parameter: array of string;
    Wegbedingung: array of TCode;
    Schaltfunktion: array of TCode;
    TAdresse: array of TCode;
    constructor Create; overload;
    constructor Create(Value: string); overload;
  end;
Delphi-Quellcode:
function FillString_list(Value: array of string): TStrings;
var
  list: TStrings;
begin
  list := TStringList.Create;
  for var I := 0 to Length(Value) - 1 do
    list.Add(Value[I]);
  result := list;
end;
Delphi-Quellcode:
FieldByName(MyTableFields[5]).AsWideString :=
  FillString_list(TSteuerung(MyObjects[P^]).Parameter).Text;

{ Schleife ebenfalls an FillString_list(Value: array of ...) übergeben }

for var I := 0 to Length(TSteuerung(MyObjects[P^]).Wegbedingung) - 1 do
liste.add(TSteuerung(MyObjects[P^]).Wegbedingung[I].Wort);
  FieldByName(MyTableFields[6]).AsWideString := liste.Text;
liste.clear;

himitsu 16. Sep 2024 20:50

AW: function FillString_list(Value: array of [string; TCode])
 
überladene Funktionen
Delphi-Quellcode:
function FillString_list(Value: array of string): TStrings; overload;
function FillString_list(Value: array of TCode): TStrings; overload;
oder OperatorOverloading (macht aus dem String ein TCode)
https://docwiki.embarcadero.com/RADS...toren_(Delphi)
Delphi-Quellcode:
type
  TCode = record
    Wort: string;
    Bezeichnung: string;
    class operator Implicit(const Value: string): TCode;
  end;

function FillString_list(Value: array of TCode): TStrings;
Implicit = automatisch bei Übergabe an Variablen, Parameter oder Property des Zieltyps.
Explicit = ein direkter Cast ala
Delphi-Quellcode:
TCode('ein StringKonstante oder eine StringVariable/Property/FunctionResult')
(der Cast nimmt auch das Implicit, wenn es kein Explicit gibt)

Aber das hier
Delphi-Quellcode:
FillString_list(xxx).Text;
kannst du komplett vergessen, bei deinem aktuellen Design, da es keine automatische Speicherverwaltung für Objekte gibt, ergibt das ein wunderschönes Speicherleck.
-> Interface ala IStrings oder TArray<string> oder einen Record (drin mit einem Array oder als CustomManagedRecord) als Result
-> oder die StringList wird intern gespeichert und durch jemand anderen freigegeben, außerhalb dieser Funktion.
Ansonsten mußt das TStrings/TStringList in eine Variable speichern und selbst ein Free machen.

Ansonsten sollte man solche Funktionen auch besser so benennen, dass sie das Result "erstellen", damit jeder gleich weiß, dass er es freigeben muß. (z.B. noch ein Create, Build, Make oder Ähnliches in den Namen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz