Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

WinEnumDlgItem und EDI_NEXTGROUPITEM

6 views
Skip to first unread message

Marcel Müller

unread,
Oct 17, 2010, 7:56:43 AM10/17/10
to
Hallo!

Ich verwende WinEnumDlgItem mit EDI_NEXTGROUPITEM um mich durch
Radio-Buttons durchzuarbeiten. Laut Doku soll die Funktion am Ende der
Gruppe wieder von vorne beginnen. Das scheint aber Fehlanzeige.

Ich starte mit dem ersten Button und rufe die Funktion solange auf, bis
ich wieder beim selben Window-Handle lande => Endlosschleife.

Offenkundig bleibt er beim letzten Objekt der Gruppe h�ngen:
0x80000347 -> 0x80000348
0x80000348 -> 0x80000349
0x80000349 -> 0x80000349

0x80000347 ist der erste Button der Gruppe.
0x80000349 ist der letzte Button der Gruppe.

Kann man dabei irgendetwas falsch machen? Ist das ein Bug? Oder ist die
Doku falsch?

HWND ctrl1 = WinWindowFromID(GetHwnd(), id1); // 0x80000347
HWND ctrl = ctrl1;
do
{ // do some work
WinSendMsg(ctrl, BM_SETCHECK, MPFROMSHORT(...), 0);
// Next button
ctrl = WinEnumDlgItem(GetHwnd(), ctrl, EDI_NEXTGROUPITEM);
} while (ctrl != ctrl1);


Marcel

Ruediger Ihle

unread,
Oct 18, 2010, 6:20:09 AM10/18/10
to
On Sun, 17 Oct 2010 11:56:43 UTC, Marcel M�ller <news.5...@spamgourmet.org> wrote:

> Kann man dabei irgendetwas falsch machen? Ist das ein Bug? Oder ist die
> Doku falsch?

Hmm, ehrlichgesagt habe ich diese Funktion in all den Jahren
der OS/2 Programmierung noch nie verwendet. Irgendwie sieht
es schon nach einem Bug aus. W�re ja nicht der erste...

Gibt's ein Resource-Skript f�r Deinen Dialog ?


Ansonsten: Ist diese Iteration durch die Buttons tats�chlich
n�tig ? BS_AUTORADIOBUTTON nimmt einem ja f�r den Standardfall
einige Arbeit ab. Falls das doch nicht reicht, dann kann man
auch auf folgendes Konstrukt ausweichen:

HWND ctrl = WinWindowFromID(GetHwnd(), id1);

do
{
...

ctrl = WinQueryWindow(ctrl, QW_NEXT);
} while( ctrl && !(WinQueryWindowULong(ctrl, QWL_STYLE) & WS_GROUP) );


--
Ruediger "Rudi" Ihle [S&T Systemtechnik GmbH, Germany]
http://www.s-t.de

Marcel Müller

unread,
Oct 18, 2010, 2:14:53 PM10/18/10
to
Ruediger Ihle wrote:
> On Sun, 17 Oct 2010 11:56:43 UTC, Marcel M�ller <news.5...@spamgourmet.org> wrote:
>
>> Kann man dabei irgendetwas falsch machen? Ist das ein Bug? Oder ist die
>> Doku falsch?
>
> Hmm, ehrlichgesagt habe ich diese Funktion in all den Jahren
> der OS/2 Programmierung noch nie verwendet. Irgendwie sieht
> es schon nach einem Bug aus. W�re ja nicht der erste...
>
> Gibt's ein Resource-Skript f�r Deinen Dialog ?

Ja:

DLGTEMPLATE DLG_ITEMINFO
{
DIALOG "", DLG_ITEMINFO, 13, 27, 228, 136, NOT
FS_DLGBORDER|FS_NOBYTEALIGN
PRESPARAMS PP_FONTNAMESIZE "8.Helv"
{
/* ... */
RTEXT "S~huffle", ST_GENERIC, 4, 24, 44, 8,
DT_BOTTOM|DT_MNEMONIC|WS_GROUP
AUTORADIOBUTTON "inherit",RB_INFOPLSHINHERIT,52,24, 36, 8,
WS_TABSTOP|WS_GROUP
AUTORADIOBUTTON "force", RB_INFOPLSHFORCE, 92, 24, 36, 8
AUTORADIOBUTTON "clear", RB_INFOPLSHCLEAR,132, 24, 36, 8

PUSHBUTTON "A~pply", PB_APPLY, 52, 6, 44,12,
BS_NOPOINTERFOCUS|WS_DISABLED|WS_GROUP
PUSHBUTTON "~Undo", PB_UNDO, 108, 6, 44,12,
BS_NOPOINTERFOCUS|WS_DISABLED
PUSHBUTTON "~Help", PB_HELP, 164, 6, 44,12,
BS_NOPOINTERFOCUS|BS_HELP
}
}


