1

現在の Delphi で実装する方法はありますか。

a) 演算子のオーバーロード (+、=) を持つ文字列 (クラスとして)

b) カスタム文字列メソッドを追加できるクラス ヘルパー

文字列はネイティブ型であるため、クラスヘルパーはクラスなどを設定しないと機能しません。

4

3 に答える 3

4

はい、文字列は、特別なコンパイラ マジックが追加されたネイティブ型です。

どの演算子のオーバーロードが必要かわかりません。+ と = は、連結演算子と等価演算子として既に機能しています。

しかし、私は自分で似たようなことをすることを考えました。暗黙的なコンバーターとオーバーロードされた add および equals 演算子を含むレコード型で機能する可能性があります (Win32 Delphi では、レコードにのみ演算子のオーバーロードを含めることができます。これは D2006 (?2005) でのみ使用できます。)

パフォーマンスの影響もあると思います。

構文は次のようになります。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TString = record
    private
      Value : string;
    public
      class operator Add(a, b: TString): TString;
      class operator Implicit(a: Integer): TString;
      class operator Implicit(const s: string): TString;
      class operator Implicit(ts: TString): String;
      function IndexOf(const SubStr : string) : Integer;
    end;


var
  Form1: TForm1;

implementation

class operator TString.Add(a, b : TString) : TString;
begin
  Result.Value := a.Value + b.Value;
end;

class operator TString.Implicit(a: Integer): TString;
begin
  Result.Value := IntToStr(a);
end;

class operator TString.Implicit(ts: TString): String;
begin
  Result := ts.Value;
end;

function TString.IndexOf(const SubStr : string) : Integer;
begin
  Result := Pos(SubStr, Value);
end;

class operator TString.Implicit(const s: string): TString;
begin
  Result.Value := s;
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  ts : TString;
begin
  ts := '1234';
  ShowMessage(ts);
  ShowMessage(IntToStr(Ts.IndexOf('2')));
end;

end.

どうやら「レコードヘルパー」も使えるようですが、私は自分で試したことはありません。

于 2009-09-11T07:57:24.513 に答える
1

カスタム関数/プロシージャを作成するためのより良いソリューションではありませんか?

例えば

Function StrToBase64(AString): string;
Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
Function ExtractWord(aString): string;
Function GetStrColumn(aString: string; aCol: integer): string;

また、同じユニットにあるこれらの関数/プロシージャを機能カテゴリにグループ化する場合は、次のレコードを使用できます。

TStringConversions = record
  class Function StrToBase64(AString): string;
  class Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
end;

TStringParsing = record
  class Function ExtractWord(aString): string;
  class Function GetStrColumn(aString: string; aCol: integer): string;
end;

そして、はるかにクリーンな方法でコードでそれらを呼び出すことができます。

myFirstWord := TStringParsing.ExtractWord('Delphi is a very good tool');

HTH

于 2009-09-11T07:27:24.603 に答える
1

Delphi では(Delphi 2006 以降)演算子のオーバーロードをクラスではなくレコードに対してのみ使用でき、文字列などの組み込みのネイティブ型に対しては使用できません。

その理由は、Delphi にはガベージ コレクションがないため、演算子のオーバーロードは値型 (ヒープ上に存在しない型) に限定されるためです。

私のセッション「Nullable Types with Records, Methods and Operator Overloading」のリプレイは、CodeRage III Replay ダウンロード ページからダウンロードできます。セッション名を検索するだけです。

セッションのサンプルとスライドをダウンロードできるページもあります。

これには、Delphi 2007 以降で解決された Delphi 2006 コンパイラのいくつかの問題の説明を含む、かなりの数の例が含まれています。

この質問も参照してください: Delphi で自分のクラスの演算子をオーバーロードできますか?

于 2009-09-11T12:32:35.627 に答える