_ArrayDisplay(): bestimmte nicht nebeneinanderliegende Spalten anzeigen mit $sArrayRange

  • Hallo zusammen, mal wieder nichts Brauchbares gefunden, wobei es sicher auch dazu Infos gibt:

    Ich möchte aus einem 2-dim Array Spalte 1 und Spalte $i anzeigen. Habe bei _ArrayDisplay() mit $sArrayRange verschiedene Varianten ausprobiert wie z.B. "|1," & $i oder auch einfach "|1,5" oder "|1;5" aber bisher keinen Erfolg. Die AutoIt-Hilfe zeigt als Beispiele nur Ranges, keine Einzelspalten als Möglichkeit. Kann es sein, dass das gar nicht geht?

    Ein Workaround ist programmiert, über eine For-Schleife kopiere ich die beiden Spalten in ein neues Array und zeige das zweite Array dann an. Falls es die Möglichkeit der direkten Zuweisung von Spalte 1 von Array1 in Spalte 1 von Array 2 und Spalte $i von Array 1 in Spalte 2 von Array 2 gibt, wäre zumindest der Workaround kürzer - aber auch dazu habe ich nichts gefunden.


    :/

    :)

  • Mit dem ArrayRange sind AFAIR nur zusammenhängende Bereiche möglich.

    Es gibt aber einen etwas trickreichen Workaround (mit der Timer-UDF):

  • Funktioniert exakt, aber von Verstehen bin ich weit entfernt :Glaskugel:  ;)

    Ich müsste aber auch da eine Schleife einbauen, da meine Arrays jeweils variable Größen haben, eines z.B. 38 Zeilen mit 180 Spalten. Ich müsste somit 178 Spalten ausblenden.

    Kann man denn eine Spalte von einem Array einer Spalte in einem anderen Array direkt zuweisen ohne For? Ich mache das im Moment so, wobei ich über $sCols beliebig viele Spalten auswählen kann (Optimierung welcome):

    :)

  • Kann es sein, dass das gar nicht geht?

    Sehe ich wie Oscar !

    Auch die Standardfunktion _ArrayExtract kann nur zusammenhängende "Spaltenbereiche" extrahieren.

    Beispiel :

    Spoiler anzeigen

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • ich glaub zwar zu wissen was du willst, aber Eierlegende Wollmilchsäue gibt es auch mit AutoIT nicht. Falls https://autoit.de/wcf/forenregeln/ du für Trickfilmsequenzen solche benötigst gibt es sicher besseres, denn die Forenregeln verbieten es

    ansonsten einfach echte Testdaten nach ISO-Norm deines Berufsverbandes bereitstellen.

    Aber fragen kann man doch und bekommt auch von allen anderen hilfreiche Antworten. Mein kurzes Programm ist doch schon fast eine eierlegende Wollmilchsau, wenn Du es Dir mal anschaust. Ich hatte nur die Idee, dass ich die For-Schleife durch einen einzelnen Befehl ersetzen kann. Der Hinweis auf _ArrayExtract() von Musashi wäre es ja schon fast.


    Was Du mit dem zweiten Satz, "Forenregeln und Trickfilmsequenzen" meinst, müsstest Du mir genauer erklären - das was ich wissen wollte und gefragt habe, kann in keinen Forenregeln verboten sein.

    Und dann noch der nächste Satz mit "Testdaten nach ISO-Norm meines Berufsverbandes" - jetzt bin ich ganz baff. Ich vermute, Du verwechselst mich, kann das sein?

    :)

  • Auch die Standardfunktion _ArrayExtract kann nur zusammenhängende "Spaltenbereiche" extrahieren.

    Danke für den Tipp. Der Befehl kommt trotzdem meiner Idee nah, aber das Problem wird auf der anderen Seite der Zuweisung liegen. Mit dem Befehl könnte ich doch nacheinander z.B. 2 getrennte Spalten aus einem Array ziehen, aber ich werde die nicht nacheinander einem neuen Array zugewiesen bekommen. Insofern denke ich, mein kleines Programm macht universell was ich brauche und hat auch nicht viel Overhead.

    :)

  • HansJ54 : Hier eine Variation (aber auch mit For..Next)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Funktioniert exakt, aber von Verstehen bin ich weit entfernt

    Naja, es ist etwas trickreich, weil hier der Umstand benutzt wird, dass die Funktionen der Timer-UDF quasi parallel weiter laufen, auch wenn das Script durch das ArrayDisplay eigentlich angehalten wird.

    So kann man in der Timer-Funktion die Spalten des ArrayDisplay verstecken.

    Aber statt hier rumzutricksen oder das Array umzukopieren, wäre es hilfreicher einfach eine eigene ArrayDisplay-Funktion zu schreiben.

  • wäre es hilfreicher einfach eine eigene ArrayDisplay-Funktion zu schreiben.

    Gibt es dazu irgendwo einen Ansatz, den ich weiterverfolgen kann? Ist nur zur Weiterbildung, eine brauchbare Funktion selbst habe ich ja schon.

    :)

  • Ich nutze das für verschiedene Tabellen, meistens brauche ich die erste Spalte als Beschriftung und dann irgendeine einzelne andere. Es gibt aber auch Fälle, da sind es 2 oder mehr andere, die nicht unbedingt nebeneinander liegen. Also so, wie es mein Programm mit der Kopie macht: Vorgabe n Spalten, Ausgabe n Spalten.

    Spoiler anzeigen
    Daten:
    KdNr 1234 3421 6543 3422 5334
    Verbindung 1234 3421 6543 3421 5334
    Name Schmitz Müller Schulz Müller Maier
    Vorname Klaus Michael Hans Josefine Josef
    Strasse Hauptstr. Im Grund Weststr. Im Grund Nebenstr.
    Hausnummer 35 6 22b 6 3
    Plz 50000 40000 40000 40000 80000
    Ort Köln Düsseldorf Hamburg Düsseldorf München
    Wahl: 1234
    KdNr 1234
    Verbindung 1234
    Name Schmitz
    Vorname Klaus
    Strasse Hauptstr.
    Hausnummer 35
    Plz 50000
    Ort Köln
    Wahl: 3421 (suche die Nr. in Verbindung)
    KdNr 3421 3422
    Verbindung 3421 3421
    Name Müller Müller
    Vorname Michael Josefine
    Strasse Im Grund Im Grund
    Hausnummer 6 6
    Plz 40000 40000
    Ort Düsseldorf Düsseldorf

    Die Suche der Spalten ist übrigens kein Problem, die Vorgabe für das neue ArrayDisplay wäre immer nur so etwas wie : $sCols = "1|3|5|9" - die tatsächlichen Tabellen sind wesentlich komplexer und teilweise über 2. und 3. Tabellen indiziert, also keine Arbeit in die Suche stecken ;)

    :)

    3 Mal editiert, zuletzt von HansJ54 (21. Mai 2022 um 16:56)

  • Ich habe mal ein Beispiel erstellt:

  • Das ist die wirklich optimale Lösung, danke! :)

    Wenn wir schon mal dabei sind: in einigen Fällen wäre es hilfreich, wenn ich einen Eintrag markieren und kopieren könnte. Das geht mit diesem Beispiel nicht, gibt es da noch eine Möglichkeit?

    Es könnte ja z.B. eine Textanzeige sein, bei der aber die Spalten exakt untereinander stehen müssten.

    :)

    Einmal editiert, zuletzt von HansJ54 (1. Juni 2022 um 20:19)

  • Wenn wir schon mal dabei sind: in einigen Fällen wäre es hilfreich, wenn ich einen Eintrag markieren und kopieren könnte. Das geht mit diesem Beispiel nicht, gibt es da noch eine Möglichkeit?

    Klar! Sind nur ein paar Zeilen mehr:

  • Vielen Dank noch mal für die Hilfe, funktioniert ebenfalls perfekt!

    Da ich es auf die Schnelle nicht komplett verstanden habe, wo die Problematik liegt (und wenn ich nicht zu viel Aufwand verursache) ;)

    Könnte man das Copy to Clipboard auch auf ein einzelnes angeklicktes Feld beschränken? Es ist oft eine Vertragsnummer oder eine Telefonnummer, die rauskopiert werden soll, nicht die ganze Zeile. Das allein hilft natürlich auch schon, da man ja den nicht benötigten Rest rauslöschen kann, aber vielleicht gibt es ja eine Erweiterung von Zeile auf Feld?

    :)

  • aber vielleicht gibt es ja eine Erweiterung von Zeile auf Feld?

    Naja, da wird's haarig!

    Man muss bei den SubItems dann tricksen:

  • Ich würde Dich gerne zu einem Glas Bier (oder auch 2) einladen!

    Nett von Dir, aber dafür wohnen wir doch etwas weit auseinander. :)

    So toll ist meine Lösung auch gar nicht. Als UDF taugt sie nicht, wegen der globalen Variablen und der Benutzung von GUIRegisterMsg.

    Und es wird das angeklickte SubItem nicht markiert (optische Schwachstelle). Als Notlösung vielleicht trotzdem brauchbar.