Radiobuttons werden ohne mein zutun geklickt.

Wohl das A & O in der Windows-Programmierung

Moderatoren: crack, Krüsty, Marwin

Radiobuttons werden ohne mein zutun geklickt.

Beitragvon Biehler-Productions » Freitag 21. April 2006, 12:41

Hi,
ich probiere gerade mit der WinAPI herum.
Nun bin ich gerade bei den Steuerelementen angekommen.
Konkret habe ich in einer Dialogbox 2 Radiobuttons und einen normalen Button plaziert.
Bei einem Klick auf den Button will ich eben die Radiobuttons auswerten.
Nun ist es aber so, dass scheinbar dann, wenn der Dialog geladen wird, ca. 10Mal die Nachricht, dass der RAdiobutton1 angeklickt worden ist, gesendet wird.
Dadurch erhalte ich natürlich gefälschte Ergebnisse. Wieso wird also ca. 10Mal die Nachricht übermittelt, obwohl ich nie auf den Radiobutton geklickt habe?

MEin System WindowsXP SP1, MASM32 Packet

Ich sollte vielleicht noch sagen, dass ich viel Ahnung von Assembler hab, aber totaler WinAPI Noob.

Der entsprechende Code:
Code: Alles auswählen
AUSWERTUNG_PROC PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
   .IF uMsg==WM_CLOSE
      INVOKE EndDialog,hWnd,0
   .ELSEIF uMsg==WM_COMMAND
      MOV EAX,wParam
      MOV EBX,wParam
      SHR EBX,16
      .IF BX==BN_CLICKED
         .IF AX==IDC_RAD02
            MOV BYTE1,0
            MOV BYTE2,1
         .ELSEIF AX==IDC_RAD01
            INVOKE MessageBox,hWnd,0,0,MB_OK
            MOV BYTE1,1
            MOV BYTE2,0
         .ELSEIF AX==IDC_BUTT02
            .IF BYTE2==1
               INVOKE MessageBox,hWnd,ADDR CHOOSE2,ADDR AUSWERTEN,MB_OK or MB_APPLMODAL
            .ELSEIF BYTE1==1
               INVOKE MessageBox,hWnd,ADDR CHOOSE1,ADDR AUSWERTEN,MB_OK or MB_APPLMODAL
            .ELSE
               INVOKE MessageBox,hWnd,0,0,MB_OK
            .ENDIF
         .ENDIF
      .ENDIF
   .ELSE
      MOV EAX,FALSE
      RET
   .ENDIF
      MOV EAX,TRUE
      RET
AUSWERTUNG_PROC ENDP


Der ganze Code und das Programm: http://biehler-josef.de/data/progs/WINAPI3.zip
Biehler-Productions
Member
 
Beiträge: 18
Registriert: Freitag 21. April 2006, 12:39

Beitragvon crack » Samstag 22. April 2006, 22:53

Auf den ersten Blick hätte ich gesagt: das liegt daran das in deiner Hauptschleife die 'Dialog Prozedur Zehn mal aufgerufen wird und in dieser die Radiobuttons immer neu generiert werden.

...


Also das würde zumindest erklären warum exakt zehn mal eine Message produziert wird.

Ich denke es geschieht innerhalb der 'ABOUTDLGPROC' das die Radiobuttons immer neu generiert werden, und wenn es sich dabei um 'automatic radio buttons' handelt (Windows übernimmt die 'gegenseitige Verriegelung' und setzt den Default Button), ist ja bei der Bildung des Tastensatzes einer immer gesetzt und dieser liefert selbstverständlich auch eine 'Button Pushed' Event :wink:

Ich hab jetzt grade kein Beispiel zur Hand, aber normalerweise würde ich das von der Struktur her so machen:
Beim Initialisieren die Radio Buttons 'bauen', und dann in der 'Windowsprocedure' zyklisch mit der GetMessage Methode abfragen. Oder alternativ den 'ButtonEvent' abfangen. Du kannst auch 'Normale' ToggleButton benutzen (ich glaube die gehören zur Klasse 'Checkbox') und diese über eine Gegenseitige Verriegelung steuern. Das ist zwar etwas aufwendiger als die Verwendung von 'RadioButtons' aber wesentlich flexibler.
noch etwas zur Datenübergabe an ein 'Childwindow' es gibt die 'SendMessage' und die 'PostMessage' Methode, die sich unterscheiden: die 'SendMessage' Methode wartet das das Childwindow die Message annimmt und auch verarbeitet, während die 'PostMessage' Methode die Daten nur übergibt, und sofort 'wieder frei' ist.

[EDIT: Fehlerkorrektur, Ergänzung]

PS.: Zerreiss mich bitte nicht in der Luft, wenn ich den Fehler jetzt an der falschen Stelle suche, ich muss auch dabei sagen, das Gezippte PRG von dir kam bei mir gar nicht erst dazu Buttons zu generieren - dein selbstgeschriebener Fehlerabfang funktioniert :wink:
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Biehler-Productions » Samstag 22. April 2006, 23:37

