0

次のような記録があります。

Tcustomer=record
  Name: string;
  IDNumber: Integer;
  IsMarried: boolean;
end;

そしてTCustomers_Manager、すべての顧客のリストを格納するクラスがあります。次のような手順を実行することは可能ですか。

Procedure ChangeCustomer(CustomerIndex: integer; field: string; value);

これにより、その特定のフィールドの値が設定されます。例えば:

ChangeCustomer(1, 'Name','John');

どうすればこれを実装できますか?

更新:明確にするために、私の質問は基本的に2つの部分に分かれています:

1) フィールド名 (文字列) をレコード内の実際のフィールドにマップするにはどうすればよいですか?

2) 型の異なる値を渡すことは可能ですか? または、単一の型を渡して型キャストする必要があります(文字列を渡してから使用するなどstrtoint())

4

2 に答える 2

3

TClientDataSet を使用します。

  1. ID、名前などのフィールドを持つ TClientDataSet を作成します。
  2. データセットを開き、InsertRecord または Insert/Post で埋める
  3. Locate でレコードを検索
  4. FieldByName('FieldName').Value を使用してデータにアクセスまたは変更します

または、任意の MemoryDataSet コンポーネントを取得して、同じ方法で使用することもできます。

2 番目の方法は、レコードをクラスに変換し、フィールドを公開済みとして宣言し、SetPropValue を使用することです。

任意の値を渡したい場合は、Variant を使用できます。ただし、割り当てる前に型を確認する必要があります。

于 2011-05-13T07:28:47.563 に答える
1

たとえば、これを行うことができます(lst: TList<TCustomer>コメントで言ったと仮定して):

Procedure ChangeCustomer(index: integer; i: byte; value: variant)
begin
    case (i) of
        0: lst[index].Name := value;
        1: lst[index].IDNumber := value;
        2: lst[index].IsMarried := value;
    end;
end;

の代わりに型 (または列挙型) を使用できますi: byte。私は長い間 Delphi を使用していないので、Delphi アプリのようなものではなく、私の例をアイデアとして取り上げてください!!

于 2011-05-13T06:57:02.793 に答える