Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Gleiche GUI mehrfach verwenden aber mit verschiedenen Werten


  • Please log in to reply
30 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hallo zusammen,

 

im aktuellen Projekt werden Widervorlagen angelegt. Wenn diese von der Zeit her fällig sind soll eine GUI mit den Werten gefüttert und angezeigt werden.

 

Nun kann es ja durchaus sein, das 2 oder mehr Fälligkeiten auftreten weil die vorherigen z. B. noch nicht bearbeitet wurden.

 

Wie kann ich denn die gleiche GUI mehrfach verwenden und natürlich auch sicherstellen das ich die vom User veränderten Controls wieder auslesen und verarbeiten kann?

 

Hier die GUI (die gLabels für die Buttons fehlen noch):

Gui, Add, Text, x2 y0 w60 h20 , Dein ToDo:
Gui, Add, Edit, x2 y20 w230 h60 HWNDh_2_1,
Gui, Add, DropDownList, x92 y0 w140 h20 r3 HWNDh_2_2, Outbound|Systemänderung|Kontrolle
Gui, Add, Text, x2 y80 w120 h20 , Was hast du gemacht?:
Gui, Add, Edit, x2 y100 w230 h60 HWNDh_2_3,
Gui, Add, Text, x2 y160 w80 h20 +Right , Kundennummer:
Gui, Add, Edit, x92 y160 w120 h20 HWNDh_2_4 Limit11 Number,
Gui, Add, Text, x2 y180 w80 h20 +Right Limit10, Text ID:
Gui, Add, Edit, x92 y180 w120 h20 HWNDh_2_5,
Gui, Add, Text, x2 y200 w80 h20 +Right , Rückrufnummer:
Gui, Add, Edit, x92 y200 w120 h20 HWNDh_2_6 Limit15 Number,
Gui, Add, GroupBox, x242 y0 w130 h160 , Wiedervorlage:
Gui, Add, Edit, x252 y20 w30 h20 HWNDh_2_7 Limit3 Number,
Gui, Add, Button, x282 y20 w80 h20 , Snooze
Gui, Add, Text, x252 y40 w110 h20 +Center, max. 120 Min
Gui, Add, Text, x252 y70 w110 h20 +Center, Datum/Uhrzeit:
Gui, Add, DateTime, x252 y90 w110 h30 , dd.MM.yyyy HH:mm
Gui, Add, Button, x252 y120 w110 h30 , Wiedervorlage
Gui, Add, Button, x212 y160 w160 h30 , Ohne Note abschließen
Gui, Add, Button, x212 y190 w160 h30 , Mit Note abschließen
Gui, Add, Button, x2 y220 w370 h30 , Vorgang offen halten`, aber keine Erinnerung mehr anzeigen.
Gui, Show, x941 y230 h254 w376,
Return

GuiClose:
ExitApp

 

Da gibt es doch sicherlich eine Lösung für.

 

MfG
fump



robert_ilbrink
  • Members
  • 561 posts
  • Last active: Nov 07 2019 05:14 PM
  • Joined: 05 May 2012

Um den Input Felder zu löschen, setze ein vValue variable pro editbox:

 

Gui, Add, Edit, vFirstName

 

 

Später:

GuiControl, , FirstName ; Clear the input fields


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Ja klar... Das weiß ich schon alles. Aber wie kann ich die gleiche GUI mehrfach verwenden und hinterher auch die Daten die der User ändert wieder auslesen und verarbeiten?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Jedes Gui hat A_Gui damit kannst du die Nummer des Controls auslesen.

Anstatt 3 verschiedene Guis mit Gosubs etc. zu bauen kannst du doch die Gui mehrfach einen anderen Namen geben:

Gui,%a%: Add, Text, x2 y0 w60 h20 , Dein ToDo:
Gui, %a%:Add, Edit, x2 y20 w230 h60 HWNDh_2_1,
a++
Return

Damit es bei den Variablen keine Probleme gibt liest du diese Direkt aus und übergibst sie an eine Funktion.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Muss ich dann die GUI inkl aller Labels der GUI in eine Funktion packen?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Dein Problem ist halt, dassbei der Variaben Abfrage es zu überschneidungen kommen könnte.

Hättest du jetzt ein Label in dem alle Variable global sind kann es zu Kollisionen kommen.

Um das zu lösen schreibst du nur das Verarbeiten der Variablen welches normalerweise vollständig in einem GoSub stattfinden würde in eine Funktion.


Visit the new forum ahkscript.org.

http://ahkscript.org


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Hmmm,
 
Klassisch / Subroutinen:

Spoiler

 
Funktional / Funktion:
Spoiler

 
Ich glaube, Dein Projekt wird uns noch eine ganze Weile beschäftigen! wink.png


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Nun habe ich die GUI in eine Funktion gegeben. Nutze die Reminder-ID die jeder Vorgang bekommt als Titel. Die GUI hat zusätzlich -Caption erhalten.

Mit IfWinNotExist kann ich so prüfen ob das Fenster schon besteht, so öffnet es nicht zwei mal.

 

Das funktioniert... ABER der erste Aufruf der Funktion, verändert meine Hauptgui. Die sieht dann aus wie das PopUp.

 

Wieso passiert das?

 

Ich denke ich würde eher bei der klassischen Version bleiben... da komm ich besser mit zurecht.

Bei deinem Beispiel, kann sich aber nur ein PopUp nach dem anderen öffnen... Das wird klassich wahrscheinlich auch gar nicht anders machbar sein oder?

Also muss es tatsächlich eine Funktion sein.

 

Ich bin euch wirklich sehr Dankbar! Ohne Hilfe / passende Tipps würde ich das nie schaffen. Aber ich lerne auch dabei und darauf kommts ja auch an :)

 

//EDIT

 

Also ich bin nun doch bei der Funktion geblieben. Habe die GUI in die Funktion gepackt und versuche nun den Rest zu Coden.

Das Problem das die PopUp GUI die Hauptgui verändert hat lag am %a% ich hab es geändert in POP%a% und schon gehts...

Ist die erste GUI ohne 1: automatisch 1?

Das würde es erklären :)

 

Mal schauen ob ich den Rest nun hinbekomme.

 

//EDIT2

 

Also, es klappt soweit alles gut, nur wenn ich etwas in der DB Update durch das PopUp und am Ende des Speicherns dann die Listviews refreshen will dann passiert da gar nichts. Die Änderungen sind in der DB drin aber der Refresh erfolgt nicht. Wieso nicht? Ich hab noch Gui, Default hinzugefüht das reicht aber anscheinend nicht.



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Also, es klappt soweit alles gut, nur wenn ich etwas in der DB Update durch das PopUp und am Ende des Speicherns dann die Listviews refreshen will dann passiert da gar nichts. Die Änderungen sind in der DB drin aber der Refresh erfolgt nicht. Wieso nicht? Ich hab noch Gui, Default hinzugefüht das reicht aber anscheinend nicht.

 

Seit ich mein 33. Lebensjahr vollendet habe, und das ist schon ziemlich lange her, schwinden meine hellseherischen Fähigkeiten  von Jahr zu Jahr.


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Entschuldige bitte, war schon spät und der Frustfaktor stieg zu doll.

 

Es ist so, das PopUp geht auf. Ich sehe alle Daten zum passenden Vorgang, ich kann sie auch abändern. Klicke ich dann auf Snooze lasse ich die Daten aus dem GUI holen und per SQL Update in die DB schreiben. Das funktioniert auch alles.

Am Ende dieses Updates, möchte ich das die Listviews im HauptGui sich aktualisieren. Das passiert aber nicht.

 

Die Befehle laufen alle durch aber an den ListViews verändert sich nichts.

 

Die HauptGui kennst du ja aus dem anderen Thread. Den Code zum Refresh der ListViews kommt sogar von dir :)

 

Hier der Code nochmal:

;============================================================================
; Refresh Listview & Show results
;============================================================================
RefreshLV: ; Refresh für ListView1
; Holt die "Offenen" Vorgänge (StatusArray[1] = "Offen")
Gui, ListView, %h_LV1%
LVName := "ResultsLV" ; Name des Controls
SQL := "SELECT * FROM " . TableName . " WHERE Status = '" . StatusArray[1] . "';" ; SQL String um alle Reihen zu lesen die den Status "Offen" haben.
If !DB.GetTable(SQL, Result) ; Führt den SQL String aus.
   MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
Else
   ShowTable(Result, LVName) ; Übergibt das Result an die Funktion die dann das ListView mit Daten befüllt.
Return

RefreshLV2: ; Refresh für ListView2
; Hol die "Geschlossenen" Vorgänge (StatusArray[2] = "Geschlossen")
Gui, ListView, %h_LV2%
LVName := "ResultsLV2"
SQL := "SELECT * FROM " . TableName . " WHERE Status = '" . StatusArray[2] . "';"
If !DB.GetTable(SQL, Result)
   MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
Else
   ShowTable(Result, LVName)
Return

; Funktion um die ListViews mit Werten zu füllen.
ShowTable(Table, LVName)
    {
        Gui, Default
        Gui, ListView, %LVName%
        GuiControl, -ReDraw, %LVName%
        LV_Delete()
        If (Table.HasRows)
            {
                Loop, % Table.RowCount
                    {
                        Table.Next(Row)
                        LV_Add("", Row*)
                    }
            }
        Loop, % LV_GetCount("Column")
            LV_ModifyCol(A_Index, "AutoHdr")
        LV_ModifyCol(7, "0") , LV_ModifyCol(9, "0") , Lv_ModifyCol(10, "0"), Lv_ModifyCol(11, "0")
        LV_ModifyCol(6, "Sort")
        GuiControl, +ReDraw, %LVName%
    }

 

Das ist die PopUp GUI aktuell:

ReminderPopUp()
    {
        Global
        Gui, POP%a%:+LastFound +OwnDialogs
        Gui, POP%a%:Color, FFFFFF
        Gui, POP%a%:Add, Edit,x0 y0 w0 h0 vReminderIDPopUp
        Gui, POP%a%:Add, Text, x2 y0 w60 h20 , Dein ToDo:
        Gui, POP%a%:Add, DropDownList, x92 y0 w140 h20 r3 vPopVar1 HWNDh_2_2, %ToDoList%
        Gui, POP%a%:Add, Edit, x2 y20 w230 h60 vPopVar2 HWNDh_2_1,
        Gui, POP%a%:Add, Text, x2 y80 w120 h20 , Was hast du gemacht?:
        Gui, POP%a%:Add, Edit, x2 y100 w230 h60 vPopVar3 HWNDh_2_3,
        Gui, POP%a%:Add, Text, x2 y160 w80 h20 +Right , Kundennummer:
        Gui, POP%a%:Add, Edit, x92 y160 w120 h20 vPopVar4 HWNDh_2_4 Limit11 Number,
        Gui, POP%a%:Add, Text, x2 y180 w80 h20 +Right Limit10, Text ID:
        Gui, POP%a%:Add, Edit, x92 y180 w120 h20 vPopVar5 HWNDh_2_5,
        Gui, POP%a%:Add, Text, x2 y200 w80 h20 +Right , Rückrufnummer:
        Gui, POP%a%:Add, Edit, x92 y200 w120 h20 vPopVar6 HWNDh_2_6 Limit15 Number,
        Gui, POP%a%:Add, GroupBox, x242 y0 w130 h160 , Wiedervorlage:
        Gui, POP%a%:Add, Edit, x252 y20 w30 h20 vPopVar7 gSnoozeCheck HWNDh_2_7 Limit3 +Center Number,5
        Gui, POP%a%:Add, Button, x282 y20 w80 h20 gSnooze, Snooze
        Gui, POP%a%:Add, Text, x252 y40 w110 h20 +Center, max. 120 Min
        Gui, POP%a%:Add, Text, x252 y70 w110 h20 +Center, Datum/Uhrzeit:
        Gui, POP%a%:Add, DateTime, x252 y90 w110 h30 vNewTimeCheck, dd.MM.yyyy HH:mm
        Gui, POP%a%:Add, Button, x252 y120 w110 h30 gWVL, Wiedervorlage
        Gui, POP%a%:Add, Button, x212 y160 w160 h30 , Ohne CallNote abschließen
        Gui, POP%a%:Add, Button, x212 y190 w160 h30 , Mit CallNote abschließen
        Gui, POP%a%:Add, Button, x2 y220 w370 h30 gKillFlag, Vorgang offen halten`, aber keine Erinnerung mehr anzeigen.
        sleep 100
        If (PopUp_ToDoList="Outbound")
            GuiControl, POP%a%:Choose, PopVar1, 1
        If (PopUp_ToDoList="Systemänderung")
            GuiControl, POP%a%:Choose, PopVar1, 2
        If (PopUp_ToDoList="Kontrolle")
            GuiControl, POP%a%:Choose, PopVar1, 3
        GuiControl, POP%a%:, PopVar2, %PopUp_ToDoText%
        GuiControl, POP%a%:, PopVar3, %PopUp_ToDoErlText%
        GuiControl, POP%a%:, PopVar4, %PopUp_KDNr%
        GuiControl, POP%a%:, PopVar5, %PopUp_DID%
        GuiControl, POP%a%:, PopVar6, %PopUp_RRNr%
        GuiControl, POP%a%:, ReminderIDPopUp, %PopUp_ID%
        Gui, POP%a%:Show, h254 w376, Reminder ID: %PopUp_ID%
        a++
        WinSet, ReDraw
        Loop, 7
            CTLCOLORS.Attach(h_2_%A_Index%, "DCF1DD", "Black")
        Return
    }

 

