Thorsten F., 04.10.2004 01:30: Hallo,
wie fragt man am sichersten ab ob ein Button [create("button...)] angeklickt wurde?
Gruss
Thorsten
Rolf Koch, 04.10.2004 08:04: Hi Thorsten,
im normalfall natürlich per
[code:1:0ca0b0bdd1]
If getfocus(Button1&)
'Aktion
Elseif getfocus(Button2&)
'Aktion
Endif
[/code:1:0ca0b0bdd1]
Rolf
Beitrag, 04.10.2004 08:59: Hallo Rolf...
Ich denke mal, genau das wollte er nicht haben. @GETFOCUS liefert nur zurück, ob ein Button einen Focus hat, nicht ob er gedrückt wurde.
Ich nehme dazu:
[code:1:c29ce37a4d]
If @gt(@sendmessage(Button_1%,$00F2,0,0),40)
'...
ElseIf @gt(@sendmessage(Button_2%,$00F2,0,0),40)
'...
ENDIF
[/code:1:c29ce37a4d]
Noch besser wäre es, den Button über @CONTROL selbst zu erzeugen und mit einer ID zu versehen. Diese ID kann man dann über %MENUITEM abfragen und mit SETMENUITEM 0 wieder zurücksetzen (Beispielcode hier im Forum unter Quellcodes).
Andreas M., 04.10.2004 11:31: [quote:3cde066f52="AH"]
Noch besser wäre es, den Button über @CONTROL selbst zu erzeugen und mit einer ID zu versehen. Diese ID kann man dann über %MENUITEM abfragen und mit SETMENUITEM 0
wieder zurücksetzen (Beispielcode hier im Forum unter Quellcodes).[/quote:3cde066f52]
Das geht auch mit Create("Button"...), eine ID bekommt der Button auch. Angefangen bei 1000 werden die einzelnen Controls die mit Create(..) erstellt werden mit einer aufsteigenden ID versehen.
Beispiel :
[code:1:3cde066f52]$H windows.ph
Declare Ende&,Button&
cls
Button& = Create("BUTTON",%hwnd,"OK",10,10,80,24)
Whilenot ende&
Waitinput
If ~GetDlgItem(%hwnd,%MenuItem*-1) = Button&
Print "Hoppla"
Endif
wend[/code:1:3cde066f52]
Beitrag, 04.10.2004 13:29: Hallo Andreas...
Vollkommen richtig! Bloss kommt dann etwas Rechnerei dazu - besonders wenn man sehr viele Buttons in seinem Programm erstellt hat und zusätzlich noch mit @CREATETEXT arbeitet wird das ganze sehr unübersichtlich. Mit @CONTROL lässt sich jedem Control eine spezielle ID zuweisen, mit @CREATEBUTTON wird dies automatisch von Profan getan (aufsteigende ID's ab 2000 werden vergeben, wenn ich mich recht erinnere).
Hier noch mal was zur Demonstration aus meiner 'Kramkiste':
[code:1:14a81ed694]
WINDOWSTYLE 31
WINDOWTITLE "Hauptprogramm"
WINDOW 0,0-640,440
Declare DIALOG&,Button&,message&,Window&,Dialogtext$,ENDE&,Zeit$,Zähler&
Declare Listbox&
PROC Messagefenster
PARAMETERS Überschrift$,Text$ 'Überschrift$ identifiziert das geschlossene Fenster, Text$ ist ein Meldungstext
WINDOWSTYLE 16 'Fenster ohne Menü
'Am Aussehen lässt sich bestimmt noch eine Menge verbessern..
Let Dialogtext$="Hinweis von Hauptprogramm " 'Wichtig, um zu erkennen, ob ein Dialogfensterbutton gedrückt wurde
LET DIALOG&=@Create("Window",%Desktop,@add$(Dialogtext$,Überschrift$),0,0,300,110) 'Erstellung des Dialoges auf dem Desktop
@Create("Button",Dialog&,"OK",100,50,80,25) 'Button zum Wegklicken
@create("Text",,Dialog&,TEXT$,0,0,300,40) 'Meldungstext
SetWindowPos Dialog&=@rnd(@sub(%MAXX,300)),@rnd(@sub(%MAXY,110))-300,110;-1 'Dialgfenster immer im Vordergrund
endproc
'Jetzt kommt das Hauptprogramm
LET LISTBOX&=@Create("Listbox",%HWND,"",10,160,600,100) 'Für die Rückmeldung
LET ENDE&=@Create("Button",%HWND,"Ende",230,350,100,25) 'Button schadet nichts
WHILENOT @GETFOCUS(ENDE&) 'Solange nicht Ende gedrückt wurde
If @gt(@Height(%HWND),20) 'Nur, wenn das Hauptfenster ncht minimiert ist...
Drawtext 0,100,@add$(@str$(&GETTICKCOUNT)," ") 'Nur, damit man sieht, dass das Programm weiterläuft.
Drawtext 0,0,@add$(@str$(%MENUITEM)," ") 'Nur für mich, ist unwichtig!
endif
IF @neq$(Zeit$,Time$(0)) 'Jede Minute wird ein Popup erzeugt!
LET ZÄHLER&=ZÄHLER&+1 'Das ist für den Dialog-Fenstertitel
LET ZEIT$=TIME$(0) 'Damit das Programm merkt, das eine Minute vergangen ist.
Messagefenster @str$(Zähler&), @add$("Aktuelle Zeit: ",Zeit$) 'Prozedur zum Erzeugen des Dialoges wird aufgerufen.
endif
IF @lt(%MENUITEM,-999) 'Wenn irgendwo ein Button gedrückt wurde..
LET WINDOW&=@getactivewindow() 'Holt sich das Handle des Fensters mit dem gedrückten Button.
IF @gt(@len(@GetText$(WINDOW&)),@sub(@len(Dialogtext$),1)) 'Damits bei der nächsten Abfrage keinen Fehler gibt!
IF @equ$(@mid$(@GetText$(WINDOW&),1,@len(Dialogtext$)),Dialogtext$) 'Wenn das dann ein Dialogfenster deines Programmes ist..
@addstring(Listbox&,@GetText$(WINDOW&)+" um "+@time$(0)+" Uhr weggeklickt!") 'Schreibt in die Listbox das weggeklickte Fenster.
@destroywindow(Window&) 'Löscht das Dialogfenster
setmenuitem 0 'Zurücksetzen des Buttonklicks
endif
endif
endif
wend
[/code:1:14a81ed694]
Beitrag, 04.10.2004 14:01: UPS...
Habe Andreas's API ganz übersehen! Über das Handle geht's natürlich auch ohne Rechnerei!
Uwe P.N., 04.10.2004 15:01: Hallo Leute!
Auf die Gefahr hin, mich zu blamieren...
Bei mir funktioniert im Normalfall (Eingabeschleife mit WaitInput, aber ohne Timer o.ä.) dies:
def GetFocusEx(1) getfocus(&(1))*(%key=255)
Damit kann man auch per <Tab> den Focus weitergeben und mit <Enter> quittieren.
SeeYou
Pascal
Rolf Koch, 04.10.2004 19:24: Hi AH,
nagut hast mich überredet
Rolf
Thorsten F., 04.10.2004 19:46: [quote:5c933acd40="AH"]Hallo Rolf...
Ich denke mal, genau das wollte er nicht haben. @GETFOCUS liefert nur zurück, ob ein Button einen Focus hat, nicht ob er gedrückt wurde.
Ich nehme dazu:
[code:1:5c933acd40]
If @gt(@sendmessage(Button_1%,$00F2,0,0),40)
'...
ElseIf @gt(@sendmessage(Button_2%,$00F2,0,0),40)
'...
ENDIF
[/code:1:5c933acd40]
$H windows.ph
Declare Ende&,Button&
cls
Button& = Create("BUTTON",%hwnd,"OK",10,10,80,24)
Whilenot ende&
Waitinput
If ~GetDlgItem(%hwnd,%MenuItem*-1) = Button&
Print "Hoppla"
Endif
wend
[/quote:5c933acd40]
Hi, genau dass. Es sollte nicht mit Getfocus arbeiten und auch wenn möglich ohne Waitinput.
Also danke für diese beiden Vorschläge. Ich hab schon lange nichts mehr mit Profan gemacht, wusste aber noch, das getfocus nicht richtig klappt.
Danke für die Hilfe.
ThorstenNachtrag von iF: ich hab das Doppelposting mal beseitigt...
Dies ist die Offlinevariante vom Thread [Buttonclick abfragen].
©2006 XProfan.Com