Gui eingabebedingt verändern

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Gui eingabebedingt verändern

Re: Gui eingabebedingt verändern

Post by just me » 25 Apr 2020, 05:43

Moin,

schauen wir kurz noch einmal hinter die Hecke:

Die vCtrlVar Option der Guicontrols hat zwei Aufgaben:
  • Sie dient als Name/ID eines Controls.
  • Sie dient als Name der Ausgabevariable für den aktuellen Inhalt bzw. Zustand des Controls.
Die automatische Verknüpfung von Variable und Control funktioniert dabei immer nur beim Auslesen: Control -> Variable. Ansonsten kann man mit den Variablen anstellen, was man will. Änderungen am Variableninhalt haben keinen Einfluß auf das Control.

Für das Auslesen des aktuellen Inhalts bzw. Zustands von Controls gibt es mehrere Möglichkeiten. Für ListView und TreeView, den Außerirdischen unter den AHK-Controls, funktionieren die nachfolgend beschriebenen aber nicht. Man kann das in der Doku in Ruhe nachlesen.
  • GuiControlGet
    Mit dieser Anweisung kann jederzeit auf genau 1 Control zugegriffen werden. Wenn AHK dabei für den Namen der Ausgabevariablen ein passend benamtes Control findet, kann der dritte Parameter (SteuerelementID) leer gelassen werden.
  • Gui, Submit, ...
    Mit dieser Anweisung wird der Inhalt/Zustand der 'eingabefähigen' Controls eines Fensters in einem Rutsch in die zugewiesenen Variablen geschrieben, so vorhanden. Als 'eingabefähig' werden in erster Linie die Controls betrachtet, deren Inhalt bzw. Zustand durch Benutzereingaben verändert werden kann.
  • gLabel (Jawoll!)
    Einige Controls schreiben ihren aktuellen Wert automatisch in die zugewiesene Variable, wenn ihr gLabel aufgerufen wird. Dazu gehören zumindest DateTime, MonthCal, UpDown und (etwas anders) Tab3. Dieses Verhalten ist in der Doku zum Control beschrieben.
Nun fragt mich bitte nicht, warum das für unterschiedliche Controls so unterschiedlich funktioniert. Ich habe keine Ahnung!

Re: Gui eingabebedingt verändern

Post by BNOLI » 24 Apr 2020, 11:09

... übersetzt: die Variable weiß, das sie nichts weiß :lol: (das AHKForum einmal mehr in einer Hochzeit als Hort von Philosophen, Philanthropen und Philistern) :lol:

Re: Gui eingabebedingt verändern

Post by just me » 24 Apr 2020, 05:39

@BNOLI:

AHK-Variablen werden bereits beim Einlesen des Skripts angelegt und intern als Objekte verwaltet. Diese Variablenobjekte enthalten u.a. einen Zeiger (Pointer) auf einen Speicherbereich für Zeichenketten (Strings) und einen Wert für die Länge des dort abgelegten Strings, die per StrLen() abgefragt werden kann. Ohne Zuweisung wird der Zeichenspeicher mit einer Länge von 3 Zeichen + Nullterminator (0x00 bzw. 0x0000) angelegt, d.h. 4 Bytes für ANSI und 8 Bytes für Unicode. Dann wird der Nullterminator auf die Position des ersten Zeichens geschrieben und die Länge auf Null gesetzt. AHK-Variablen enthalten deshalb immer mindestens einen String der Länge Null, das ist der berühmte 'leere String'.

Re: Gui eingabebedingt verändern

Post by BNOLI » 23 Apr 2020, 10:31

[OT]
Spoiler
[/OT]

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 23 Apr 2020, 10:20

BNOLI wrote:
23 Apr 2020, 09:55
Oops, "... zum jeweilgen [vorab zu setzenden] Label" :facepalm: *leicht gemurmeltes "Schuldigung", eher gehaucht. Nahezu unhörbar* :mrgreen:
... doch die "vor dem Auslösen leeren GuiVariablen" lasse ich jetzt erst nochmal wirken. Meiner einer denkt nämlich das diese durch ChooseN bereits 'befüllt' sind ...
Ja wenn du die Variable mit Choose1 oder später mit GuiControl, Choose, D1, a füllst, dann ist natürlich etwas enthalten. Wenn du beides weglässt, ist die DDL auch leer.

Re: Gui eingabebedingt verändern

Post by BNOLI » 23 Apr 2020, 09:55

Oops, "... zum jeweilgen [vorab zu setzenden] Label" :facepalm: *leicht gemurmeltes "Schuldigung", eher gehaucht. Nahezu unhörbar* :mrgreen:
... doch die "vor dem Auslösen leeren GuiVariablen" lasse ich jetzt erst nochmal wirken. Meiner einer denkt nämlich das diese durch ChooseN bereits 'befüllt' sind ...

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 23 Apr 2020, 09:42

BNOLI wrote:
23 Apr 2020, 09:22
Immer wenn du im Gui einen Button anklickst, eine Checkbox auswählst oder du etwas aus der Dropdownliste auswählst, Springst du zum jeweiligen G-Label ...
Nö. Beim Button mag das noch gehen. Bei andren GuiControls müssten die gLabel erst explizit gesetzt werden, sonst passiert da erstmal nichts.
Im nachfolgenden Beispielscript ist DDL2 mit gLabel versehen. Jede Auswahl dort triggert das damit verbundene Label. Bei DDL1 ist dies nicht der Fall ...

Code: Select all

Gui, Add, DDL, x100 y100	w100 vD1 		Choose1, a|b|c|d
Gui, Add, DDL, x100 yp+20	w100 vD2 gD2	Choose4, 1|2|3|4
Gui, Show,, myGui
Return


F1::
	GuiControlGet, vf1,,D1
	MsgBox % vf1
	Return

D2:
	GuiControlGet, vD2,, D2
	ToolTip % vD2
	Sleep, 600
	ToolTip
	Return
hä? ja logisch ist genau das was ich sagte. Bei einem Button musst du auch ein gLabel zuweisen sonst passiert da auch nichts.

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 23 Apr 2020, 09:38

@BNOLI ja das ist normal GuiControlGet ruft ein einzelnen Parameter einer Variable ab und Gui, Submit, NoHide ruft eben alle Parameter aller Variablen ab. Je nachdem was man bevorzugt bzw. besser zudem passt was man macht.

Re: Gui eingabebedingt verändern

Post by BNOLI » 23 Apr 2020, 09:22

Davor sind alle Variablen immer leer, den bis zum auslösen kann sich ja noch z.b. Text im Edit Fenster ändern. Hoffe du weißt nun bescheid.
Bin nicht sicher ob das so stimmt. Mit GuiControlGet kann ich z.B. Statusabfragen auf GuiControls vornehmen ohne das die Gui geschlossen oder per anderweitigem GuiEvent losgetriggert wird. Hier fehlt ein Button auf der Gui. Gui, Submit gibts auch nicht, und geht dem doch ;)
Immer wenn du im Gui einen Button anklickst, eine Checkbox auswählst oder du etwas aus der Dropdownliste auswählst, Springst du zum jeweiligen G-Label ...
Nö. Beim Button mag das noch gehen (default label?). Bei andren GuiControls müssten die gLabel erst explizit gesetzt werden, sonst passiert da erstmal nichts.
Im nachfolgenden Beispielscript ist DDL2 mit gLabel versehen. Jede Auswahl dort triggert das damit verbundene Label. Bei DDL1 ist dies nicht der Fall ...

Code: Select all

Gui, Add, DDL, x10 y10	 vD1 		Choose1, a|b|c|d
Gui, Add, DDL, x10 yp+20 vD2 gD2	Choose4, a|b|c|d
Gui, Show,, myGui
Return


F1::
	GuiControlGet, vf1,,D1
	MsgBox % vf1
	Return

D2:
	GuiControlGet, vD2,, D2
	ToolTip % vD2
	Sleep, 600
	ToolTip
	Return
	

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 23 Apr 2020, 08:51