Hier der Code der vom PopUp ausgelöst wird:

Snooze:
GUIID:=A_Gui
GuiControlGet, SnoozeTime, %GUIID%:, PopVar7
GuiControlGet, RMIDPopUp, %GUIID%:, ReminderIDPopUp
TimeToCheck:=A_Now
TimeToCheck += %SnoozeTime%, Minutes
FormatTime, VarDate, %TimeToCheck%, ddMMyyyy ; Zum vergleich wird hier das Datum des Crontrols gespeichert.
FormatTime, VarTime, %TimeToCheck%, HHmm ; Hier die Uhrzeit.
FormatTime, VarDay, %TimeToCheck%, WDay ; Hier der Wochentag.
FormatTime, RM_DateTime, %TimeToCheck%, dd.MM.yyyy HH:mm ; Hier das komplette Datum in ansehnlicher Form für das ListView.
GoSub DateTime
if (TimeCheck=4)
    {
        ToolTip12:="Die Line hat nur bis " Time " Uhr geöffnet.`nBitte wähle eine frühere WVL-Zeit aus."
        ShowToolTip(ToolTip12, 4000)
        Return
    }
FullTime:=TimeToCheck
GuiControlGet, RM_ToDo_DropDown, %GUIID%:, PopVar1
GuiControlGet, RM_ToDo_Text, %GUIID%:, PopVar2
GuiControlGet, RM_ToDo_Erl_Text, %GUIID%:, PopVar3
GuiControlGet, RM_KDNr, %GUIID%:, PopVar4
GuiControlGet, RM_DoxisID, %GUIID%:, PopVar5
GuiControlGet, RM_RRNr, %GUIID%:, PopVar6
DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung
SQL := "UPDATE Reminder SET KD_Nr='" . RM_KDNr . "', Doxis_ID='" . RM_DoxisID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', WVL_Zeitpunkt='" . RM_DateTime . "', Status='Offen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', FullTime='" . FullTime . "', ShowFlag='1' WHERE Reminder_ID='" . RMIDPopUp . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt.
If !DB.Exec(SQL) ; durchführen des SQL Befehls.
    MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung.
