全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2213
推到 Plurk!
推到 Facebook!

呼叫讀卡機檔案的問題

尚未結案
Target.ccie
一般會員


發表:6
回覆:2
積分:1
註冊:2006-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-15 18:41:26 IP:218.165.xxx.xxx 未訂閱

目前我在寫一個會員卡系統
別人給我了一段程式碼,但是可能是他之前寫的,所以可能有些地方有誤
但是我又是新手,所以能改的地方有限
想請大大幫我解釋一下程式碼

Issue.exe這個是格式化卡片的程式
他會將Member.tc的檔案內容寫入卡片
而他上面2個檔案必需放在同一個file中才能成功
下面是程式碼,我盡量將我懂的部份加上註解了

procedure TForm1.Button1Click(Sender: TObject); //格卡程式
var
keycode,str,fname,ln,space:String;
F:TextFile;
i:Integer;
begin
Screen.Cursor:=crHourGlass; //有大大能說明一下這一行嗎?
try
try
Application.ProcessMessages;
keycode:=FormatDateTime('yyMMDD',Now); //依時間來取得金鑰
str:=e_id.Text ';' e_name.Text ';' '0' ';' '0' ';'; //明文為會員編號加名字
SeqEnc(Str,StrToInt(keycode),6); //str 明文 StrToInt(keycode) 將金鑰轉換成int 加密6次
str:=EncodeString(str);
/*上面是加密與輸入資料的部份*/
fname:=GetSysDir '\Member.TC'; //試過將這行改為fname:='\Member.TC'; 但是出現錯誤
space:=' '; //因為卡片的結尾一定要為空白,不然會出現錯誤
AssignFile(F,fname);
Rewrite(F);
Writeln(F,keycode);
for i :=2 to 20 do begin
if str<>'' then begin
ln:=Copy(str,1,10);
Delete(str,1,Length(ln));
ln:=Copy(ln space,1,10);
end else
ln:=space;
Writeln(F,ln);
end;
finally
CloseFile(F);
end;
try
execfile('Issue.exe'); //呼叫Issue.exe'將member.tc的資料寫入卡片

finally
//DeleteFile(fname); 原使程式有這行,但是作用為何不清楚
end;
Application.MessageBox(PChar('格卡完畢!!'),PChar('格卡完畢'),MB_ICONINFORMATION MB_TASKMODAL MB_OK);
finally
Screen.Cursor:=crDefault;
end;
end;

function TForm1.GetSysDir: AnsiString;
begin
SetLength(Result,MAX_PATH 1);
SetLength(Result,GetSystemDirectory(PChar(Result), MAX_PATH));
end;

procedure TForm1.execfile(exename: AnsiString);
var Info:TShellExecuteInfo;
begin
FillChar(Info, SizeOf(Info), 0);
Info.cbSize := SizeOf(Info);
Info.fMask := SEE_MASK_NOCLOSEPROCESS;
Info.Wnd := 0;
Info.lpVerb := 'open';
Info.lpFile := pchar(exename);
Info.lpDirectory := nil;
Info.nShow := SW_HIDE;
if (ShellExecuteEx(@Info)) then begin
WaitForSingleObject(Info.hProcess,INFINITE);
CloseHandle(Info.hProcess);
end;
end;

想請問一下,他這樣寫的路徑是將member.tc的檔案指在system32底下
但是我'Issue.exe'卻好像不是,可否能請大大解答一下
感謝

te_hsun
一般會員


發表:43
回覆:34
積分:20
註冊:2002-03-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-16 12:34:14 IP:218.168.xxx.xxx 未訂閱

照這樣看來,應該是路徑不太對...

程式直接呼叫 Issue.exe 而沒有加上完整資料夾,那你程式應該是和 Issue.exe 放在同一個資料夾下

而你指定 fname:= GetSysDir '\Member.TC'; 會變成 c:\Windows\system32\Member.TC
那可能會不符合 Issue.exe 的限制
所以直接指定 fname:= 'Member.TC'; 就可以了

非你已經非常確定 Issue.exe 是放在哪個資料夾下,例如: c:\Issue\Issue.exe
那你就可以直接指定 fname:= c:\Issue\Member.TC
而 procedure TForm1.execfile(exename: AnsiString); 程序中的
Info.lpDirectory := nil; 可能要指定成 Info.lpDirectory:= 'c:\Issue';


DeleteFile(fname);
是不管你執行 execfile('Issue.exe'); 以後有沒有成功,最後都把 Member.TC 這個檔案刪掉
應該是避免不小心再次格式化 Member.TC 檔案裡面所指定的會員卡片吧...


Screen.Cursor:=crHourGlass; // 將游標改為忙碌的樣子
try
...
finally
Screen.Cursor:=crDefault; // 不管如何...最後...恢復游標為預設的樣子
end;

Target.ccie
一般會員


發表:6
回覆:2
積分:1
註冊:2006-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-16 13:35:56 IP:218.165.xxx.xxx 未訂閱

照這樣看來,應該是路徑不太對... 我知道是路徑不太對,試了一陣子,因為我是新手

程式直接呼叫 Issue.exe 而沒有加上完整資料夾,那你程式應該是和 Issue.exe 放在同一個資料夾下 沒錯,程式與issue.exe放於同個位置

而你指定 fname:= GetSysDir '\Member.TC'; 會變成 c:\Windows\system32\Member.TC
那可能會不符合 Issue.exe 的限制
所以直接指定 fname:= 'Member.TC'; 就可以了

非你已經非常確定 Issue.exe 是放在哪個資料夾下,例如: c:\Issue\Issue.exe
那你就可以直接指定 fname:= c:\Issue\Member.TC
而 procedure TForm1.execfile(exename: AnsiString); 程序中的
Info.lpDirectory := nil; 可能要指定成 Info.lpDirectory:= 'c:\Issue';


DeleteFile(fname);
是不管你執行 execfile('Issue.exe'); 以後有沒有成功,最後都把 Member.TC 這個檔案刪掉
應該是避免不小心再次格式化 Member.TC 檔案裡面所指定的會員卡片吧...


Screen.Cursor:=crHourGlass; // 將游標改為忙碌的樣子
try
...
finally
Screen.Cursor:=crDefault; // 不管如何...最後...恢復游標為預設的樣子
end;

非常感謝你解決我的問題,再次感謝

系統時間:2017-10-22 16:20:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!