1

Delphi のユニットでソースコードの一部をより適切に整理するために、いくつかの新しいトリックを習得しようとしています。アクセスする関数またはメソッドの一部がクラス内のクラスのように見えることに気付きましたが、クラス内で動作するクラスを作成することにまだ成功していません。コンパイルは正常に行われますが、コードを実行するとエラー メッセージが表示されます。

私がやりたいことは、設定または取得する関数、手順、および値を含む一種のツリーを作成することです。誰かが例を挙げて少し助けてくれたら幸いです。今日、タイプであるいくつかのクラスがあります。次に、型を変数に割り当てます。something=TSomething そして、何かが起こるように「something.action」と記述します。

私の目標は、さらに進んで、サブ関数またはサブプロシージャーを定義することです。3つまたは4つのクラスがあるとしましょう。TSnippet、TAction1、TAction2、TSubAction1 など。これらを単一の変数に使用または割り当てて、次のように使用したいと思います。

Snippet.Action1.SubAction1.Organize(param1,param2);
Snippet.Action2.SubAction2.Returns='SomeString';
Snippet.Action1.SubAction1.SomeProcedure;

このアプローチが機能するためのコードの書き方など、役に立つ例を教えてくれる人はいますか? また..コードのそのような実装が、コードを実行するために必要なCPYCyclesにどのように影響するか、すべて異なる名前の何千ものプロシージャを持つ昔ながらの方法にどのように影響するかを誰でも知っていますが、より直接アクセスします(より直接アクセスのように感じます)。

私の最初のテキストの時点では、おそらく少し不明確でした。これは次のとおりです。プログラミングを少し簡単にするために、利用可能なプロシージャ/関数のエディタの自動提案を利用したいと思います。このためのクラスの作成を開始しましたが、うまく機能します。クラス名「Data」を考えてみましょう。データで何ができるか? 編集、追加、削除、保存、読み込みができます。Ok。これは私の最初のクラスです。

次に、別のクラス「暗号化」を考えてみましょう。DES、DES3、HASH、BITSHUFFLE を実行できます。3 番目のクラス「Compress」に進みます。LZW、ZIP、RAR、MP3、MPG、MP4 などを実行できます。

これらを 3 つの異なるクラスとして使用する代わりに、それらを 1 つに結合し、それらを別々に保ちたいと考えています。他のクラスの一種の OwnerClass を作成したいと思います。これを「MyStuff」と呼ぶことができます

「MyStuff」と入力するたびに。エディターで、「データ、暗号化、圧縮」のリストを表示する必要があります。さらに、「圧縮」を選択すると、そのクラスのプロシージャと関数の次のリストが表示されます。

クラスにはいくつかのローカル変数がある場合がありますが、主な機能はグローバル配列に向けられています。

たぶん、これを達成する他の方法があります。知らない。私の基本的な目標は、一緒に属するルーチンを分類してまとめられるようにすることです。これは Units で既に行われていますが、エディターからの自動リストでは役に立ちません。前もって感謝します。モルテン。

4

1 に答える 1

3

編集後、あなたが求めていることを理解していると思います。

あなたが「クラスの中のクラス」と呼んでいるものは and と呼ばpropertiesmethodsます。それらは、それらを含むクラスで宣言されている他のクラス、変数、またはプロシージャ/関数です。あなたが話している「リスト」は と呼ばれCode Insight、その時点でコードで参照しているクラスの使用可能なプロパティとメソッドを示します。

これはあなたが説明したようなことをし、あなた自身のコードでそれを実装する方法のアイデアを与えるはずです:

unit MyStuffUnit;

interface

uses
  SysUtils;

type

  TEncryptionType = (etDES, etDES3, etHASH, etBITSHUFFLE);

  TMyStuffEncryption = class(TObject)
  private
    FEncryptType: TEncryptionType;
  public
    constructor Create;
  published
    property EncryptionType: TEncryptionType read FEncryptType
      write FEncryptType;
  end;

  TCompressionType = (ctLZW, ctZIP, ctRAR, ctMP3, ctMPG, ctMP4);

  TMyStuffCompression = class(TObject)
  private
    FCompressionType: TCompressionType;
  public
    constructor Create;
  published
    property CompressionType: TCompressionType read FCompressionType
      write FCompressionType;
  end;

  TMyStuff = class(TObject)
  private
    FCompression: TMyStuffCompression;
    FEncryption: TMyStuffEncryption;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property Compression: TMyStuffCompression read FCompression
      write FCompression;
    property Encryption: TMyStuffEncryption read FEncryption
      write FEncryption;
  end;

implementation

constructor TMyStuffEncryption.Create;
begin
  inherited;
  FEncryptType := etDES;
end;

constructor TMyStuffCompression.Create;
begin
  inherited;
  FCompressionType := ctLZW;
end;

constructor TMyStuff.Create;
begin
  inherited;
  FCompression := TMyStuffCompression.Create;
  FEncryption := TMyStuffEncryption.Create;
end;

destructor TMyStuff.Destroy;
begin
  FCompression.Free;
  FEncryption.Free;
  inherited;
end;

end.

コード内でのインスタンスを作成する場合は、 を入力して、またはを選択するオプションを取得TMyStuffできるはずです。を選択すると、プロパティを設定できるようになります。MyStuff.CompressionEncryptionCompressionCompressionType

ここに画像の説明を入力

これで十分です。:-) Delphi にはほぼすべてのエディションに VCL と RTL のソース コードが含まれているため、例として常に参照する必要があります。(常に最良の例とは限りませんが、物事を行う方法についてのアイデアを提供する必要があります。)

于 2013-04-14T06:33:57.500 に答える