GoSub RefreshLV ; Refresh des oberen ListViews.
Gui, %GUIID%:Destroy
Return


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Gut, schaun wir mal, was vorgeht.

 

Durch den Klick auf <Snooze> wird ein GUI-Thread (die Subroutine "Snooze") gestartet. GUI-Threads wird als Default-GUI immer der Name des GUI übergeben, das das Ereignis ausgelöst hat. In diesem Fall ist das ein "POPn".

 

Aus "Snooze" heraus wird "RefreshLV" und von dort "ShowTable()" aufgerufen. Das Default-GUI bleibt unverändert.

 

Innerhalb von "ShowTable()" versuchst Du wohl ein anderes Default-GUI zu setzen: Gui, Default. Die Syntax für diese Anweisung lautet aber: Gui, GuiName:Default. Wenn Du Dein Haupt-GUI ohne Namen/Nummer erstellt hast, erhält es automatisch den/die Namen/Nummer "1". => Gui, 1:Default könnte helfen.


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Na da hätt ich nun auch wirklich selbst drauf kommen können... Ich hab das GUI, Default hinzugefügt um dasselbe zu erreichen, ich bin davon ausgegangen das 1: nicht nötig ist da ohne automatisch 1 genommen wird. Dies wird beim verwenden der GUI ja auch so gehandhabt. Als die PopUp GUI noch ohne "POPn" war sondern nur "n" wurde die Hauptgui auch einfach verändert.

 