Meister Lampe wrote:
23 Apr 2020, 08:39
Hallo just me!
just me wrote:
23 Apr 2020, 04:01
... Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, ...
Das ist jetzt nicht Dein Ernst, oder?
Doch, tatsächlich. Wie ich in 1.) erläutert hatte, habe ich eine Funktion gesucht, die die Eingaben in die Steuerelemente gleich erfassen kann, damit sie bei noch offenem Formular (also Gui) verwertet werden können - ohne, daß ich dazu einenn Ok-Button o.ä. drücken müßte. Das Gui, Submit, nohide steht zwar auch in den Scripts, bei denen Du mir geholfen hast, aber ich glaube, weil es am Anfang eines Labels steht, habe es mit dieser Funktion nie assoziert. Ich hatte wohl immer gedacht, das müsse direkt innerhalb des Gui-Codes stehen, zwischen der Beschreibung der anderen Steuerelemente.

Viele Grüße von Meister Lampe
Ja das war leider falsch gedacht.
Immer wenn du im Gui einen Button anklickst, eine Checkbox auswählst oder du etwas aus der Dropdownliste auswählst, Springst du zum jeweiligen G-Label und genau dann musst du Gui, Submit, nohide auslösen, damit die Variablen abgerufen werden. Davor sind alle Variablen immer leer, den bis zum auslösen kann sich ja noch z.b. Text im Edit Fenster ändern. Hoffe du weißt nun bescheid.

Re: Gui eingabebedingt verändern

Post by Meister Lampe » 23 Apr 2020, 08:39

Hallo just me!
just me wrote:
23 Apr 2020, 04:01
... Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, ...
Das ist jetzt nicht Dein Ernst, oder?
Doch, tatsächlich. Wie ich in 1.) erläutert hatte, habe ich eine Funktion gesucht, die die Eingaben in die Steuerelemente gleich erfassen kann, damit sie bei noch offenem Formular (also Gui) verwertet werden können - ohne, daß ich dazu einenn Ok-Button o.ä. drücken müßte. Das Gui, Submit, nohide steht zwar auch in den Scripts, bei denen Du mir geholfen hast, aber ich glaube, weil es am Anfang eines Labels steht, habe es mit dieser Funktion nie assoziert. Ich hatte wohl immer gedacht, das müsse direkt innerhalb des Gui-Codes stehen, zwischen der Beschreibung der anderen Steuerelemente.

Viele Grüße von Meister Lampe

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 23 Apr 2020, 08:33

just me wrote:
23 Apr 2020, 04:01
... Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, ...
Das ist jetzt nicht Dein Ernst, oder?
:lol: :lol: :lol:
Naja was man nicht weiß kann man nicht wissen. Ich kann ihn verstehen, ging mir am anfang etliche male so, obwohl ich es kannte.

Re: Gui eingabebedingt verändern

Post by BNOLI » 23 Apr 2020, 04:32

just me wrote:
23 Apr 2020, 04:01
... Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, ...
Das ist jetzt nicht Dein Ernst, oder?
Deshalb meine Frage nach der seiner verwendeten Sprachversion der AHK-Hilfe (Rückfragen werden jedoch ungern beantwortet). Gui. Submit. NoHide. 'Selbstredender' geht nicht. :silent: :lolno:

Re: Gui eingabebedingt verändern

Post by just me » 23 Apr 2020, 04:01

... Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, ...
Das ist jetzt nicht Dein Ernst, oder?

Re: Gui eingabebedingt verändern

Post by Meister Lampe » 22 Apr 2020, 17:17

Hallo UnReALiTyy!

Vielen Dank, jetzt hats geklappt! Der Hinweis auf das Gui, Submit, nohide, von dem ich bisher nicht wußte, welche Funktion das im Script hat, nämlich genau diejenige, die ich gesucht hatte.

@just me
Edit: Arbeitest Du jetzt für ein Reisebüro? ;)
Nein, ich habe nicht umgesattelt - in CoronaZeiten wäre ja gerade diese Branche wohl auch nicht sehr lohnend. :?
Du wirst schon noch sehen, was es damit auf sich hat.

