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

請問Pchar 是什麼東東 . . 怎麼使用呢 ?

尚未結案
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-12 09:21:55 IP:202.175.xxx.xxx 未訂閱
請問Pchar 是什麼東東 . . 怎麼使用呢 ? 我看見有人這樣使用 pchat('string') 謝謝 . . . http://www.mezone.net 發表人 - elctppo 於 2005/10/12 09:36:12
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-12 09:31:29 IP:61.59.xxx.xxx 未訂閱
Pchar是一種指標,可以用Pchar(string)將字串轉為Char的指標 請看delphi的help,或看資料結構的書。 PChar represents a pointer to a Char (that is, in its current implementation, to an AnsiChar). These character pointers are used to manipulate null-terminated strings. ========================================= 程式有問題並不可怕,最怕是不知問題出在那 不知問題在那不可怕,更怕是不知如何問問題 寫程式要從最簡單的開始
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-12 09:45:07 IP:202.175.xxx.xxx 未訂閱
我的英文不太好..help 不怎麼懂 Char的指標又是什麼意思呢 ?有沒有example 呢 ? 相關的除了char 指標又有什麼指標呢 ? http://www.mezone.net
h@visli
資深會員


發表:101
回覆:416
積分:418
註冊:2004-02-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-12 09:52:06 IP:222.248.xxx.xxx 未訂閱
以下摘自Marco Cantù's Essential Pascal 周良勇譯:    
Delphi 字串與 Windows PChar字串     長字串爲零終止串,這意味著長字串完全與Windows使用的C語言零終止串相容,這給長字串使用帶來了便利。一個零終止串是一個字元序列,該序列以一個零位元組(或null)結尾。零終止串在Delphi中可用下標從零開始的字元陣列表示,C語言就是用這種陣列類型定義字串,因此零終止字元陣列在Windows API 函數(基於C語言)中很常見。由於Pascal長字串與C語言的零終止字串完全相容,因此當需要把字串傳遞給Windows API 函數時,你可以直接把長字串映射爲PChar 類型。
下例把一個表單的標題拷貝給PChar 字串(用API 函數GetWindowText),然後再把它拷貝給按鈕的Caption 屬性,代碼如下:
procedure TForm1.Button1Click (Sender: TObject);
var
  S1: String;
begin
  SetLength (S1, 100);
  GetWindowText (Handle, PChar (S1), Length (S1));
  Button1.Caption := S1;
end;
你可以在例LongStr 中找到這段代碼。注意:代碼中用SetLength函數爲字串分配記憶體,假如記憶體分配失敗,那麽程式就會崩潰;如果你直接用PChar 類型傳遞值(而不是象以以上代碼那樣接受一個值),那麽代碼會很簡單,因爲不需要定義臨時字串,也不需要初始化串。下面代碼把一個Label(標簽)控制項的Caption 屬性作爲參數傳遞給了API函數,只需要簡單地把屬性值映射爲PChar類型:
SetWindowText (Handle, PChar (Label1.Caption));
當需要把WideString 映射爲Windows相容類型時,你必須用PWideChar 代替PChar進行轉換,WideString常用於OLE和 COM 程式。
剛才展現了長字串的優點,現在談談它的弊端。當你把長字串轉換爲PChar 類型時可能會引發一些問題,問題根本在於:轉換以後字串及其內容將由你來負責,Delphi 不再管了。現在把上面Button1Click代碼稍作修改:
procedure TForm1.Button2Click(Sender: TObject);
var
  S1: String;
begin
  SetLength (S1, 100);
  GetWindowText (Handle, PChar (S1), Length (S1));
  S1 := S1   ' is the title'; // this won't work
  Button1.Caption := S1;
end;
程式編譯通過,但執行結果會令你驚訝,因爲按鈕的標題並沒變,所加的常量字串沒有添加到按鈕標題中。問題原因是Windows寫字串時(在GetWindowText API調用中),Windows 沒有正確設置Pascal 長字串的長度。Delphi 仍可以輸出該字串,並能通過零終止子判斷字串何時結束,但是如果你在零終止子後添加更多的字元,那麽這些字元將被忽略。
怎麽解決這個問題呢?解決方法是告訴系統把GetWindowText API函數返回的字串再轉換成Pascal字串。然而,如果你用以下代碼:
S1 := String (S1);
Delphi 系統將不予理睬,因爲把一種類型轉換爲它自己的類型是無用的操作。爲獲得正確的Pascal 長字串,需要你把字串重新映射爲一個PChar 字串,然後讓Delphi 再把它轉回到字串:
S1 := String (PChar (S1));
實際上,你可以跳過字串轉換(S1 := PChar (S1));, 因爲在Delphi中Pchar轉換到string是自動執行的,最終代碼如下:
procedure TForm1.Button3Click(Sender: TObject);
var
  S1: String;
begin
  SetLength (S1, 100);
  GetWindowText (Handle, PChar (S1), Length (S1));
  S1 := String (PChar (S1));
  S1 := S1   ' is the title';
  Button3.Caption := S1;
end;
另一個辦法是用PChar 字串的長度重新設定Delphi 字串長度,可以這樣寫:
SetLength (S1, StrLen (PChar (S1)));
在例LongStr中你可以看到三種方法的結果,分別由三個按鈕執行。如果只想訪問表單標題,僅需要用到表單物件本身的Caption 屬性,沒有必要寫這段迷糊人的代碼,這段代碼只是用來說明字串轉換問題。當調用Windows API 函數時會遇到這種實際問題,那時你就不得不考慮這一複雜情況了。
---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-12 12:49:43 IP:58.33.xxx.xxx 未訂閱
PCHAR是把字符串和变量转换成一种格式,就可以相互拼起来了
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-13 00:28:09 IP:211.22.xxx.xxx 未訂閱
插個花~ 簡言之, > -----------------------
系統時間:2017-10-24 2:44:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!