Hi,
danke für die Antwort.
Die Bringt mich im Moment aber nicht weiter :(
Es wird ja nicht genau 10 Mal aufgerufen. Das war blos ein Schätzwert.
Ich habs jetzt mal gezählt. 20 dürften es sein. Also ein vielfaches von 10, das bringt mich vielleicht weiter.
Aber der Code, den du zitiert hats, der kann nicht schuld sein, da dieser Code nur eine Dialogbox aufruft, der einen Button enthält.
Das "Programm" arbeitet so:
Im Hauptfenster befindet sich ein Button und eine Progressbar.
Durch einen Klick auf den Button verschwindet dieser und die Progressbar fängt an zu laufen.
Wenn die Progressbar ausgelaufen ist, wird der Button wieder erzeugt (das entspricht dem "CreateWindowEx..." in deinem zitiertem Code) und ein weiteres Dialogfenster wird geöffnet.
Dort muss man auf Umfrage klicken, dann öffnet sich erst der Dialog mit den Radiobuttons.

//EDIT.
Mist, hab deinen Edit überlesen

//EDIT2:
Welcher Fehlerabfang?
Ist das Programm abgestürtzt :?: :lol: :mrgreen:

Morgen werd ich dann mal deinen editierten Vorschlag durchackern.
Im Moment hab ich keine Zeit mehr.

//EDIT3:
Achso, du meinst diese "Fehler" Messages?
Die sind keine Absicht, die hab ich nur eingebaut, um zu zählen, wieoft die BN_CLICKED Nachricht übergeben wird.

//EDIT4:
argh, heut schleichen sich deutlich zu viele Rechtschreibfehler rein :(
mfg
Biehler-Productions
http://biehler-josef.de
Biehler-Productions
Member
 
Beiträge: 18
Registriert: Freitag 21. April 2006, 12:39

Beitragvon crack » Sonntag 23. April 2006, 02:06

Nun, die 'Progressbar' hat auch funtioniert, danach kam dann der 'Starte Umfrage' Knopf, und wenn man den gedrückt hatte, die MessageBox: "Fehler" ...

Hier habe ich mal auf die schnelle ein Beispiel (das mit der Nr. 7) zusammengebastelt: Beispiel
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Biehler-Productions » Sonntag 23. April 2006, 10:11

thx, werd mir das (und die anderen) Beispiel(e) auf der Seite mal durchsehen.

Ich werd das dann wahrsheinlich so machen, wie du es in dem "Verriegelungs"beispiel gemacht hast.

Ein paar Fragen:
Ich erzeuge meine Steuerelemente im Moment größtenteils nicht selber, sondern linke eine Resourcen Datei mit ein, sodass die Elemente von selbe rerzeugt werden.
Was ist eigentloich besser?
Wenn man sie mit CreateWindow erzeugt, oder wenn man sie per Res. Datei einlinkt?

Und:
Ist es ratsamer, wenn man die Programme mit einer Dialogbox laufen lässt (wie hier (2.Teil des Tutorials): http://www.joachimrohde.com/cms/xoops/m ... .php?id=68 ), oder wenn man ein "richtiges" Fenster erzeugt (wie hier: http://www.joachimrohde.com/cms/xoops/m ... .php?id=61 )und darauf sein Programm aufbaut?
mfg
Biehler-Productions
http://biehler-josef.de
Biehler-Productions
Member
 
Beiträge: 18
Registriert: Freitag 21. April 2006, 12:39

Beitragvon crack » Sonntag 23. April 2006, 17:20

Also Erzeugen der Steuerelemente per Ressource Datei hat den Vorteil das das Hauptprogramm übersichtlicher bleibt. Auf der anderen Hand hat die Methode die Elemente der Benutzerschnittstelle per CreateWindow Funktion zu erzeugen, in meinen Augen den Vorteil das die Elemente Teil des Quellcodes Hauptprogramms sind. Man muss ja dabei sagen das die Resource Datei eigentlich nur anderes Compiliert wird. Generell würde ich nicht sagen eine Methode wäre besser oder schlechter als die andere, aber ich denke das insbesonders bei grösseren Projekten mit mehr graphischen Details die Resource Datei den Entwicklungsaufwand drastisch reduzieren kann (man denke nur daran wie einfach ein aufwendiges Drop Down Menu erzeugt werden kann.

Die zweite Frage: Programm Haupt Fenster oder Dialog Fenster: nun auch hier kann man die Antwort nicht verallgemeinern: beim Setup für ein Tool, oder bei einem Miniprogramm wird wohl das Dialogfenster ausreichen, bzw. die optimale Lösung sein. Wenn sich aber der Fensterinhalt häufig ändert, ist aus meiner Perspektive eher dazu anzuraten ein 'Main Window' zu generieren. Im Ursprung sin Dialoge ja zur Hauptsache dazu gedacht, Vorgänge wie die Auswahl von Optionen oder Dateien oder andere interaktiv zu steuern. Hier käme die 'Haptik' bzw. die 'Ergonomie' beim Programmdesign zum tragen: Wenn zum Beispiel ein Programm nicht weiter ausgeführt werden kann, an der Stelle wo eine Benutzereingabe erforderlich ist, ist es immer anzuraten ein Dialogfenster 'hochzuziehen' und dadurch den Benutzer auf die erwartete Eingabe aufmerksam zu machen. Bei anderen Anwendungen z.B.: Schriftartenwahl bei einem Texteditor kann diese Auswahl ruhig per Menu erfolgen, da für den weiteren Verlauf des Programms ja keine Entscheidung zwingend erforderlich ist, bzw. da der Benutzer sich ohnehin zu jeder Zeit bewusst entscheiden kann (und können muss) eine neue Option zu wählen.

Ich hoffe ich konnte ein paar sinnvolle Tips geben ...
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Windows-API

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron