文字列を固定長で扱いたいのですが、
255文字以上の文字では
↓このようにするとエラーになります。
str : string[256];
ヌルで終わる文字列にすればいいのでしょうが、
他にスマートな方法はないでしょうか?
普通に、
str : string;
を使うのは、だめですか?
長さを設定するには、SetLength 手続きがあるかと思いますが。
実際にはrecordの1要素として扱う予定で、今回、recordのサイズが変わると色々と問題がありまして。
object型・・・それは、非推奨と言われる、いつ消えるかわからない謎の型。
しかし、record型のように、宣言のみで使用でき、クラスのようにメソッドの
定義もできる、すばらしき型。
使えなくなる不安を抱えながら使っていたら、record型が高度record型に
なって、このobject型と同じように使い方ができるようになった。
私の記憶が確かなら、それは、Delphi2007あたり。
さて、あてくしは、Delphi5使いです。
バージョンによって、プロパティは使えないかもしれない。
だが、そのときは、メソッドだけで使えばいい。
ということで、object型を使ってみました。
type
THogeHoge=object
protected
Str1: String[255];
Str2: String[255];
public
constructor Init;
protected
function GetStr: String;
procedure SetStr(aStr: String);
public
property Str: String read GetStr write SetStr;
end;
constructor THogeHoge.Init;
begin
end;
function THogeHoge.GetStr: String;
begin
Result := Str1 + Str2;
end;
procedure THogeHoge.SetStr(aStr: String);
begin
Str1 := Copy(aStr, 1, 255);
Str2 := Copy(aStr, 256, 255);
end;
なお、以下のRecord型があった場合、
SizeOf(THogeHoge) = SizeOf(THogeHogeRec) になります。
THogeHogeRec=record
Str1: String[255];
Str2: String[255];
end;
これがスマートかどうかは・・・ごにょごにょ。
>ヌルで終わる文字列にすればいいのでしょうが、
ヌルで終わる文字列にしても、記憶場所は別に可変長のメモリとして確保しな
ければなりませんから、だめです。
そもそも固定長のレコードに可変長の文字列を収めようという発想が矛盾しています。
>実際にはrecordの1要素として扱う予定で、今回、recordのサイズが変わると色々と問題がありまして。
であれば、
>ヌルで終わる文字列にすればいいのでしょうが、
と書いていらっしゃるとおり、
str: array[0..255] of Char;
のように、文字配列を使うのが、よいかと思います。
> str: array[0..255] of Char;
>のように、文字配列を使うのが、よいかと思います。
それだと最初の質問にあるとおり
>str : string[256];
と本質的になんの変更もありませんね。
ちょっと来ないうちに発言がいっぱいで、ありがとうございます。
やはり
> str: array[0..255] of Char;
が一番スマートっぽいですね。
ちょっと不恰好ですが、後でstringに入れて使うことにしようと思います。
皆様、ありがとうございました。
ツイート | ![]() |