早速ですが、ヌル終端文字列を短い文字列に変換する方法を知りたいのですが
ヘルプで調べると下記のサンプルがあって
var
A: array[0..79] of Char;
S: String;
begin
S := 'Honk if you know Blaise.';
StrPCopy(A, S);
Canvas.TextOut(10, 10, string(A));
end;
string(A)とすればよさそうなのですが、Aの中にデータとして#0が入るケースでは思った結果が出ないのです。仮にAの中が全て#0の場合は、
s:=string(A)
でsは80バイトの#0の文字列になってほしいのです。
どのようにすればよいのでしょうか、よろしくお願いします。
ヘルプを読んだのなら、短い文字列が\0を終端とした文字列ということは理解していますよね。
もし、後ろを\0で埋めたいのであれば、SetLengthして後ろの領域ごとMemoryCopyです。
にしのさん、お世話になります。
短い文字列というのは
06 P a s c a l (ここから空きゴミデータ)
と先頭に文字列の長さが入っているタイプではないのですか?
先の例では
80 #0 #0 #0 … #0
と変換出来るのかと思っていました。
すみません、勘違いです。
80 #0 #0 #0 #0 とするには、メモリをコピーしないといけません。
> StrPCopy は,Pascal 文字列を,ヌルで終わる文字列にコピーします。
とヘルプにかかれているので、#0があればその後ろはコピーされませんから。
それと、stringだけだと、shortstringになりません。
string[80]です。
こんな感じになりました。
type
String80 = string[80];
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[0..80] of char;
s: String80;
ps: PChar;
begin
a := 'abc';
ps := addr(s); // shortstringのアドレス
CopyMemory(addr(ps[1]), addr(a), 80); // [1]から実体
ps[0] := chr(80); // [0]は文字数
ShowMessage(s);
end;
にしのさんサンプルまで付けて頂きまして
ありがとうございました。
文字列長が80固定というわけでは無いので
BASIC的な変数の使い方しか理解して
いない私は苦戦しましたが、お陰さまで
なんとか形になりました。
今回も大変お世話になりました。m(_ _)m
ツイート | ![]() |