> Ansonsten: Ist diese Iteration durch die Buttons tats�chlich
> n�tig ? BS_AUTORADIOBUTTON nimmt einem ja f�r den Standardfall
> einige Arbeit ab.

Solange man nicht mit dem Enabled-State der Buttons spielen will schon.


> Falls das doch nicht reicht, dann kann man
> auch auf folgendes Konstrukt ausweichen:
>
> HWND ctrl = WinWindowFromID(GetHwnd(), id1);
> do
> {
> ...
>
> ctrl = WinQueryWindow(ctrl, QW_NEXT);
> } while( ctrl && !(WinQueryWindowULong(ctrl, QWL_STYLE) & WS_GROUP) );

Ja, geht schon. Ich fand halt die L�sung recht charmant, dass man mit
jeder beliebigen Button-ID starten konnte.


Marcel

Lars Erdmann

unread,
Oct 18, 2010, 5:15:39 PM10/18/10
to
Marcel M�ller schrieb:

Ich glaube du brauchst eine Groupbox um die Radio Buttons zu einer Gruppe zu machen.
Die Radiobuttons brauchen kein WS_GROUP, die Groupbox wiederrum braucht kein
WS_TABSTOP (Koordinaten stimmen im folgenden Beispiel nicht):

DLGTEMPLATE DLG_ITEMINFO LOADONCALL MOVEABLE DISCARDABLE
BEGIN
DIALOG "", DLG_ITEMINFO, 12, 6, 259, 174, NOT FS_DLGBORDER | WS_VISIBLE
PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
BEGIN
GROUPBOX "S~huffle", ST_GENERIC, 8, 117, 37, 52, DT_MNEMONIC
AUTORADIOBUTTON "inherit", RB_INFOPLSHINHERIT, 15, 147, 27, 10,
BS_AUTOSIZE | WS_TABSTOP
AUTORADIOBUTTON "force", RB_INFOPLSHFORCE, 15, 135, 27, 10,
BS_AUTOSIZE
AUTORADIOBUTTON "clear", RB_INFOPLSHCLEAR, 15, 121, 27, 10,
BS_AUTOSIZE
END
END

IBM's dlgedit hat in Bezug auf WS_GROUP und WS_TABSTOP leider das v�llig falsche Default Verhalten.
Das hei�t, du mu�t die WS_GROUP und WS_TABSTOP settings alle korrigieren.
Dann w�rde ich WinEnumDlgItem noch mal probieren.


Lars

Marcel Müller

unread,
Oct 18, 2010, 7:27:08 PM10/18/10
to
Lars Erdmann wrote:
> Ich glaube du brauchst eine Groupbox um die Radio Buttons zu einer
> Gruppe zu machen.
> Die Radiobuttons brauchen kein WS_GROUP, die Groupbox wiederrum braucht
> kein
> WS_TABSTOP (Koordinaten stimmen im folgenden Beispiel nicht):

F�r eine Groupbox habe ich keinen Platz.
Au�erdem habe ich seit Jahren etliche Radiobuttons ohne Gruopbox. Die
laufen alle, so auch dieser. Manche davon liegen in einer Groupbox, aber
nicht alleine, sondern zusammen mit anderen Controls, darunter auch
andere Radiobutton-Gruppen.

> IBM's dlgedit hat in Bezug auf WS_GROUP und WS_TABSTOP leider das v�llig
> falsche Default Verhalten.

Das mit den Dialogeditoren habe ich mittlerweile weitgehend aufgegeben.
Die meisten produzieren nur Mist. Der einzige halbwegs brauchbare ist
noch der uralte von Borland. Aber der kennt die neueren Controls nicht.

> Das hei�t, du mu�t die WS_GROUP und WS_TABSTOP settings alle korrigieren.
> Dann w�rde ich WinEnumDlgItem noch mal probieren.

Es k�nnte h�chstens sein, dass der Kollege dar�ber stolpert, dass das
WS_GROUP auf dem Text-Control davor liegt, und nicht auf dem ersten
Radiobutton.

Wie auch immer. Ich verwende jetzt erstmal den Work-Around.


Marcel

0 new messages