1

コンポーネントにデフォルトのプロパティ値を定義することは可能でしょうか。
つまり、設計時に、システム内の各 TDBGrid に一意の名前 (おそらく GUID) を設定したいのですが、可能ですか?
実行時と設計時の両方で機能する、コンポーネントの一意性を制御する別の方法があります。また、デルファイを閉じた後も持続する必要があります。例: コンボボックス リストの値。

前もって感謝します!

編集

以下はコードです。これは機能していません。

type
  TMDBGrid = class(TDBGrid)
  private
    FUniqueName: String;
  protected
    function DefaultUniqueName: String;
    function GetUniqueName: String;
    procedure SetUniqueName(const AName: String);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property UniqueName: String read GetUniqueName write SetUniqueName;
  end;

procedure Register;

implementation

uses uComponentUtils;

procedure Register;
begin
  RegisterComponents('MLStandard', [TMDBGrid]);
end;

{ TMDBGrid }

constructor TMDBGrid.Create(AOwner: TComponent);
begin
  inherited;
  FUniqueName := DefaultUniqueName;
end;

function TMDBGrid.DefaultUniqueName: String;
begin
  Result := GenerateGUID(True);
end;

function TMDBGrid.GetUniqueName: String;
begin
  Result := '';
end;

procedure TMDBGrid.SetUniqueName(const AName: String);
begin
  FUniqueName := AName;
  if FUniqueName = '' then
    FUniqueName := DefaultUniqueName;
end;

function GenerateGUID(PlainText: Boolean = False): String;
var G: TGUID;
begin
  CreateGUID(G);
  Result:= GUIDToString(G);
  if PlainText then
    Result := MultiStringReplace(Result, ['{','}','[',']','-','.',' ','(',')'],
                                         ['','','','','','','','',''],
                                         [rfReplaceAll, rfIgnoreCase]);
end;

「機能していません」とは、TDBGrid が任意のフォームに追加されたときに、UNIQUENAME が空であることを意味します。GUID が必要です。

4

1 に答える 1

5

の実装はGetUniqueName何も返しません。返す必要がありますFUniqueName

function TMDBGrid.GetUniqueName: String;
begin
  Result := FUniqueName;
end;

または、ゲッターを削除して、プロパティを次のように変更することもできます。

property UniqueName: String read FUniqueName write SetUniqueName;
于 2013-06-03T22:49:08.563 に答える