Viele Grüße von Meister Lampe

Re: Gui eingabebedingt verändern

Post by BNOLI » 20 Apr 2020, 07:20

Confirmed :yawn:

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 20 Apr 2020, 05:36

@Meister Lampe das wichtigste überhaupt beim Arbeiten mit Guis und Variablen ist Gui, Submit, nohide dies Ruft den inhalt aller Steuerelemente ab und Speichert sie in der dazugehörigen Variable, ohne die Gui zu verstecken.

@BNOLI das gLabel steht für Gosub, nicht für Goto. Ein entscheidender Unterschied.

Re: Gui eingabebedingt verändern

Post by BNOLI » 20 Apr 2020, 01:45

zu 1. Gui, Add, Edit, r9 w135 vMyEdit gMyGotoLabel, Text to appear inside the edit control (omit this parameter to start off empty).
... anschließend über einen weiteren Paramter, das gLabelName (AKA 'goto LabelName'), in eine Subroutine springen und dort die Variablen verwursten.

zu 2. da sind wir wieder beim ursprünglichen Problem. Nicht jede Vorgehensweise muß für jedes Gui-Control syntaktisch gleich sein. Und dir alle Optionen zu erläutern, wenn du dann letztendlich doch nur eine davon benutzt, das ist dann unnötige Lebenszeitvernichtung. Lege dich auf eine Option fest, nachdem du gesichtet hast welche deinen Anforderungen am ehesten entspricht. Und dann kanns losgehen.

zu 3. über den parameter enable/disable (wie schon mehrmals ausgeführt, s.o.)

Generelle Frage: benutzt du die Englische AHK Hilfe, oder die Deutsche - welche über das Hauptmenü der AHK-Onlinehilfe auswählbar ist (en/de/...) !?

https://www.autohotkey.com/docs/commands/GuiControl.htm#Disable
https://ahkde.github.io/docs/commands/GuiControl.htm#Disable

Re: Gui eingabebedingt verändern

Post by Meister Lampe » 19 Apr 2020, 17:20

Hallo!

Entschuldigt bitte, daß ich Euch etwas durcheinander gebracht habe. Mein Prinzip ist eigentlich, möglichst viel selber erledigen zu können, weshalb ich möglichst Beispiele verwende, mit deren Antwort ich dann meine weiterzukommen. Ich wollte eigentlich folgende drei Informationen haben und in diese hereinpacken:
1.) Wie kann ich bereits während dem Durchgang eines Formular-Guis die Inhalte der bereits ausgefüllten Steuerelemente als Variablen erfassen? Dabei hielt ich es für egal, ob das über eine CheckBox, einen RadioButton oder eine DropDownList geschieht.
2.) Wie kann ich abhängig davon das Aussehen oder den Status von Steuerelementen in der Gui verändern? Auch das muß nicht unbedingt ein Edit sein, wie in meinen Beispielen.
3.) Wie kann ich ein Edit-Feld temporär und variablenbedingt deaktivieren? Im Code selber kann ich das Ding ausblenden:

Code: Select all

If (ZustandEdit = "ja")
{
Gui, Add, Edit, vVarEdit,
}
Doch "wirkt" das erst beim nächsten Öffnen der Gui. Außerdem sollte man das Edit-Feld schon noch erkennen, nur nicht benutzen können.

Ich hatte gedacht, alles Weitere könnte ich mir dann selber zusammenbasteln, sobald ich diese Infos hätte. Und weil es mir eben egal schien, über welches Steuerelement diese Variablen eingegeben werden, hatte ich das erstbeste Beispiel genommen, das mir einfiel.

Viele Grüße von Meister Lampe

Re: Gui eingabebedingt verändern

Post by UnReALiTyy » 19 Apr 2020, 14:44

divanebaba wrote:
19 Apr 2020, 08:29
Die Lösung, ein Control so einzustellen, daß es, wie hier gewünscht ist, von einem Tab übersprungen wird, interessiert mich, denn das wiederum weiß ich nicht.
Das verstehe ich auch wieder nicht!? :think:

Top