Das man dann bei Gui, Default 1: dazu machen muss das ist mir so nicht eingefallen...

 

Die Sache mit dem PopUp steht fast komplett.

 

Dann muss ich noch das verschieben ins Archiv realisieren, dann Feinheiten, austesten. Dann Fehlt noch das Admintool. Aber das sollte schnell gehen, der Code ist ja beinahe gleich.

 

Würdest du dir den gesammtcode am Ende mal anschauen wollen? Wahscheinlich siehst du noch Fehler oder Verbesserungen die ich nicht sehe.

 

Ich möchte es wenn fertig hier Posten, vielleicht brauch ja wer sowas in der Art.



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Würdest du dir den gesammtcode am Ende mal anschauen wollen?

 

Ja!


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hi!

Kannst du mir sagen wie man es mit deiner CTLCOLORS Funktion schafft, dass die Controls Farbig sind auch wenn man die Controls noch vor dem Gui, Show Disabled?

 

Bei der Hauptgui sind die Controls Weiss, erst wenn ich sie Enable sind sie Farbig. Öffnet sich aber eins der PopUps, dann sind sie nicht mehr Weiss sondern farbig und bleiben es auch, die Controls in der PopUp Gui sind ja auch Farbig aber nicht disabled.

 

Loop, 6
      CTLCOLORS.Attach(h_%A_Index%, "DCF1DD", "Black")


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Mmmh, das Beispiel-Skript enthält als letztes Feld des GUI ein "disabledes" Edit-Control. Das sieht bei mir genau so aus, wie es soll.


Prefer ahkscript.org for the time being.