線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2736
推到 Plurk!
推到 Facebook!

變數形態是陣列的問題?

答題得分者是:jow
ry_lee
高階會員


發表:367
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-05 15:11:21 IP:218.164.xxx.xxx 未訂閱
var buf:array[0..255] of byte;
sysdir:string;
i,len:integer;
begin
len:=GetSystemDirectory(@buf, sizeof(buf));
for i:=0 to len-1 do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir');
end;
以上程式碼執行ok
----------------------------------------------------
var buf:array of byte;
sysdir:string;
i,max_path,len:Cardinal;
begin
max_path:=300;
len:=GetSystemDirectory(@buf, max_path);
for i := Low(Buf) to High(Buf) do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir);
end;
以上程式碼執行錯誤,
即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤
ps:我的delphi是7.0版.
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-05 17:12:27 IP:59.126.xxx.xxx 訂閱
hi,我看一下,應該是變動陣列的關係,在 GetSystemDirectory 他本身要傳入的是 PAnsichar

但,當你是使用 array[0..255] of byte 時 其實可以看成是 array[0..255] of char
所以你傳入 Windows 的函式,他是可以處理的,你可以使用 sizeof(buf) 看一下,這時候是 256

但你用 array of byte 時,不等於 pChar !! 而且你這種寫法是 c 的寫法,在 delphi 用 delphi 的方式就好了
可以建議你用下面這樣簡單的方式就可以了

var tmpChar: PChar;
begin
tmpChar := StrAlloc(Max_Path); // Max_Path 是 Windows 這個 Unit 裡就有宣告了,不用自己再宣告!!
GetSystemDirectory(tmpChar, Max_Path);
showmessage('sys dir =' tmpChar);
StrDispose(tmpChar);
end;


===================引 用 ry_lee 文 章===================
var buf:array[0..255] of byte;
sysdir:string;
i,len:integer;
begin
len:=GetSystemDirectory(@buf, sizeof(buf));
for i:=0 to len-1 do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir');
end;
以上程式碼執行ok
----------------------------------------------------
var buf:array of byte;
sysdir:string;
i,max_path,len:Cardinal;
begin
max_path:=300;
len:=GetSystemDirectory(@buf, max_path);
for i := Low(Buf) to High(Buf) do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir);
end;
以上程式碼執行錯誤,
即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤
ps:我的delphi是7.0版.
------
價值的展現,來自於你用哪一個角度來看待它!!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-06 09:16:42 IP:118.231.xxx.xxx 訂閱
其實這跟是否為 PChar 沒多大關係,不過就是傳入一個 Memory Buffer ,管他是不是 PChar 還是 Byte Array

主要會錯,是因為[你忘記做記憶體空間宣告拉]

Setlength for delphi array

StrAlloc, memalloc, new ... etc. for PChar or a memory block


===================引 用 ry_lee 文 章===================
var buf:array[0..255] of byte;
sysdir:string;
i,len:integer;
begin
len:=GetSystemDirectory(@buf, sizeof(buf));
for i:=0 to len-1 do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir');
end;
以上程式碼執行ok
----------------------------------------------------
var buf:array of byte;
sysdir:string;
i,max_path,len:Cardinal;
begin
max_path:=300;
len:=GetSystemDirectory(@buf, max_path);
for i := Low(Buf) to High(Buf) do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir);
end;
以上程式碼執行錯誤,
即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤
ps:我的delphi是7.0版.
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-06 10:36:13 IP:218.210.xxx.xxx 訂閱
Syntax 大,不好意思,關於這個小弟也很好奇~~,如何用動態的 Arrary 能放入 GetSystemDirectory 呢? 
因為我 SetLength 也是錯,我好像沒辦法使用【動態陣列傳入】,但設靜態的可以,請問該如何寫呢? 謝謝!

===================引 用 syntax 文 章===================
其實這跟是否為 PChar 沒多大關係,不過就是傳入一個 Memory Buffer ,管他是不是 PChar 還是 Byte Array

主要會錯,是因為[你忘記做記憶體空間宣告拉]

Setlength for delphi array

StrAlloc, memalloc, new ... etc. for PChar or a memory block


===================引 用 ry_lee 文 章===================
var buf:array[0..255] of byte;
sysdir:string;
i,len:integer;
begin
len:=GetSystemDirectory(@buf, sizeof(buf));
for i:=0 to len-1 do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir');
end;
以上程式碼執行ok
----------------------------------------------------
var buf:array of byte;
sysdir:string;
i,max_path,len:Cardinal;
begin
max_path:=300;
len:=GetSystemDirectory(@buf, max_path);
for i := Low(Buf) to High(Buf) do
sysdir:=sysdir chr(buf[i]);
showmessage('sys dir =' sysdir);
end;
以上程式碼執行錯誤,
即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤
ps:我的delphi是7.0版.
------
價值的展現,來自於你用哪一個角度來看待它!!
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-06 11:15:24 IP:122.118.xxx.xxx 訂閱
參考這篇改的
Win32 API 使用討論區(Delphi) » GetSystemDirectoryA 使用問題
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=42443

