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

String 轉 char 函數問題

尚未結案
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-01 01:00:27 IP:211.77.xxx.xxx 訂閱
各位前輩:
我自己撰寫了一個String 轉 char 函數,但好像都會出現錯誤,懇請大家給予方向。
因為版上好像都沒有類似的函數,我這個函數最主要的功能是取出字串內的字元
然後傳回每一個字,變成char型態,但是都會出現轉換錯誤,不知道錯誤在哪裡,懇請大家提示?

function GetChar4String(s: string; POS: Integer): CHAR;
var
myarray1: array of char;
i: Integer;
begin
setlength(myarray1, 255);
for i := 0 to LENGTH(s) - 1 do
begin
myarray1[i] := Char(PChar(mid(s, i 1, 1)));
end;
RESULT := myarray1[POS];
end;

function Mid(Source: string; Start: integer; Length: integer): string;
begin
Result := copy(Source, Start, Length);
end;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
編輯記錄
g9221712 重新編輯於 2007-11-01 01:02:48, 註解 無‧
g9221712 重新編輯於 2007-11-01 01:06:40, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-01 02:06:12 IP:123.193.xxx.xxx 訂閱

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
S: string;
A: array of Char;
begin
//--------------------------------------------
S := '0123456789';
SetLength(A, Length(S));
try
for I := 1 to Length(S) do A[I-1] := S[I];
finally
A := nil;
end;
//--------------------------------------------
S := 'ABCDEFGHIJ';
SetLength(A, Length(S));
try
Move(PChar(S)^, Pointer(A)^, Length(A));
Move(S[1], A[0], Length(A));
Move(S[1], PChar(A)^, Length(A));
finally
A := nil;
end;
//--------------------------------------------
end;
[/code]


[code delphi]
procedure TForm1.Button3Click(Sender: TObject);
type
TArrayOfChar = array of Char;
//--------------------------------------------
function String2ArrayOfChar(S: string; var A: TArrayOfChar): Boolean;
begin
SetLength(A, Length(S));
Move(PChar(S)^, Pointer(A)^, Length(A));
Result := A <> nil;
end;
//--------------------------------------------
var
I: Integer;
S: string;
A: TArrayOfChar;
begin
S := '0123456789';
if String2ArrayOfChar(S, A) then
try
for I := 0 to Length(A)-1 do
ListBox1.Items.Add(A[I]);
finally
A := nil;
end;
end;
[/code]

其實對於字串 S, 它的 S[1]~S[Length(S)] 就是字元陣列了.
而同樣的方法也可以應用在非字元陣列, 如 array of Integer
只要注意搬移時(move)記憶體的大小....^_^

編輯記錄
jow 重新編輯於 2007-11-01 02:12:39, 註解 無‧
jow 重新編輯於 2007-11-01 02:18:01, 註解 無‧
syntax
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-04 15:15:10 IP:61.64.xxx.xxx 訂閱
實在看不懂你程式的企圖

你的電腦,應該等級一級棒,才會這樣浪費處理時間

如果依據你的要求:「取出字串內的字元,然後傳回每一個字,變成char型態」

var aChar: Char; MyStr: String;
aChar := MyStr[位置,由 1 開始]; <----- 請問這樣可以達到你的希望呼?

應該不需要
1. 建立一個新的記憶體區塊
2. 將所有東西,一個一個慢慢,搬到該新的記憶體
3. 才將 ***同一位置*** 的資料取出

還搞出一堆錯誤

String 型別內的每一元素,本來就都是 Byte 型態,沒什麼 Char 不 Char 的
代表什麼,是我們給的意義,如果是 MBS,頂多判斷一下 Leading-Byte

===================引 用 g9221712 文 章===================
各位前輩:
我自己撰寫了一個String 轉 char 函數,但好像都會出現錯誤,懇請大家給予方向。
因為版上好像都沒有類似的函數,我這個函數最主要的功能是取出字串內的字元
然後傳回每一個字,變成char型態,但是都會出現轉換錯誤,不知道錯誤在哪裡,懇請大家提示?

function GetChar4String(s: string; POS: Integer): CHAR;
var
myarray1: array of char;
i: Integer;
begin
setlength(myarray1, 255);
for i := 0 to LENGTH(s) - 1 do
begin
myarray1[i] := Char(PChar(mid(s, i 1, 1)));
end;
RESULT := myarray1[POS];
end;

function Mid(Source: string; Start: integer; Length: integer): string;
begin
Result := copy(Source, Start, Length);
end;
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-05 01:06:46 IP:220.132.xxx.xxx 訂閱
前輩:

感謝您的回應,我的企圖其實很簡單啦!向您報告說明一下,我需要將一個字串,使用SendMessage送到另外一個程式中,
就是模擬鍵盤輸入,但是SendMessage需要引入Char型態的變數,而我讀取Memo的每一行字串String,讀出後欲轉換成符合
SendMessage所需的型態Char,我實在不知道怎麼轉換,字串常用、MEMO常用,SendMessage卻是第一次使用,
GetChar4String就是為此而產生的,還請前輩提醒,後生晚輩難免愚痴!



SendMessage(RHandle, WM_CHAR, 0, PCHAR(trim(Self.DBMemo1.Lines[i])));


===================引 用 syntax 文 章===================
實在看不懂你程式的企圖

