- 論壇徽章:
- 0
|
現(xiàn)在可以測(cè)試剛才所做的工作。在/src輸入make重新編譯。如果沒(méi)有打字或其它錯(cuò)誤, make不會(huì)顯示任何錯(cuò)誤信息。運(yùn)行g(shù)temp檢查我們所做的工作。
現(xiàn)在我們開(kāi)始編寫(xiě)后端。這個(gè)很簡(jiǎn)單,不過(guò)在一個(gè)復(fù)雜的程序里,可能有幾個(gè)輔助的 文件,絕大多數(shù)后端不會(huì)放在callbacks.c,比如在gtemp里.
最后使Gtemp能夠轉(zhuǎn)換溫度單位
目前在callbacks.c里應(yīng)該有四個(gè)空的回調(diào)函數(shù)。其中兩個(gè)on_properties1_activate() 和on_preferences1_activate(),現(xiàn)在用不到。使用剩下的 on_fahr_entry_activate()和on_cel_entry_activate()。
我們將要編寫(xiě)一個(gè)函數(shù)叫做compute_temp(),它將被這兩個(gè) entry_activate回調(diào)函數(shù)調(diào)用。定義兩個(gè)標(biāo)志, C_TO_F和F_TO_C以便我們知道正在進(jìn)行哪種轉(zhuǎn)換。 Compute_temp()以調(diào)用的控件、用戶(hù)輸入的溫度和轉(zhuǎn)換類(lèi)型做為參數(shù)。
在文件頭部,在其它#define下面加入這幾行
#define C_TO_F 0
#define F_TO_C 1
void compute_temp(GtkWidget *this_widget, float temperature, int type);
這是這些函數(shù)和標(biāo)志的聲明。
在文件尾部,所有回調(diào)函數(shù)的下面,加入這個(gè)函數(shù):
void compute_temp(GtkWidget *this_widget, float temperature, int type)
{
GtkWidget *other_entry = NULL;
float result = 0.0;
gchar *result_string = NULL;
switch(type) {
case C_TO_F:
result = ((9.0 / 5.0) * temperature) + 32.0;
other_entry = lookup_widget(this_widget, "fahr_entry");
break;
case F_TO_C:
result = (5.0 / 9.0) * (temperature - 32.0);
other_entry = lookup_widget(this_widget, "cel_entry");
break;
}
result_string = g_strdup_printf("%5.2f", result);
gtk_entry_set_text(GTK_ENTRY(other_entry), result_string);
g_free(result_string);
}
單步執(zhí)行這個(gè)函數(shù),它聲明了正確的變量,進(jìn)入了一個(gè)分支語(yǔ)句,在這個(gè)語(yǔ)句中溫度單位的轉(zhuǎn)換取決于傳入了哪個(gè)文本框:other_entry = lookup_widget(this_widget, "cel_entry"); and other_entry = lookup_widget(this_widget, "fahr_entry"); 使用glade支持函數(shù)lookup_widget() 找到?jīng)]有用戶(hù)輸入的那個(gè)文件框。Gtk_entry只接收文本,因此我們把浮點(diǎn)數(shù)通過(guò) g_strdup_printf()轉(zhuǎn)換成文本。這個(gè)功能很象printf() 函數(shù),不管字符串有多長(zhǎng)都能確保分配了足夠的內(nèi)存。接下來(lái)用gtk_entry_set_text() 把結(jié)果寫(xiě)入gtk_entry控件。用g_free()釋放我們用 g_strdup_printf()創(chuàng)建的結(jié)果字符串。
所有的這些函數(shù)都可以在gnome.org上API部分查到。GtkEntry詳細(xì)信息請(qǐng)看 這頁(yè)。 你可以在這里 查到Glib字符串功能。
還需要在entry_activate里寫(xiě)入代碼來(lái)實(shí)際運(yùn)行compute_temp函數(shù)。找到回調(diào)函數(shù)名為 on_fahr_entry_activate() 加入以下代碼:
gchar *fahr = NULL;
fahr = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
compute_temp(GTK_WIDGET(entry), atof(fahr), F_TO_C);
這兒我們沒(méi)有做 任何錯(cuò)誤檢查,只是用atof()把字符串fahr轉(zhuǎn)換成浮點(diǎn)數(shù)。后面我們會(huì)加入錯(cuò)誤檢查。找到on_cel_entry_activate()函數(shù),加入以下代碼:
gchar *celsius = NULL;
celsius = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
compute_temp(GTK_WIDGET(entry), atof(celsius), C_TO_F);
同樣,我們后面會(huì)加入錯(cuò)誤檢查。注意在每一個(gè)代碼片斷我們使用GtkEditable代替GtkEntry。這是因?yàn)镚tkEntry某些方面不推薦使用(在 Gtk+-1.0,不過(guò)在2.0中以恢復(fù)了entry_get_text 函數(shù)),特別是gtk_entry_get_text()函數(shù)。由于GtkEntry是GtkEditable的一個(gè)子類(lèi),用GtkEditable函數(shù)是比較有效的。我們只要記住用GTK_EDITABLE()轉(zhuǎn)換宏把它 轉(zhuǎn)換成一個(gè)新類(lèi)。
現(xiàn)在,我們有一個(gè)可用的程序
重新編譯看看。在/src子目錄輸入make,修改任何可能的打字錯(cuò)誤,運(yùn)行程序。如果你在文本框只輸入數(shù)字,它會(huì)運(yùn)行得很好。試著在其中一個(gè)文本框里輸入'abc'。它給出了一個(gè)結(jié)果,因?yàn)閍tof()函數(shù)強(qiáng)行把"abc"轉(zhuǎn)換成一個(gè)浮點(diǎn)數(shù),不過(guò)我們知道結(jié)果是錯(cuò)的。如果這個(gè)程序只是自己用,而且你知道輸入什么才能得到正確結(jié)果(象大多數(shù)編程者那樣),那我們現(xiàn)在就停下來(lái)。不過(guò)讓我們更進(jìn)一小步,加入 簡(jiǎn)單的錯(cuò)誤檢查和提示。
加入錯(cuò)誤提示
我們要寫(xiě)另一個(gè)函數(shù)check_temperature_value(),它將檢查以確保輸入的數(shù)值是數(shù)值型而不是其它。這個(gè)函數(shù)同樣也被兩個(gè)entry_activate函數(shù)調(diào)用,向程序 狀態(tài)條輸出一條錯(cuò)誤信息。
在callbacks.c文件的底部加入函數(shù):
gint check_temperature_value(GtkWidget *this_widget, gchar *value)
{
GtkWidget *appbar;
gint num = 0;
gchar this_char = '';
this_char = *value;
if (!this_char)
return 0;
while (this_char != '') {
if (!isdigit(this_char)) {
/* set up the error message */
appbar = lookup_widget(GTK_WIDGET(this_widget), "appbar1");
gnome_appbar_push(GNOME_APPBAR(appbar), "Please enter numbers only");
return 0;
} else {
num++;
this_char = value[num];
}
}
return 1;
}
我們需要在entry_activate回調(diào)函數(shù)調(diào)用這個(gè)函數(shù)。加入以下這些行到 on_cel_entry_activate()中,在compute_temp() 函數(shù)調(diào)用之前:
if (!check_temperature_value(GTK_WIDGET(entry), celsius))
return;
clear_appbar(GTK_WIDGET(entry));
把同樣的行加入到 on_fahr_entry_activate()中,在 compute_temp()函數(shù)調(diào)用之前:
if (!check_temperature_value(GTK_WIDGET(entry), fahr))
return;
clear_appbar(GTK_WIDGET(entry));
最后我們需要clear_appbar()函數(shù)。它只是在輸入是個(gè)正確的數(shù)字時(shí)從狀態(tài)條上消除 錯(cuò)誤信息。把它加入callbacks.c文件的最后:
void clear_appbar(GtkWidget *this_widget)
{
GtkWidget *appbar;
appbar = lookup_widget(GTK_WIDGET(this_widget), "appbar1");
gnome_appbar_clear_stack(GNOME_APPBAR(appbar));
}
不要忘了在文件頭部附近加入兩個(gè)函數(shù)頭。編譯程序,現(xiàn)有你有一個(gè)能工作、錯(cuò)誤檢查并發(fā)出信息的Gtemp版本! |
|