procedure TForm1.Button1Click(Sender: TObject);
var buf:array of char;
sysdir:string;
i,max_path,len:Cardinal;
begin
SetLength(buf,MAX_PATH 1);
len:=GetSystemDirectory(pchar(buf), max_path 1);
SetLength(buf,Len);
for i := Low(Buf) to High(Buf) do
sysdir:=sysdir buf[i];
showmessage('sys dir =' sysdir);
end;
------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-06 11:40:00 IP:218.210.xxx.xxx 訂閱
謝謝 pceyes 大的回覆, array of char 這個小弟知道,他其實可以看成是 pChar 的一種,
但小弟是想問原發問者問題中的 array of byte 該如何用 (其實是有點鑽牛角尖,只是好奇想了解這個 array of byte 而已)

------
價值的展現,來自於你用哪一個角度來看待它!!
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-06 14:44:58 IP:61.59.xxx.xxx 未訂閱
小弟不才..

但..不知..這樣,是否簡單些?

Var
k : PChar;
begin
Try
k := AllocMem(Max_Path-1);
GetSystemDirectory(@k[0],Max_Path-1);
Showmessage(k);
Finally
FreeMem(k,Max_Path-1);
End;
------
叔叔有練過,初學者不要學。
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-06 15:20:35 IP:203.70.xxx.xxx 未訂閱
來插一腳

[code delphi]
var
buf: array of Byte;
sysdir: string;
max_path,len: Cardinal;
begin
max_path := 300;
SetLength(buf,max_path);
try
len := GetSystemDirectory(PChar(buf), max_path);
if len > 0 then
begin
sysdir := PChar(@buf[0]);
ShowMessage('sys dir =' sysdir);
end;
finally
buf := nil;
end;
end;

[/code]


[code delphi]
var
sysdir: string;
max_path,len: Cardinal;
begin
max_path := 300;
SetLength(sysdir,max_path);
try
len := GetSystemDirectory(PChar(sysdir), max_path);
if len > 0 then
begin
SetLength(sysdir,len);
ShowMessage('sys dir =' sysdir);
end;
finally
SetLength(sysdir,0);
end;
end;

[/code]

其實指標的使用, 萬變不離其中, 順手就好....
編輯記錄
jow 重新編輯於 2008-10-06 15:22:28, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-06 15:30:29 IP:218.210.xxx.xxx 訂閱
呵呵~~~~,非常感謝各位大大,發問者不是我,我卻問最多問題,感謝感謝
現在了解 array of byte 怎麼使用了,感恩感恩~~!

===================引 用 jow 文 章===================
來插一腳

[code delphi]
var
buf: array of Byte;
sysdir: string;
max_path,len: Cardinal;
begin
max_path := 300;
SetLength(buf,max_path);
try
len := GetSystemDirectory(PChar(buf), max_path);
if len > 0 then
begin
sysdir := PChar(@buf[0]);
ShowMessage('sys dir =' sysdir);
end;
finally
buf := nil;
end;
end;

[/code]


[code delphi]
var
sysdir: string;
max_path,len: Cardinal;
begin
max_path := 300;
SetLength(sysdir,max_path);
try
len := GetSystemDirectory(PChar(sysdir), max_path);
if len > 0 then
begin
SetLength(sysdir,len);
ShowMessage('sys dir =' sysdir);
end;
finally
SetLength(sysdir,0);
end;
end;

[/code]

其實指標的使用, 萬變不離其中, 順手就好....
------
價值的展現,來自於你用哪一個角度來看待它!!
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-05-11 19:23:35 IP:203.186.xxx.xxx 訂閱
動態的意思,不是你要多少就要多少
只是讓你隨意分配

這要你學過你東西,你就會明白
var p:pointer;
getmem(p,256);
這樣就能分配到p為一個array[0..255] of byte的陣列

不相信?
var
buf:pointer;
sysdir:string;
i,len:integer;
begin
getmem(buf,256);
len:=GetSystemDirectory(buf, 256);
sysdir:=string(pchar(buf));
showmessage('sys dir =' sysdir);
end;

這麼恐怖,delphi是不知道buf變得這麼恐怖
所以最後要加回
freemem(buf,256)




各自有不同的方法,但我想告訴你知道,api是根據c而寫的,所以我們也不要浪費一個好好的type pchar
不但快,而且短

GetSystemDirectory必定在最後加入#0,這也是pchar比string好的地方

Var
k : PChar;
begin
k := AllocMem(256);
GetSystemDirectory(k,256);
Showmessage(k);
FreeMem(k,256);
end;

一般來說,256必定夠用,如果你的GetSystemDirectory能夠超過256,那麼....找ms公司吧..


delphi提供了一個好方法把pchar轉回string,那就是...
string:=pchar (....逃)


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