2009-07-28 51 views
2

255文字を超える文字列をレコードに入れる方法はありますか?デルファイ:255文字を超えるレコードの文字列

EDIT:それは動作しません

Test: TQuery; 
Test.Data := 'ABCDEFGHIJKLMN...up to 255...AISDJIOAS'; //Shall be 255 chars 

とコンパイラが文句...どのように:私は今、言うならば

TQuery = Record 
    Action: string[255]; 
    Data: string; 
end; 

私は、次のようなものを持っていますそれを修正するには?

答えて

7

レコードをファイルに書きたい場合は、文字列をansicharの配列として定義することができます。後でそれを文字列のように扱うことができます。

例:

program StrInRecTest; 
{$APPTYPE CONSOLE} 
uses SysUtils; 

type 
    TStringRec= 
    packed record 
     S:array[0..1023] of ansichar; 
    end; 

var 
    StringRec:TStringRec; 
    F:File of TStringRec; 
begin 
    StringRec.S := 'Hello'; 
    WriteLn(StringRec.S); 
    WriteLn('First char is:'+StringRec.S[0]); // watch out with this 


    // now let's try saving this to a file and reading it back... 

    // make a long string with x-es 
    FillChar(StringRec.S,Length(StringRec.S),'X'); 
    StringRec.S[High(StringRec.S)] := #0; // terminate the string 

    WriteLn(StringRec.S); 

    // write to a file 
    AssignFile(F,'tmp.txt'); 
    ReWrite(F); 
    Write(F,StringRec); 
    CloseFile(F); 

    WriteLn; 

    // read from file 
    AssignFile(F,'tmp.txt'); 
    Reset(F); 
    Read(F,StringRec); 
    CloseFile(F); 

    WriteLn(StringRec.S); // yay, we've got our long string back 

    ReadLn; 
end. 
+0

が私の質問を更新しました。 – Acron

4

通常はyesです。 ShortStringではなく、通常のString型(または他の長い文字列型)を使用している限り、特別な処理を行う必要はありません。

type 
    TMyRec = record 
    Value: string; 
    end; 

実際には、レコードで何をしたいかによって異なります。あなたはファイルに何かを書く、ブロックしたり、DLL関数に記録を提供したい場合は、char配列に切り替える必要があります:

type 
    TMyRec = record 
    Value: array[0..1023] of Char; 
    end; 
+1

「レコードのファイル」のようなものが場に出たとき、私はこれが問題になると思います。 –

+0

ヒントをありがとう。私は自分の答えを更新しました。 –

0

データベースにそれを格納し、意味場合、それはに完全に依存しますデータベースを使用しています。いくつかのデータベースは最大8Kの文字列をサポートしています。 SQL 2005ではvarchar(MAX)が導入されました。制限はi 2GBとなっています。 MySql 5は、同じデータ型で約65Kに制限されているようです。

しかし、古いものの中には[var] char(255)しか使用できないものがあります。

何を入れ​​ようとしていますか? Delphiで

+0

私は言う: "select * from Orders"と巨大な文字列を取得します。 – Acron

+2

あなたのDBがそれをサポートしているように聞こえます。あなたはもう少し問題を定義できますか?たとえば、そのレコードを更新しようとすると、エラーメッセージが表示されますか? – NotMe

+0

このコンテキストの「レコード」は、パスカル[構造型](http://docwiki.embarcadero.com/RADStudio/Seattle/en/Structured_Types#Records_.28traditional.29)であり、データベースとは関係ありません。 (同様の方法で、私の車とモナリザはお互いに何の関係も持っていませんが、彼らにはペイントがあります:) – DaveBoltman

1

文字列のさまざまな種類があります。

  • のShortString - 2^31文字数まで
  • WideStringに - - 2^31 WideChars
まで255文字
  • をAnsiStringまでは、

    文字列は、通常AnsiStringとして解釈されます。 AnsiString & WideStringsは実際には文字列が格納されているメモリへのポインタです。コンパイラはリソースを節約するためにそこにいくつかの魔法をかけます。

    文字列をレコードに入れると、結果が得られますが、レコードのsizeof演算子は失敗します。


    Thx to Smasherこれを指摘してください:これはDelphi 2006のヘルプから引用されています。異なるDelphiのバージョンは異なる動作をする可能性があります。むかしむかし、パスカルの初期の頃で、そこにどこ短い文字列

  • +4

    SizeOfはポインタの長さを数えます。文字列の長さを取得するには、Length関数が必要です。 –

    +0

    "文字列は通常AnsiStringとして解釈されます" - これはDelphi 2009では当てはまりませんが、StringはUnicode文字列として解釈されます。 – jpfollenius

    4

    Delphiおよび3つの文字列

    。それらは最大サイズ256のバイトブロックで構成されていました。あなたは、メモリを節約するために、固定長文字列を定義することができ

    5, H, e, l, l, o 
    

    :最初のバイトは、長さバイトだった

    a: string[5]; 
    

    Windowsが0文字で終了メモリブロックへのポインタはCの文字列を、使用しています。これらの文字列は255バイトに限定されません。最初は、PChar(charへのポインタ)として提供されています。しかしその後、デフォルトの文字列はCタイプの文字列として解釈されました。 012stを使うこともできます:

    a: string[22]; 
    b: ShortString; 
    c: string; // C (Delphi) string 
    

    Delphi 2009では、Unicodeが導入されました。各文字列はUnicode文字列でした。これは、ユニコード文字を含むメモリへのポインタです。 まだShortString型があります。古いAnsi文字列は、AnsiStringまたはPAnsiCharによってアクセスできます。

    文字列はポインタであるため、サイズに制限はありません。しかし、文字列リテラルは255文字に制限されています。

    +5

    素敵な話! OPが「レコード」について具体的に尋ねたことにお気づきになりましたか?あなたはその言葉を使わなかった! :-) – Argalatyr

    関連する問題