AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphifunktion um die Länge eines Array in einem "Array of Variant" zu bestimmen?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "BadenPower"
Ein Thema von BadenPower · begonnen am 21. Jan 2015 · letzter Beitrag vom 23. Jan 2015
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#11

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

  Alt 21. Jan 2015, 21:56
Und dann sollte man langsam mal den Unterschied zwischen Array, Variant und Variant-Array verstehen, dann wird klar, daß
 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Jan 2015 um 21:58 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#12

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

  Alt 21. Jan 2015, 21:57
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.
Miniaturansicht angehängter Grafiken
exception.jpg  
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#13

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

  Alt 21. Jan 2015, 22:02
Und dann sollte man langsam mal den Unterschied zwischen Array, Variant und Variant-Array verstehen, dann wird klar, daß
 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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#14

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

  Alt 21. Jan 2015, 22:27
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Jan 2015 um 22:31 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#15

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

  Alt 21. Jan 2015, 22:43
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#16

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

  Alt 22. Jan 2015, 03:17
Sorry für meinen kenntinsfreien Einwurf:

Kann man da nicht irgendwie "rückwärts" durch das zweidimensionale? Array parsen?

MfG
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#17

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

  Alt 22. Jan 2015, 09:28
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#18

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

  Alt 22. Jan 2015, 09:35
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)

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:
Länge := (VarArrayHighBound(VarArray,1) - VarArrayLowBound(VarArray,1) +1)
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (22. Jan 2015 um 09:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#19

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

  Alt 22. Jan 2015, 17:57
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.

Ich frag mich grade, ob es nicht vielleicht inzwischen einen netten Record-Helper für Variants gibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Jan 2015 um 18:04 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#20

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

  Alt 22. Jan 2015, 18:27
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".

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.

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.

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:


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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (22. Jan 2015 um 19:21 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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