Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen? (https://www.delphipraxis.net/183597-delphifunktion-um-die-laenge-eines-array-einem-array-variant-zu-bestimmen.html)

BadenPower 21. Jan 2015 20:03

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.

implementation 21. Jan 2015 20:18

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von BadenPower (Beitrag 1287343)
Delphi-Quellcode:
Länge := Length(VarArray[0]);

Kleine Veränderung:
Delphi-Quellcode:
Laenge := Length(VarArray); // Ohne [0]

BadenPower 21. Jan 2015 20:24

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von implementation (Beitrag 1287345)
Kleine Veränderung:
Delphi-Quellcode:
Laenge := Length(VarArray); // Ohne [0]

Das ergibt die Länge des Arrays und nicht die Länge des Arrays, welches im Array unter dem ArrayIndex 0 liegt.

Sir Rufo 21. Jan 2015 20:26

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
http://www.delphipraxis.net/808-vari...verstehen.html ;)

BadenPower 21. Jan 2015 20:29

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1287347)

Schöner Link. Zeigt aber keine Funktion mit welcher man die Länge auslesen kann.

Sir Rufo 21. Jan 2015 20:34

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von BadenPower (Beitrag 1287349)
Zitat:

Zitat von Sir Rufo (Beitrag 1287347)

Schöner Link. Zeigt aber keine Funktion mit welcher man die Länge auslesen kann.

Immer hübsch de Äuglein uffmache
Zitat:

Zitat von jbg (Beitrag 6348)
Nach kurzen Stöbern in der OnlineHilfe:
VarArrayDimCount, VarArrayHighBound, VarArrayLowBound

http://docwiki.embarcadero.com/Libra...rArrayDimCount

BadenPower 21. Jan 2015 20:52

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1287351)
Immer hübsch de Äuglein uffmache
Zitat:

Zitat von jbg (Beitrag 6348)
Nach kurzen Stöbern in der OnlineHilfe:
VarArrayDimCount, VarArrayHighBound, VarArrayLowBound

http://docwiki.embarcadero.com/Libra...rArrayDimCount

Diese Funktionen kenne ich zur Genüge.

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.

Sir Rufo 21. Jan 2015 21:02

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

BadenPower 21. Jan 2015 21:29

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.

implementation 21. Jan 2015 21:33

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 ;)

himitsu 21. Jan 2015 21:56

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:
 lArray1 := VarArrayCreate([0,5],varVariant);
natürlich nicht funktionieren kann.

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.

BadenPower 21. Jan 2015 21:57

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von implementation (Beitrag 1287357)
Man könnte den Testcode ja mal so ergänzen, dass er auch die tatsächliche Fehlermeldung ausgibt ;)

Wenn das Programm läuft und Du den Button betätigst, dann müsste er in Zeile 90 >>> Label4.Caption := IntToStr(Length(lArray2[0])); <<< im Debugger die Exception auswerfen.

BadenPower 21. Jan 2015 22:02

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von himitsu (Beitrag 1287358)
Und dann sollte man langsam mal den Unterschied zwischen Array, Variant und Variant-Array verstehen, dann wird klar, daß
Delphi-Quellcode:
 lArray1 := VarArrayCreate([0,5],varVariant);
natürlich nicht funktionieren kann.

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.

Das VarArrayCreate funktioniert ja, da das Array der 1. Ebene ein "Array of Variant" ist. Und in einer Variante kann ich ein Array speichern.

Aber es gibt scheinbar keine Funktion um die Länge von lArray[0] auszulesen.

himitsu 21. Jan 2015 22:27

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.
Delphi-Referenz durchsuchenDynArrayToVariant Delphi-Referenz durchsuchenDynArrayFromVariant
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.

BadenPower 21. Jan 2015 22:43

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von himitsu (Beitrag 1287364)
Ohh, dann hast du Glück,

Was hat das mit Glück zu tun???

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.

pelzig 22. Jan 2015 03:17

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

Mikkey 22. Jan 2015 09:28

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von BadenPower (Beitrag 1287365)
Aber immernoch suche ich eine Funktion zum Auslesen der Arraylänge der 2. Ebene.

Dann kehre nochmal zu VarArrayLowBound und VarArrayHighBound zurück.

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.

BadenPower 22. Jan 2015 09:35

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von pelzig (Beitrag 1287367)
Sorry für meinen kenntinsfreien Einwurf:
Kann man da nicht irgendwie "rückwärts" durch das zweidimensionale? Array parsen?

Die Länge auszurechnen ist ja nicht das Problem und in einem Einzeiler gelöst.

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:

Zitat von Mikkey (Beitrag 1287391)
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.

Bei einem leeren VarArray ist VarArrayHighBound(VarArray) -1 und daher funktioniert auch dort der folgende Einzeiler:
Delphi-Quellcode:
Länge := (VarArrayHighBound(VarArray,1) - VarArrayLowBound(VarArray,1) +1)

himitsu 22. Jan 2015 17:57

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von BadenPower (Beitrag 1287365)
Was hat das mit Glück zu tun???

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.

Genau, das gibt einen Typen "Variant" zurück (wo ein Variant-Array drin steckt) und du weißt es an einen Typen "Array of Variant" zu.

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 MSDN-Library durchsuchenSafeArrayGetLBound zugreifen mußt.
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.

BadenPower 22. Jan 2015 18:27

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von himitsu (Beitrag 1287487)
Genau, das gibt einen Typen "Variant" zurück (wo ein Variant-Array drin steckt) und du weißt es an einen Typen "Array of Variant" zu.

Wo???

Ich weise das von VarArrayCreate zurückgebene Variant einem Variant zu und nicht einem "Array of Variant".

Zitat:

Zitat von himitsu (Beitrag 1287487)
Und die Funktionen für das Auslesen der zweiten Ebene wurden mehrmals genannt, also nicht Length, High oder so, sondern VarArrayHighBound-VarArrayLowBound.

Ich hatte nach einer Funktion zum Auslesen der Länge gesucht und bisher immer noch nicht gefunden.

Ich habe keine Funktionen gesucht, mit deren Hilfe ich mir die Länge SELBST berechnen kann.

Zitat:

Zitat von himitsu (Beitrag 1287487)
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

Der Einzeiler zur Berechnung der Arraylänge, welchen ich oben gepostet habe, deckt auch die Möglichkeit ab, dass es auch einen negative ArrayIndex gibt.


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:

Zitat von himitsu (Beitrag 1287487)
Ich kann mir auch keinen Grund vorstellen, wozu man hier überhaupt ein Length braucht.

Das war ja auch nur ein Spielcode, um den Fehler beim Zugriff mit Length zu erzeugen.


NACHTRAG:


Zitat:

Zitat von himitsu (Beitrag 1287487)
Genau, das gibt einen Typen "Variant" zurück (wo ein Variant-Array drin steckt) und du weißt es an einen Typen "Array of Variant" zu.

Habe gerade nochmals den Spiel-Code, welchen ich gepostet habe angeschaut und tatsächlich die von Dir bemängelte Zuweisung(en) gefunden.

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.

Dejan Vu 23. Jan 2015 06:50

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.

BadenPower 23. Jan 2015 08:50

AW: Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1287520)
Wieso erwartest Du eigentlich, das die Bibliotheken für alle Problemstellungen eine fertige Funktion anbieten, ' ohne sie ausrechnen zu müssen'?

Weil es eigentlich logisch sein müsste, dass es so eine Funktion gibt.


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 12:28 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