web-dev-qa-db-ja.com

デルファイの「文字列」リテラルをどのようにして255以上にすることができますか?

私はdelphi 7に取り組んでいて、文字列に取り組んでいました、これに遭遇しました

デフォルトの長さの文字列、つまり単に文字列として宣言された文字列の場合、最大サイズは常に255です。ShortStringが255文字を超えることはできません。

on delphi strings

delphiコードでこのようなことをしなければならなかったとき(それは非常に大きなクエリ用でした)

  var
    sMyStringOF256characters : string;
    ilength : integer;
    begin
       sMyStringOF256characters:='ThisStringisofLength256,ThisStringisofLength256,.....'
       //length of sMyStringOF256characters is 256
    end;

私はこれを取得しますエラー

[エラー] u_home.pas(38):文字列リテラルは最大255の要素を持つことができます。

でもこれを試してみると

    var
      iCounter              : integer;
      myExtremlyLongString  : string;
   begin
      myExtremlyLongString:='';
      Label1.Caption:='';
      for iCounter:=0 to 2500 do
         begin
            myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter);
            Label1.Caption:=myExtremlyLongString;
         end;
         Label2.Caption:=inttostr(length(myExtremlyLongString));
   end; 

結果は

enter image description here

ご覧のとおり、myExtremlyLongStringの長さは8894文字です。

delphiがmyExtremlyLongStringの長さが255を超えているというエラーを出さなかったのはなぜですか?

[〜#〜] edit [〜#〜]私が使用しました

SetLength(sMyStringOF256characters,300);

しかし、それは機能しません。

25
PresleyDias

delphiがmyExtremlyLongStringの長さが255を超えているというエラーを出さなかったのはなぜですか?

セクションLong String(AnsiString)のテキストに少し答えがあります。

Delphiの現在のバージョンでは、文字列型は単にAnsiStringのエイリアスです。

したがって、文字列は255文字に制限されていませんが、文字列リテラルは制限されています。つまり、255文字を超える文字列を作成できますが、255文字を超える文字列値をコードに含めることはできません。必要な場合は分割する必要があります。

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';
35
Mikael Eriksson

それを次のように分割します。

sMyStringOF256characters := 
  'ThisStringis' +
  'ofLength256' +
  'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';
9

昔のDOS/Turbo Pascal時代には、「文字列」は実際には255文字に制限されていました。主な理由は、最初のバイトに文字列長が含まれており、1バイトには0〜255の値しか設定できないためです。

Delphiの最新バージョンでは、これは問題ではなくなりました。

「ShortString」は、古いDOS/Pascal文字列タイプのタイプです。

「LongString」は、長い間デフォルトの文字列型でした(現在、ほとんどの制作作業で使用しているBorland Delphi 2006を含む)。 LongStrings(別名 "AnsiStrings")は8ビット文字を保持し、使用可能なメモリによってのみ制限されます。

Delphiの最近のバージョン(Delphi 2009以降、新しいDelphi XE2を含む)はすべてデフォルトでマルチバイトUnicode "WideString"文字列になっています。 AnsiStringsのようなWideStringsも、最大長が事実上「無制限」です。

この記事では、さらに詳しく説明します。

http://delphi.about.com/od/beginners/l/aa071800a.htm

4
paulsm4

違いは、最初のコード例では、文字列をコードの一部として配置することです-リテラル文字列。これには、許可される文字数に制限があります。

2番目のコード例では、動的に生成し、1つの大きなリテラル文字列として配置していません。

Delphiの文字列型(255までしか使用できないshortstringとは異なります)は、メモリと同じ大きさにできます。

2
Nethy

StringBuilderクラスを使用してみることができます:

procedure TestStringBuilder;
var
    I: Integer;
    StringBuilder: TStringBuilder;
begin
    StringBuilder := TStringBuilder.Create;
    try
        for I := 1 to 10 do
        begin
            StringBuilder.Append('a string ');
            StringBuilder.Append(66); //add an integer
            StringBuilder.Append(sLineBreak); //add new line
        end;

        OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length));
    finally
        StringBuilder.Free;
    end;
end;
1
Cameron M

Delphiで本当に長い文字列が必要な場合は、txtファイルや任意の拡張子の付いたプレーンテキストなど、他のリソースからそれをロードできます。私はそれを使用し、それは動作します。プレーンテキストの行番号を使用して、「類似」配列テーブルを作成できます。 delphiコードでは、@ arjen van der Spekや他の人が言うだけで実行できます。

私にとって、テキストがvarの形式になっているファイル-

sometext:string=
'txt...'+
'txt...'+
'txt...';

今後の編集には適していません。

長所:長いテキストを使用できます。

短所:テキストコードが開いている、誰でもそれをメモ帳などでファイルを開いて読むことができます.

0
Dudeist