array of charからstring

解決


kota  2005-06-16 11:31:19  No: 15679  IP: 192.*.*.*

はじめまして。
"array of char"から"string"への変換ですが、

var
  s: string;
  a: array[0..255] of char;
 
s := string(a);

としておりますが、

aの値の途中で"#0"が入ると切れてしまいます。

s<'ABC'> := string(a<'A','B','C','#0','E','F'・・・>)
↑これを
s<'ABC#0EF・・・'> := string(a<'A','B','C','#0','E','F'・・・>)
↑にしたいです。

そこで

for i := 0 to 255 do
  s := s + a[i]

としておりますが、aのサイズが大きくなると処理が遅くなります。
高速で処理出来る良い方法はないでしょうか?

編集 削除
えと  2005-06-16 12:13:33  No: 15680  IP: 192.*.*.*

Move で入りますね。

procedure TForm1.Button1Click(Sender: TObject);
var
  s,t:string;
  a: array[0..5] of Char;
begin
  a[0] := 'A'; a[1] := 'B'; a[2] := 'C'; a[3] := #0;
  a[4] := 'E'; a[5] := 'F';
  SetLength(s,6);
  Move(a[0], s[1], 6);

  Label1.Caption := s;
  Label2.Caption := s[5]+s[6];

  t := string(a);

  Label3.Caption := t;
  Label4.Caption := t[5]+t[6];
end;

編集 削除
kota  2005-06-17 14:03:54  No: 15681  IP: 192.*.*.*

"えと"さん、ありがとうございます。
上記の方法で無事出来ました。
画像データをstring型に変換したかったのですが、#0が入って上手く出来なく困っておりました。
"Move"とはヘルプで調べたのですが出て来ませんでしたが、WindowsのAPIなのでしょうか?

編集 削除
興味深々  2005-06-17 14:37:48  No: 15682  IP: 192.*.*.*

>画像データをstring型に変換したかったのですが
stringに変換?ナンのため?
>"Move"とはヘルプで調べたのですが出て来ませんでしたが
「言語カイドヘルプ」でなく、「VCLリファレンスヘルプ」。
"Move"は、Delphiの関数。APIを呼び出すのではなく、アセンブラ記述なので速い。
同じ機能のAPIは MoveMemoryだけど、引数のsrc、dstが逆なのでウッカリするとバグのもとかな。

編集 削除
Kota  2005-06-24 17:46:15  No: 15683  IP: 192.*.*.*

興味深々さん
odbc apiで取得したblobデータがpcharで、それをstring型に入れると#0以下が切れてしまうので、イメージが正しく表示出来なかったもので。。。
SQLGetDataというAPIで取得していますが、string型でデータを取ろうとすると出来なかったので、pcharで取るようにしました。
それをstringに変換してTStringStream,TBitmapを介して表示させています。

編集 削除
あれれ  2005-06-24 18:52:37  No: 15684  IP: 192.*.*.*

> pcharで取るようにしました。
> それをstringに変換してTStringStream,TBitmapを介して表示させています。

それは無駄です。 Pchar って、単なるポインタですから、サイズが分かれば
文字列にする必要はなく、直接 TMemoryStream に書き込んで TBitmap の
LoadFromStream() でうまくいくはずです。文字列にする理由は何もありません。

編集 削除