在WINDOWS 下,讀取 環境相關參數的錯誤處理 |
答題得分者是:Zard
|
ANDY8C
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
// -----------程式片段 ---------------------------------
// 讀取 環境相關參數
Function Read_Reg( _readFileName : string ) : string;
var
Reg: TRegistry;
CLASSPATH,TEMP,DATA_IN,DATA_REPORT : string;
begin // ----- Registry 取出 ----------------------------
Reg := Tregistry.Create; try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly('environment' ) then
begin
// 環境相關參數
para_CLASSPATH := Reg.ReadString('CLASSPATH' ) ;
para_TEMP := Reg.ReadString( 'TEMP' ) ;
para_DATA_IN := Reg.ReadString('DATA_IN') ; // 內定資料存放路徑
para_REPORT := Reg.ReadString('REPORT') ; // 報表存放路徑
end
else
ShowMsg('環境相關參數 尚未建立,請洽管理人員 !! '); finally
Reg.CloseKey;
Reg.Free;
end; end; // = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = =
問題 :
目前在 Register 中,有一機碼 environment(如圖一),
其下有 CLASSPATH,PATH,TEMP,TMP 等的變數,
若程式中,不知 DATA_IN 及 REPORT 等變數尚未建立,如上程式般的讀取,
將導致程式中斷,並顯示(如圖二)的錯誤訊息
1. 如何才能事先得知 DATA_IN 的變數尚未建立,馬上給予空字串或空白字串的初值,而不讓程式中斷.
2. 圖二的錯誤訊息,是否可以告知是那一個變數不存在?? ,由於對 PASCAL 的語法,不是很熟悉,感謝您的回答!!
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩. |
Zard
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
您確定是這段碼造成的問題嗎??
我試了一下沒有問題, 況且若DATA_IN 及 REPORT 等變數尚未建立, 讀出來的值頂多為空白, 為何會引發stream error的問題?
您貼上來的碼似乎不是完整的, Read_Reg的參數_readFileName 沒看到出現在Read_Reg()中. 我試的碼如下.
Function Read_Reg( _readFileName : string ) : string; var Reg: TRegistry; CLASSPATH,TEMP,DATA_IN,DATA_REPORT : string; begin // ----- Registry 取出 ---------------------------- Reg := Tregistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKeyReadOnly('environment' ) then begin // 環境相關參數 CLASSPATH := Reg.ReadString('CLASSPATH' ) ; TEMP := Reg.ReadString( 'TEMP' ) ; DATA_IN := Reg.ReadString('DATA_IN') ; // 內定資料存放路徑 DATA_REPORT := Reg.ReadString('REPORT') ; // 報表存放路徑 end else ShowMessage('環境相關參數 尚未建立,請洽管理人員 !! '); finally Reg.CloseKey; Reg.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Read_Reg('123'); end; |
tonytop
中階會員 ![]() ![]() ![]() 發表:6 回覆:114 積分:89 註冊:2003-12-04 發送簡訊給我 |
加判斷Reg.ValueExists
function Read_Reg(_readFileName: string): string; var Reg: TRegistry; CLASSPATH, TEMP, DATA_IN, DATA_REPORT: string; begin // ----- Registry 取出 ---------------------------- Reg := Tregistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKeyReadOnly('environment') then begin // 環境相關參數 para_CLASSPATH := Reg.ReadString('CLASSPATH'); para_TEMP := Reg.ReadString('TEMP'); //by tonytop add if Reg.ValueExists('DATA_IN') then begin//該值存在 para_DATA_IN := Reg.ReadString('DATA_IN'); // 內定資料存放路徑 end begin//該值不存在 Reg.WriteString('DATA_IN', '預設值'); end; //同上判斷處理 para_REPORT := Reg.ReadString('REPORT'); // 報表存放路徑 end else ShowMsg('環境相關參數 尚未建立,請洽管理人員 !! '); finally Reg.CloseKey; Reg.Free; end; end; |
tonytop
中階會員 ![]() ![]() ![]() 發表:6 回覆:114 積分:89 註冊:2003-12-04 發送簡訊給我 |
SORRY,上面貼的是判斷目錄是否存在,所以重貼啦!
function Read_Reg(_readFileName: string): string; var Reg: TRegistry; CLASSPATH, TEMP, DATA_IN, DATA_REPORT: string; begin // ----- Registry 取出 ---- Reg := Tregistry.Create; Reg.RootKey := HKEY_CURRENT_USER; try if Reg.OpenKey('Environment', True) then //☆要寫入預設值不可唯讀 begin // 環境相關參數 CLASSPATH := Reg.ReadString('CLASSPATH'); TEMP := Reg.ReadString('TEMP'); //☆by tonytop add DATA_IN := Reg.ReadString('DATA_IN'); // 內定資料存放路徑 if DATA_IN = '' then//該值不存在寫入預設值 begin DATA_IN := '預設值'; Reg.WriteString('DATA_IN', DATA_IN ); //這樣才對 end; //同上判斷處理 DATA_REPORT := Reg.ReadString('REPORT'); // 報表存放路徑 end else ShowMessage('環境相關參數 尚未建立,請洽管理人員 !! '); finally Reg.CloseKey; Reg.Free; end; end;忙盲茫 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |