請教一下熟悉 Xview 的前輩們一小段程式問題

請教一下熟悉 Xview 的前輩們,

小弟最近在改一個前人留下的程式,
主程式部份是 pascal 寫的, 這部份我可以了解.
但是 input 介面是 Xview, 這我就不行了.

小弟現在是猜測原始程式的意思再自己稍微更改一些小地方而已.
以下這兩段就是小弟利用到的原始程式, 也就是圖上紅色框框的部份.
我可以猜得出這是按照所按下的按鈕傳回 POption 的數值.
SEPARATE AREAS 的 POption=0;
SINGLE AREA 的 POption=1.

*pOption = POption;

xv_create(panel, PANEL_CHECK_BOX,
XV_X, 50,
XV_Y, 75,
PANEL_LABEL_BOLD, TRUE,
PANEL_CHOOSE_ONE, TRUE,
PANEL_LAYOUT, PANEL_HORIZONTAL,
PANEL_VALUE, *pOption,
PANEL_CHOICE_STRINGS, "SEPARATE AREAS", "SINGLE AREA", NULL,
PANEL_NOTIFY_PROC, toggle_option1,
PANEL_CLIENT_DATA, frame,
NULL);

int
toggle_option1(item, value, event)
Panel_item item;
unsigned value;
Event *event;
{
char buf[32];
Frame frame = xv_get(item, PANEL_CLIENT_DATA);
int i;
buf[0] = 0;
if (event_id(event) == MS_LEFT) {
for (POption = 0; value; POption++, value >>= 1)
if (value & 1)
sprintf(buf+strlen(buf), "%s%c ",
xv_get(item, PANEL_CHOICE_STRING, POption),
(value >> 1)? ',' : ' ');
xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
return XV_OK;
}
return XV_ERROR;
}

所以我 copy 了這兩段程式改成藍色框框的部份.
以下是小弟改的, 我的目的是要讓
ELITIST 的 RMOption 傳回 0;
ROULETTE WHEEL 的 RMOption 傳回 1;
TOURNAMENT 的 RMOption 傳回 2;
RANDOM 的 RMOption 傳回 3;

*rmOption = RMOption;

xv_create(panel, PANEL_CHECK_BOX,
XV_X, 75,
XV_Y, 400,
PANEL_LABEL_BOLD, TRUE,
PANEL_CHOOSE_ONE, TRUE,
PANEL_LAYOUT, PANEL_HORIZONTAL,
PANEL_VALUE, *rmOption,
PANEL_CHOICE_STRINGS, "ELITIST", "ROULETTE WHEEL", "TOURNAMENT", "RANDOM", NULL,
PANEL_NOTIFY_PROC, toggle_option6,
PANEL_CLIENT_DATA, frame,
NULL);

int
toggle_option6(item, value, event)
Panel_item item;
unsigned value;
Event *event;
{
char buf[32];
Frame frame = xv_get(item, PANEL_CLIENT_DATA);
int i;
buf[0] = 0;
if (event_id(event) == MS_LEFT) {
for (RMOption = 0; value; RMOption++, value >>= 1)
if (value & 1)
sprintf(buf+strlen(buf), "%s%c ",
xv_get(item, PANEL_CHOICE_STRING, RMOption),
(value >> 1)? ',' : ' ');
xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
return XV_OK;
}
return XV_ERROR;
}

可是很奇怪的是 ELITIST, ROULETTE WHEEL, TOURNAMENT, 都可以正確傳回 0,1,2; 可是 RANDOM 按下後卻還是傳回 2, 而不是 3.
不曉得可不可以請前輩指點一下迷津, 謝謝您的幫忙.


請教一下熟悉 Xview 的前輩們一小段程式問題

p.s. 版主大人, 這種文章可不可以算是大家閒聊之餘動動腦筋的益智文章啊? po 在閒聊八卦討論區應該沒有犯規吧.
2006-06-27 13:17 發佈

沒想到現在還有人在用XView

如果 PANEL_CHOOSE_ONE 為 true, 表示只能從眾choice取一個(exclusive)
所呼叫的 notify procedure 原型為
void notify_proc (Panel_item item, int value, Event *event);
其中 value 表示 所勾選的choice的index

如果 PANEL_CHOOSE_ONE 為 false, 表是這是多選題 (non-exclusive)
所呼叫的 notify procedure 原型為
void notify_proc (Panel_item item, unsigned int value, Event *event)
其中的value 表示所選取的 choices 的mask

在您的toggle_option中是把value當成mask(bit vector)處理,
與您的 PANEL_CHOOSE_ONE 設為 true 矛盾

希望這對您有幫助

ref OpenLook vol7b.pdf page 133
感謝前輩的幫忙,

小弟的這些選項一次只會選一個, 所以照您的說法,
PANEL_CHOOSE_ONE 為 true, 應該是對的,
但是小弟不太了解您說的這段話的意思

----
在您的toggle_option中是把value當成mask(bit vector)處理,
與您的 PANEL_CHOOSE_ONE 設為 true 矛盾
----

請教 null_wu 前輩是由哪看出小弟的toggle_option中是把value當成mask(bit vector)處理? 是不是因為這樣所以我只能二選一?
可是我實際上執行的結果可以三選一耶, 只有第四個選不到.

我的意思是說, 我新增的這段程式執行起來, 我如果選了
(1) ELITIST , *rmOption 的值會傳回 0 (這是我要的沒錯);
(2) ROULETTE WHEEL , *rmOption 的值會傳回 1 (這是我要的沒錯);
(3) TOURNAMENT , *rmOption 的值會傳回 2 (這是我要的沒錯);
(4) RANDOM , *rmOption 的值還是會傳回 2 (而我想要的是 3 );

我想前輩的意思應該是我要把 toggle_option 的 value改成不是mask(bit vector)處理,
不過小弟不知從何改起, 還請前輩再提點一下.

ps. 如果不要佔用版面資源, 小弟是不是私下 pm 請教您, 謝謝.
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?