![]() |
Delphi-Version: 2007
Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Hallo zusammen,
ich habe jetzt stundenlang gesucht, aber bin nicht fündig geworden. Gibt es in Delphi keine Funktion, um die Länge eines Array in einem "Array of Variant" zu bestimmen? Also so etwas wie:
Delphi-Quellcode:
Länge := Length(VarArray[0]);
Dies funktioniert natürlich nicht. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Delphi-Quellcode:
Laenge := Length(VarArray); // Ohne [0]
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Zitat:
![]() |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
VarArrayDimCount: Gibt die Anzahl der Dimensionen zurück, aber nicht die Arraylänge. Löst beim Aufruf von Array[0] eine Exception wenn das Array die Länge 0 hat. VarArrayLowBound: Gibt nur den niederen Indexwert aus. VarArrayHightBound: Gibt nur den höchsten Indexwert aus, oder auch nicht, wenn das Array die Länge 0 hat. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Tja, da wirst du wohl mal folgendes machen müssen:
Poste den Code der das Problem zeigt Teile uns die Exception mit (CopyPaste der Meldung) Dann schauen wir weiter |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
hier einmal ein wenig Testcode:
benötigt 1x Form 1x Button 4x Label
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyVarArray = Array of Variant; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function LocalNewArray(): TMyVarArray; begin //Result := VarArrayCreate([-3,-2],varVariant); //Result := VarArrayCreate([0,5],varVariant); SetLength(Result,0); end; procedure TForm1.Button1Click(Sender: TObject); var lArray1: Array of Variant; lArray2: Array of Variant; begin lArray1 := VarArrayCreate([0,5],varVariant); //SetLength(lArray1[0],0); lArray1[0] := VarArrayCreate([-3,-2],varVariant); lArray1[0][-2] := 'Test'; lArray2 := VarArrayCreate([0,10],varVariant); lArray2[0] := VarArrayCreate([0,10],varVariant); //lArray2[0] := LocalNewArray(); //SetLength(lArray2[0],0); try Label1.Caption := lArray1[0][-2]; //Label1.Caption := IntToStr(Length(lArray1)); except Label1.Caption := 'Fehler'; end; try Label2.Caption := IntToStr(Length(lArray2)); except Label2.Caption := 'Fehler'; end; try //Label3.Caption := IntToStr(VarArrayHighBound(lArray1[0],1)); Label3.Caption := IntToStr(VarArrayDimCount(lArray1[0])); //Label3.Caption := IntToStr(Length(lArray1[0])); //Label3.Caption := IntToStr(High(lArray1[0])); except Label3.Caption := 'Fehler'; end; try //Label4.Caption := IntToStr(VarArrayLowBound(lArray2,2)); //Label4.Caption := IntToStr(VarArrayHighBound(lArray2,2)); //Label4.Caption := IntToStr(VarArrayLowBound(lArray2[0],1)); //Label4.Caption := IntToStr(VarArrayHighBound(lArray2[0],1)); //Label4.Caption := IntToStr(VarArrayDimCount(lArray2[0])); Label4.Caption := IntToStr(Length(lArray2[0])); //Label4.Caption := IntToStr(High(lArray2[0])); except Label4.Caption := 'Fehler'; end; end; end. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Man könnte den Testcode ja mal so ergänzen, dass er auch die tatsächliche Fehlermeldung ausgibt ;)
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Und dann sollte man langsam mal den Unterschied zwischen Array, Variant und Variant-Array verstehen, dann wird klar, daß
Delphi-Quellcode:
natürlich nicht funktionieren kann.
lArray1 := VarArrayCreate([0,5],varVariant);
Die 1. Ebene ist ein stinknormales Array, also wird da mit SetLength/Length gearbeitet und erst in Ebene 2 kommen die Variants, in welche man Variant-Arrays reintun kann, wo man dann mit VarArrayCreate/VarArrayDimCount arbeiten könnte. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Aber es gibt scheinbar keine Funktion um die Länge von lArray[0] auszulesen. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Ohh, dann hast du Glück, daß automatisch _VarToDynArray aufgerufen wird, was aus deinem erstellten Variant-Array ein dynamisches Array macht.
![]() ![]() Hätte jetzt nicht erwartet, daß Delphi das automatisch macht, aber dennoch ist es praktisch falsch, da du dort eben ein dynamisches Array erstellen wolltest, es aber nicht machst. Und später versuchst du eines der Variant-Arrays als dynmamisches Array anzusprechen, was nicht geht, da du dem Compiler nicht explizit sagst was du willst. Der Compiler weiß ja nicht was in dem Variant steckt (also beim Compilieren) und springt beim Length aus Gewohnheit auf String, versucht den Variant also in einen String zu casten, was dir Delphi auch eindeutig sagt (siehe Fehlermeldung), um dann vom "String" das Length auszulesen. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Das Array der Ebene 1 ist ein Array mit Felder des Datentyps "Variant". Also ist Array[0] ein "Variant". Die Funktion VarArrayCreate() gibt den Datentyp "Variant" zurück. Aber immernoch suche ich eine Funktion zum Auslesen der Arraylänge der 2. Ebene. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Sorry für meinen kenntinsfreien Einwurf:
Kann man da nicht irgendwie "rückwärts" durch das zweidimensionale? Array parsen? MfG |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Abgesehen von der erforderlichen Sonderbehandlung leerer VarArrays, ergibt sich die Länge eines Arrays immer aus der Differenz des höchten Index´ und des niedrigsten Index` plus eins. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Die Frage ist, ob es denn wirklich keine integrierte Delphi-Funktion dafür gibt um die Länge eines Array, welches in einer Variante gespeichert ist, auszulesen. Für den normalen Datentyp Array gibt es: Low(Array), High(Array) und eben Length(Array) Ist das Array in einer Variante, dann gibt es: VarArrayLowBound(VarArray) und VarArrayHighBound(VarArray) aber so wie es scheint kein VarArrayLength(VarArray) Zitat:
Delphi-Quellcode:
Länge := (VarArrayHighBound(VarArray,1) - VarArrayLowBound(VarArray,1) +1)
|
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Und die Funktionen für das Auslesen der zweiten Ebene wurden mehrmals genannt, also nicht Length, High oder so, sondern VarArrayHighBound-VarArrayLowBound. Ja, es gibt kein VarArrayLength, aber hier muß man auch beachten, daß Vairant-Arrays nicht bei 0 beginnen müssen, so wie die dynamischen Arrays und dann sei bitte froh, daß du nicht selber direkt auf ![]() PS: Variant ist ein Typ vom Windows und dessen API stellt hat kein Length zur Verfügung, aber man kann gern an Embarcadero einen Feature-Request stellen und um ein Length bitten, wenn man es nicht schafft das selber zu schreiben. Ich kann mir auch keinen Grund vorstellen, wozu man hier überhaupt ein Length braucht. :gruebel: Ich frag mich grade, ob es nicht vielleicht inzwischen einen netten Record-Helper für Variants gibt. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Ich weise das von VarArrayCreate zurückgebene Variant einem Variant zu und nicht einem "Array of Variant". Zitat:
Ich habe keine Funktionen gesucht, mit deren Hilfe ich mir die Länge SELBST berechnen kann. Zitat:
Aber ich bin ja schon froh, dass auf meine Frage zum ersten mal eine Anwort kam und ich nicht alleine bin, der keine Funktion gefunden hat, welche die Länge zurück gibt, ohne sie ausrechnen zu müssen. Zitat:
NACHTRAG: Zitat:
Aber da tritt kein Fehler auf, da da ein automatischer Type-Cast stattfindet. Im Original-Code ist dort keine VarArrayCreate-Funktion, sondern die Länge des "Array of Variant" wird über SetLength() gesetzt. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Wieso erwartest Du eigentlich, das die Bibliotheken für alle Problemstellungen eine fertige Funktion anbieten, ' ohne sie ausrechnen zu müssen'? Wenn ich etwas passendes nicht finde, schreibe ich mir eine Funktion dafür. Ganz einfach. Manchmal stelle ich dann später fest: "Huch, gibts ja doch". Oder sie kommen später dazu.
Eine API hat nebenbei den Sinn und Zweck, die Elementaroperationen abzubilden, und nicht alle möglichen Kombinationen der Elementaroperationen. In Bibliotheken kommen dann noch sinnvolle und oft benötigte Funktionen hinzu, die technisch gesehen jedoch nicht notwendig sind. Wenn also 'VarArrayLowBound' und 'VarArrayHighBound' zur Verfügung gestellt wird, kann man sich daraus leicht sein 'VarArrayLength' zusammenzimmern. Gäbe es für jede Problemstellung etwas Fertiges, würde das Programmieren nicht nur keinen Spaß mehr machen, sondern auch gar nicht mehr stattfinden. |
AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Zitat:
Um den niedrigsten Indexwert eines Arrays zu erhalten gibt es Low(). Um den höchsten Indexwert eines Arrays zu erhalten gibt es High(). Um die Länge eines Arrays zu erhalten gibt es Length(). Um den niedrigsten Indexwert eines Arrays in einem Variant zu erhalten gibt es VarArrayLowBound(). Um den höchsten Indexwert eines Arrays in einem Variant zu erhalten gibt es VarArrayHighBound(). Warum gibt es nun kein VarArrayLength()??? Das ist doch eine berechtigte Frage. Bzw. war meine Frage, ob es solch eine Funktion gibt, denn ich hätte die Funktion auch übersehen haben können. Aber in Delphi wird das Array, egal in welcher Form nur stiefmütterlich behandelt. Es lebe PHP. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 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-2025 by Thomas Breitkreuz