Lösung zu Offset und Caller String .. juhu :-)

25/08/2008 - 10:14 von Jens Kallup | Report spam
Hallo NewsgroupMitglieder,

hier will ich nun ersteinmal die Lösung für mein (vielleicht)
umstàndlich erklàrtes Problem geben - vielleicht nützt es ja
jemanden ... ?
Als erstes: zur Lösung verwende ich den GNU MingW C++ Compiler,
den nasm Assembler sowie die CrossPlatformÜbergreifende Bibliothek
Qt von TrollTech (4.3.4).
So nun zum Code:

Ersteinmal einen Ausschnitt aus der Compiler/Skriptsprache:

-%<
this.PushButton1 = new PushButton(this)
with (this.PushButton1)
onClick = class::PushButton1_OnClick
text = "Close"
top = 20
left = 20
height = 25
endwith
->%--

nun zum assembler code:

;
; das erste push könnte man auch weg lassen,
; da diese Zeile, lediglich ein string pointer ist,
; für PushButtons ist .. mal sehen ob diese Zeile
; gànzlich wegfallen kann ...?
; das 2te push zeigt die virtuelle Speicheraddresse von
; Funktion "pushbutton1_onclick. Die Funktion muss wàrend
; der Linktime vorhanden sein ...
; das 3te push enthàlt die nummer (ID) eines Buttons
; das 4te push das window/widget handle bzw. ID ...
;
push dword LClassPropertyValue_masterforma_pushbutton1_onclick
push dword _pushbutton1_onclick
push dword [LsymType_masterforma_pushbutton1]
push dword [LClassID_masterforma]
call _set_pushbutton_onclick
add esp, 16

der oben stehende asmcode wird abgesetzt bzw. erzeugt, wenn im
Skript "onclick = class::" gefunden wurde.

Nun zum Event handler code:

section .data
extern _printf

LClassPropertyValue_masterforma_pushbutton1_onclick: db "pushbutton1_onclick",0
tststr: db "Hallo from Pushbutton eins",10,0
section .text
global _pushbutton1_onclick
_pushbutton1_onclick:
push tststr
call _printf
add esp, 4
ret

;-

jetzt fàngt der eigentliche Spass an:

// man beachte: " void (*o)(void) "
// (3te parameter)
//
extern "C" void set_pushbutton_onclick(float w, float b, void (*o)(void), char *f)
{
kawin[int(w)]->btn[int(b)]->funcname.append(f);
kawin[int(w)]->btn[int(b)]->click_offset = o; // hier die Lösung :-)
}

//
// Nun die Header Datei von qt_mainwindow.h ...
//
typedef void (*CallbackRef)(void); // hier machts Spass :-)
class TPushButton : public QPushButton {
Q_OBJECT
public:
TPushButton(const QString &text, QWidget *parent = 0);
...

CallbackRef click_offset;

...

signals:
void buttonClicked(void);
...
};


Dann in qt_mainwindow.cc wie gehabt die methode "buttonClicked(void);" ..

void TPushButton::buttonClicked(void)
{
if (funcname.length() > 0)
{
map<string,void(*)()> callbacks;
callbacks[funcname] = click_offset;
callbacks[funcname](); // juhu Event funzt :-)
}
}

Danke und Gruß
Jens
 

Lesen sie die antworten

#1 Jens Kallup
25/08/2008 - 10:18 | Warnen spam
Nicht zu vergessen:
das Anbinden des EventButton Signals:

TPushButton::TPushButton(const QString &text, QWidget *parent)
: QPushButton(text,parent)
{
QObject::connect(
this,
SIGNAL(clicked()),
this,
SLOT(buttonClicked()));
}

Gruß
Jens

Ähnliche fragen