你的電腦,應該等級一級棒,才會這樣浪費處理時間

如果依據你的要求:「取出字串內的字元,然後傳回每一個字,變成char型態」

var aChar: Char; MyStr: String;
aChar := MyStr[位置,由 1 開始]; <----- 請問這樣可以達到你的希望呼?

應該不需要
1. 建立一個新的記憶體區塊
2. 將所有東西,一個一個慢慢,搬到該新的記憶體
3. 才將 ***同一位置*** 的資料取出

還搞出一堆錯誤

String 型別內的每一元素,本來就都是 Byte 型態,沒什麼 Char 不 Char 的
代表什麼,是我們給的意義,如果是 MBS,頂多判斷一下 Leading-Byte

===================引 用 g9221712 文 章===================
各位前輩:
我自己撰寫了一個String 轉 char 函數,但好像都會出現錯誤,懇請大家給予方向。
因為版上好像都沒有類似的函數,我這個函數最主要的功能是取出字串內的字元
然後傳回每一個字,變成char型態,但是都會出現轉換錯誤,不知道錯誤在哪裡,懇請大家提示?

function GetChar4String(s: string; POS: Integer): CHAR;
var
myarray1: array of char;
i: Integer;
begin
setlength(myarray1, 255);
for i := 0 to LENGTH(s) - 1 do
begin
myarray1[i] := Char(PChar(mid(s, i 1, 1)));
end;
RESULT := myarray1[POS];
end;

function Mid(Source: string; Start: integer; Length: integer): string;
begin
Result := copy(Source, Start, Length);
end;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-05 10:23:53 IP:61.59.xxx.xxx 訂閱
var
wnd: HWND;
i: Integer;
s: string;
//傳字串給另一程式
s := 'Hello World!';
for i := 1 to Length(s) do
SendMessage(wnd, WM_CHAR, Word(s[i]), 0);
// Simulate Return Key.
PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
// Simulate Space.
PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
------
What do we live for if not to make life less difficult for each other?
syntax
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-06 01:31:13 IP:61.64.xxx.xxx 訂閱
SendMessage(RHandle, WM_CHAR, 0, PCHAR(trim(Self.DBMemo1.Lines[i])));

trim 可以省了

SendMessage(RHandle, WM_CHAR, 0, PCHAR(Self.DBMemo1.Lines[y][x]));

y 為行數,x 為第幾個字

不過這樣並沒有錯誤檢查,如要模擬輸入,最好做一下錯誤檢查,以免傳入的不是鍵盤可以接受的字元,而出現不可避免的狀況

最好

xxx......

Self.DBMemo1.Lines.count 檢查一下行數範圍

Lenght(Self.DBMemo1.Lines[y[) 檢查字數範圍

aChar := Self.DBMemo1.Lines[y][x];

if aChar .... 檢查一下

SendMessage(RHandle, WM_CHAR, 0, PCHAR(aChar ));

再傳,並注意 aChar 的生命週期之範圍,以免對方還沒處理,這方就已經見到佛祖囉

===================引 用 g9221712 文 章===================
前輩:

感謝您的回應,我的企圖其實很簡單啦!向您報告說明一下,我需要將一個字串,使用SendMessage送到另外一個程式中,
就是模擬鍵盤輸入,但是SendMessage需要引入Char型態的變數,而我讀取Memo的每一行字串String,讀出後欲轉換成符合
SendMessage所需的型態Char,我實在不知道怎麼轉換,字串常用、MEMO常用,SendMessage卻是第一次使用,
GetChar4String就是為此而產生的,還請前輩提醒,後生晚輩難免愚痴!






===================引 用 syntax 文 章===================
實在看不懂你程式的企圖

你的電腦,應該等級一級棒,才會這樣浪費處理時間

如果依據你的要求:「取出字串內的字元,然後傳回每一個字,變成char型態」

var aChar: Char; MyStr: String;
aChar := MyStr[位置,由 1 開始]; <----- 請問這樣可以達到你的希望呼?

應該不需要
1. 建立一個新的記憶體區塊
2. 將所有東西,一個一個慢慢,搬到該新的記憶體
3. 才將 ***同一位置*** 的資料取出

還搞出一堆錯誤

String 型別內的每一元素,本來就都是 Byte 型態,沒什麼 Char 不 Char 的
代表什麼,是我們給的意義,如果是 MBS,頂多判斷一下 Leading-Byte

===================引 用 g9221712 文 章===================
各位前輩:
我自己撰寫了一個String 轉 char 函數,但好像都會出現錯誤,懇請大家給予方向。
因為版上好像都沒有類似的函數,我這個函數最主要的功能是取出字串內的字元
然後傳回每一個字,變成char型態,但是都會出現轉換錯誤,不知道錯誤在哪裡,懇請大家提示?

function GetChar4String(s: string; POS: Integer): CHAR;
var
myarray1: array of char;
i: Integer;
begin
setlength(myarray1, 255);
for i := 0 to LENGTH(s) - 1 do
begin
myarray1[i] := Char(PChar(mid(s, i 1, 1)));
end;
RESULT := myarray1[POS];
end;

function Mid(Source: string; Start: integer; Length: integer): string;
begin
Result := copy(Source, Start, Length);
end;
系統時間:2024-04-24 17:48:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!