Inhalt einer TStringList in ein dynamisches String Array
Um den Inhalt einer TStringList in ein String Array zu kopieren, reicht folgende Funktion:
Delphi-Quellcode:
Die Definition des Typs TStringArray ist notwendig, da Delphi keine arrays als Rückgabewert einer Funktion zu akzeptieren scheint.
type
TStringArray = array of string; function CopyListToArray(List: TStringList): TStringArray; var sCopyArray: TStringArray; nCount: Integer; begin SetLength(sCopyArray, List.Count); for nCount := Low(sCopyArray) to High(sCopyArray) do sCopyArray[nCount] := List.Strings[nCount]; Result := sCopyArray; end; |
Re: Inhalt einer TStringList in ein dynamisches String Array
Es sei noch anzumerken, dass, wenn man die Unit Types eingebunden hat, es bereits einen Typ TStringDynArray gibt und dann die separate Definition überflüssig wird :)
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Und das arbeiten erst mit einer lokalen Variable bremmst du Angelegenheit nur.
Delphi-Quellcode:
function CopyListToArray(List: TStringList): TStringArray;
var nCount: Integer; begin SetLength(result, List.Count); for nCount := Low(result) to High(result) do result[nCount] := List.Strings[nCount]; end; |
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
und das Result selber ist auch nur eine "lokale/temporäre" Variable :angel: (Bezüglich der Exceptionbehandlung wird Result ja erst nach Funktionsende an die externe Variable übergeben) Aber stimmt schon, wozu nocheine Variable, wo es doch eh an das Result geht. Allerdings vermute ich hier den Einfluß von C und Co. wo mit Zuweisen des Return-Wertes die Funktion verlassen wird. |
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
Delphi-Quellcode:
und wie bekannt ist, zeigt der interne Pointer auf Data ...
Const DynArrayInfo = SizeOf(Header); // Herader = RefCount + ElementCount
MaxLengthOfMyType = (High(Integer) - DynArrayInfo) div SizeOf(TMyType); Type TDynArrayInfo = packed Record RefCount: LongInt; ElementCount: LongInt; Data: packed Array[0..MaxLengthOfMyType-1] of TMyType; End; PS: AnsiString und UnicodeString sind auch nur ein dynamisches Array (allerdings mit noch einem zusätzlichen 0#-Data-Feld am Ende) und WideString ist ein OLEStr [add] Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
Zitat:
|
Re: Inhalt einer TStringList in ein dynamisches String Array
nein, WideStrings werden von der CompilerMagic an die WinAPI weiterrereicht und dann auch automatisch reservier/freigegeben, allerdings besitzen sie keine Referenzzählung,
also bei
Delphi-Quellcode:
wird nicht nur ein winziger Referenzzähler verändert, so wie bei Ansistring,
Var S, S2: WideString;
S := S2; sondern es wird eine komplett neue Kopie des gesamten Strings angefertigt und an S übergeben. [add] Length wird sozusagen an SysStringLen weitergeleitet (wobei das optimiert wurde, da kurz vor dem OLEString die Größe steht, also wird diese einfach direkt ausgelesen und durch 2 geteilt, da Größe in Byte) und der Rest wird an SysAllocStringLen, SysReAllocStringLen und SysFreeString weitergeleitet, also wenn eine WideString-Variable initialisiert/finalisiert oder irgendwo verändert wird |
Re: Inhalt einer TStringList in ein dynamisches String Array
Man könnte auch sagen, bei widestrings ist der imaginäre Referenzzähler immer 1. Und sobald eine Variable vom Typ WideString ihre Gültigkeit verliert wird der String freigegeben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 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