| |
|
|
Jac de Lad | Etwas in der Hilfe macht mir Kopfzerbrechen:
Die Callback-Funktionen können 0 bis 5 Parameter (alle 32 Bit) haben und einen 32-Bit-Wert zurückliefern. Für jede Parameterzahl kann es derzeit maximal 5 Callbackfunktionen geben. Das dürfte auf alle Fälle ausreichend sein.Und wenn es doch nicht ausreicht, kann man einen benutzen Callback-Platz auch wieder freigeben, indem man vor die Parameterzahl ein - setzt:
ProcAddr(Fontliste,-4)
Was bedeutet das? Dass ich die Prozeduren wieder freigeben muss? Hat jemand ein sinnvolles Beispiel mit ner sinnvollen Anwendung?
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 01.10.2006 ▲ |
|
|
|
|
Michael Wodrich | Das heißt schlicht, das der Programmzeiger, den Du zugewiesen hattest danach nicht mehr aufgerufen wird. Du schaltest diesen Callback also aus und kannst damit dann eine andere Proedur aufrufen.
Wenn die Callback-Prozedur das ganze Programm hindurch laufen soll, dann ist das natürlich nicht sinnvoll. Es gibt aber in der API Callbacks die zB zum Zählen von Fonts aufgerufen werden (für jeden Font ein Mal). Wenn alles durchgenudelt ist, dann kann dieser Callback wieder recyclet werden.
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 02.10.2006 ▲ |
|
|
|
|
Jac de Lad | Ich habe das leider immer noch nicht verstanden..verändern sich die Zeiger beim Laufen des Programms? Haste vielleicht ein Beispiel mit ner sinnvollen Anwendung von ProcAddr(Prozedur,-4) (also, wo der Negativwert eine Rolle spielt)? |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 02.10.2006 ▲ |
|
|
|
|
| Ich versuche mich mal dran - hoffe, Roland verbessert mich, wenn ich da Mist rede: Profan erzeugt nach dem compilieren aus deinem Quelltext keinen Maschinencode, sondern übersetzt den verschlüsselten Quelltext einfach nur und führt dann das aus, was da steht. Dein Quelltext ist quasi wie ein Buch, in dem Profan liest und dann an bestimmten Hebeln zieht um etwas in Windows zu bewirken. Nativer Quelltext zieht dagegen direkt an den Hebeln.
Ein Callback soll direkt einen Hebel in gang setzen, da Proan aber erst nachschlagen und übersetzen muß, geht das eigentlich gar nicht. Was wird also wohl Profan bei der Funktion ProcAddr machen? Es übergiebt quasi die Adresse einer Funktion, die aus dem Buch einen Quelltextabschnitt ließt. Damit diese Funktion aber weiß, wo sie im Buch welche Quelltextseite aufschlagen muß, muß das irgendwo abgespeichert werden - was abgespeichert wird, braucht aber Platz. Ausreichend Platz zum Abspeichern ist für 5Callbackfunktionen (pro Parameterzahl) da, da liegt das Problem. |
|
|
| |
|
|
|
| Und hier mal der verlangte Quelltext: KompilierenMarkierenSeparierenDEF @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID"
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
Def @SetTimer(4) !"USER32","SetTimer"
Def @KillTimer(2) !"USER32","KillTimer"
Declare Timer_WIN&,Button&,Zähler%,TIMER_ID&,PRO_ID&
Windowstyle 31+512
Windowtitle "Selbständig laufende Programmschleife"
Window 0,0-640,440
Usermessages $10
LET TIMER_WIN&=@Control("Static","TIMER_WIN",$8000000,0,0,0,0,%Desktop,9998,%HINSTANCE,$4)
Let Button&=@createbutton(%HWND,"",20,100,300,30)
LET TIMER_ID&=@SetTimer(TIMER_WIN&,9999,1500,@ProcAddr("TimerProc1",4))
While %UMESSAGE<>$10
Waitinput
IF @ButtonClicked(Button&)
IF PRO_ID&=1
@ProcAddr("TimerProc1",-4)
@ProcAddr("TimerProc2",4)
ELseif PRO_ID&=2
@ProcAddr("TimerProc2",-4)
@ProcAddr("TimerProc1",4)
Endif
endif
wend
@KiLLTIMER(TIMER_WIN&,TIMER_ID&)
end
Proc TimerProc1
Parameters ahhwnd&,ahuMsg&,ahidEvent&,ahdwTime&
LET PRO_ID&=1
Settext Button&,"Von Proc 1 gesetzt!"
Endproc
Proc TimerProc2
Parameters ahhwnd&,ahuMsg&,ahidEvent&,ahdwTime&
LET PRO_ID&=2
Settext Button&,"Von Proc 2 gesetzt!"
Endproc
|
|
|
| |
|
|