![]() |
Re: Array als Referenz einer Methode übergeben
Genau. Wenn Du wieder testen kannst, versuch es mal damit (klitzekleine Änderung):
Delphi-Quellcode:
type tNumArray = Array of Byte;
procedure AddNumbers(var a:tNumArray); begin SetLength(a,High(a)+3); // add 2 numbers a[High(a)-1]:=44; a[high(a) ]:=55; end; procedure TfoTest03.FormShow(Sender:TObject); var i : Integer; NumArray : tNumArray; //nun als lokale Variable begin SetLength(NumArray,Listbox1.Items.Count); for i:=0 to Listbox1.Items.Count-1 do // array aus listbox1 NumArray[i]:=StrToInt(Listbox1.Items[i]); // füllen AddNumbers(NumArray); // array erweitern for i:=0 to high(NumArray) do // array in listbox2 Listbox2.Items.Add(IntToStr(NumArray[i])) // anzeigen end; |
Re: Array als Referenz einer Methode übergeben
Danke. Das wird in ca. 1-2 Stunden sein. Gebe auf jeden Fall Rückmeldung. Danke!
|
Re: Array als Referenz einer Methode übergeben
Also, genau so, wie es jetzt von dir gepostet wurde (DeddyH), hatte ich es von Anfang an gehabt. Hier nochmal meine Version, falls ich was übersehen habe.
Delphi-Quellcode:
So, und in der Bibliotheks-Unit wird nicht die lokale Variable "Daten" genutzt, sondern eine völlig neue, gleichen Typs initialisiert und beschrieben.
type
TSQLData = array of array of String; type //SQL-Funktionen procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true); function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean; //SQL-Funktionen procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true); begin SetLength(data, Succ(Length(data)), 2); if (utf8enc) then begin data[High(data)][0]:=utf8encode(feld); data[High(data)][1]:=utf8encode(wert); end else begin data[High(data)][0]:=feld; data[High(data)][1]:=wert; end; end; function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean; var i: Integer; begin for i:=0 to High(data) do begin ShowMessage(data[i][0]+' '+data[i][1]); end; end; /////////////////// //// HAUPTUNIT //// /////////////////// procedure TForm1.frmSchemabtnSaveClick(Sender: TObject); var daten: TSQLData; begin AddSQLField(daten, 'pid', '1'); AddSQLField(daten, 'titel', frmGesetz.Editor.Text); AddSQLField(daten, 'text', 'test2'); InsertSQL(ZQuery1, 'test', daten); end; Ich verstehe aber ehrlich gesagt nicht, wieso das so ist. Denn, ein Array ist doch schon ein Pointer auf eine Adresse und wenn ich diesen übergebe, wie kann dann ein neues Array angelegt werden? Danke! |
Re: Array als Referenz einer Methode übergeben
Bei Arrays verhält es sich anders als bei Objekten. Übergib die Arrays doch einmal als Var-Parameter, dann sollte das auch klappen.
|
Re: Array als Referenz einer Methode übergeben
Du hast Detlefs "var" unterschlagen. Der Grund, warum dies nötig ist, ist einfach: Es kann vorkommen, dass SetLength die Array-Daten verschieben muss, der Zeiger selbst wird also verändert. Aus diesem Grund ist der erste Parameter von SetLength auch als var deklariert. Wenn du nun den Array-Parameter nicht als var deklarierst, zählt der Parameter als neue Referenz (dynamische Arrays unterliegen der Referenzzählung). SetLength muss daher in jedem Fall ein neues Array anlegen, um die andere Referenz nicht zu verändern.
|
Re: Array als Referenz einer Methode übergeben
Oha... das wusste ich nicht. Auch ist mir das VAR garnicht aufgefallen. Ich sollte öfter 9Live schauen, um meine Augen zu trainieren ;)
Ich werde das - leider wieder - erst später testen ... Vielen Dank |
Re: Array als Referenz einer Methode übergeben
Warum muss es denn ein Array sein?
Ein Liste (z.B. eine Ableitung von TList oder TObjectlist) kann all das leisten, was du brauchst. Übrigens, schau die mal folgende Deklarationen an:
Delphi-Quellcode:
Was fällt auf? Richtig, beides Mal wird TSQLData übergeben.
procedure AddSQLField(data: TSQLData; feld: String; wert: String; utf8enc: Boolean = true);
function InsertSQL(ZQuery: TZQuery; table: String; data: TSQLData): Boolean; Eigentlich müsste doch TSQLData eine Klasse sein, dann würde sich Einiges vereinfachen. |
Re: Array als Referenz einer Methode übergeben
Oh jubel, oh freu... ;)
Funktioniert richtig gut. Es lag tatsächlich am --var--. Vielen Dank. @sx2008: Ich mag arrays... ;) Nein, ich wollte keine Klasse bauen, weil mir dafür der Aufwand zu groß und das Projekt in dem Punkt zu klein ist. Außerdem kann ich auf Grund einer Bandscheiben-OP nicht sitzen. Darf nur stehen. Das ist auch der Grund, warum ich nie so lange am PC sein kann. Nunja, all diese Sachen summieren sich dann dazu, dass ich mich zu dieser Lösung entscheide, die ja eigentlich so auch nicht schlecht ist, oder? |
Re: Array als Referenz einer Methode übergeben
Zitat:
![]() Bei Konstruktionen wie array of array of TDatentyp muss man jeder Stelle die Indexgrenzen beachten. Durch eine Klasse wird dies wesentlich vereinfacht und sicherer. Ansonsten gute Besserung. :hi: |
Re: Array als Referenz einer Methode übergeben
;)
Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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