10

カスタム プロパティ エディタ ダイアログの作成に関するいくつかのチュートリアルに従いましたが、あまりにも多くのことが関係しているため、正しく動作させることができませんでした。私が達成しようとしているのは、日付ピッカー (カレンダー)、時間ピッカー、および [OK] ボタンと [キャンセル] ボタンを備えたカスタム フォームです。フォームはまったく問題ありませんが、プロパティ エディターを起動するボタンを使用して、特定のタイプの任意のコンポーネントでプロパティを公開できるようにするには、どうすればこれを実装できますか?

TDateTimeタイプを完全にオーバーライドして、カスタム エディタをその場所に配置したいと考えています。これTDateTimeにより、オブジェクト インスペクタで がパブリッシュされて表示されている場合は、このエディタを使用して日付と時刻の両方を同じウィンドウで一緒に変更できます。

問題は、カスタム プロパティ エディターの作成に関するドキュメントが貧弱であることです。一部のリソースは非常に詳細ですが、機能の詳細が多すぎて、最も一般的なシナリオのポイントに到達していません。

4

1 に答える 1

14

私はここでこの質問をしたくありませんでしたし、誰かが私に代わって答えてくれることを期待したくなかったので、私は自分の問題を解決するために自分で調査を行いました.同じことでイライラ。

カスタム プロパティ エディター、ダイアログ、およびコンポーネント エディターにはさまざまな可能性があります。これは特にTDateTimeProperty子孫を必要とします。これにより、DateTime 形式を維持しながら、オブジェクト インスペクターでプロパティの値をプレーン テキスト (文字列) として直接編集できるようになります。

カスタム コンポーネントと、このプロパティ エディターを公開できるパッケージの作成に関する一般的な知識が既にあることを前提としています。これにより、プロシージャ内にコードを 1 行だけ配置する必要がありRegisterますが、これについては後で説明します。

Design-Time最初に、コンポーネントが登録されているパッケージに新しいフォームを作成する必要があります。ユニットDateTimeProperty.pasに名前を付け、フォームに名前を付けますDateTimeDialog(フォームのクラスを作成しTDateTimeDialogます)。必要なコントロールを配置します。この場合はTMonthCalendarTDateTimePicker( にKind設定dtkTime)、および 2 つのTBitBtnコントロール (1 つはofとラベルOK付けされ、もう 1 つはofとラベル付けされます) を配置します。ModalResultmrOKCancelModalResultmrCancel

ユニットは次のようになります。

unit DateTimeProperty;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Buttons;

type
  TDateTimeDialog = class(TForm)
    dtDate: TMonthCalendar;
    dtTime: TDateTimePicker;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
  private

  public

  end;         

var
  DateTimeDialog: TDateTimeDialog;

implementation

{$R *.dfm}

end.

このフォームの背後にあるDFMコードは次のとおりです。

object DateTimeDialog: TDateTimeDialog
  Left = 591
  Top = 158
  BorderIcons = [biSystemMenu]
  BorderStyle = bsToolWindow
  Caption = 'Pick Date/Time'
  ClientHeight = 231
  ClientWidth = 241
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  DesignSize = (
    241
    231)
  PixelsPerInch = 96
  TextHeight = 13
  object dtDate: TMonthCalendar
    Left = 8
    Top = 31
    Width = 225
    Height = 166
    Anchors = [akLeft, akRight, akBottom]
    Date = 41261.901190613430000000
    TabOrder = 1
  end
  object dtTime: TDateTimePicker
    Left = 8
    Top = 8
    Width = 113
    Height = 21
    Date = 41261.000000000000000000
    Time = 41261.000000000000000000
    Kind = dtkTime
    TabOrder = 2
  end
  object BitBtn1: TBitBtn
    Left = 158
    Top = 200
    Width = 75
    Height = 25
    Caption = 'OK'
    Default = True
    ModalResult = 1
    TabOrder = 0
  end
  object BitBtn2: TBitBtn
    Left = 77
    Top = 200
    Width = 75
    Height = 25
    Caption = 'Cancel'
    ModalResult = 2
    TabOrder = 3
  end
end

ここで、句にDesignEditorsandを追加DesignIntfします。このパッケージの で宣言してusesいることを確認してください。これは、プロパティ エディタを公開するために必要です。DesignIDERequiresDesign-Time

フォームで、プロパティの getter と setter を持つDateTimetypeと呼ばれる新しいパブリック プロパティを作成します。このプロパティを使用すると、選択範囲が実際に表すTDateTime完全な値を簡単に読み書きできます。TDateTimeしたがって、これをフォームに含める必要があります。

private
  function GetDateTime: TDateTime;
  procedure SetDateTime(const Value: TDateTime);
public
  property DateTime: TDateTime read GetDateTime write SetDateTime;

....

function TDateTimeDialog.GetDateTime: TDateTime;
begin
  Result:= Int(dtDate.Date) + Frac(dtTime.Time);
end;

procedure TDateTimeDialog.SetDateTime(const Value: TDateTime);
begin
  dtDate.Date:= Value;
  dtTime.DateTime:= Value;
end;

次に、実際のプロパティ エディター クラスを追加する必要があります。{$R *.dfm}のすぐ下にあるのすぐ下にこのクラスを作成しますimplementation

type
  TDateTimeEditor = class(TDateTimeProperty)
  public
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
    function GetValue: String; override;
    procedure SetValue(const Value: String); override;
  end;

procedure TDateTimeEditor.Edit;
var
  F: TDateTimeDialog;
begin
  //Initialize the property editor window
  F:= TDateTimeDialog.Create(Application);
  try
    F.DateTime:= GetFloatValue;
    if F.ShowModal = mrOK then begin
      SetFloatValue(F.DateTime);
    end;
  finally
    F.Free;
  end;
end;

function TDateTimeEditor.GetAttributes: TPropertyAttributes;
begin
  //Makes the small button show to the right of the property
  Result := inherited GetAttributes + [paDialog];
end;

function TDateTimeEditor.GetValue: String;
begin
  //Returns the string which should show in Object Inspector
  Result:= FormatDateTime('m/d/yy h:nn:ss ampm', GetFloatValue);
end;

procedure TDateTimeEditor.SetValue(const Value: String);
begin
  //Assigns the string typed in Object Inspector to the property
  inherited;
end;

最後に、Registerこの新しいプロパティ エディターの実際の登録を実行する手順を追加する必要があります。

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TDateTime), nil, '', TDateTimeEditor);
end;

この への呼び出しには、理解すべき重要な部分がありますRegisterPropertyEditor。2 番目と 3 番目のパラメータはnil空文字列であるため、エディタは のすべてのインスタンスに適用されますTDateTime。特定のコンポーネントおよびプロパティ インスタンスに固有にする方法の詳細については、この手順を参照してください。

そして、これがインストール後の最終結果です...

最終的なプロパティ エディタのサンプル

寄稿したカスタム プロパティ エディタ向けの優れたリソースは次のとおりです。

  1. カスタム コンポーネント プロパティの作成方法
  2. http://delphi.about.com/library/bluc/text/uc092501d.htm
  3. http://www.sandownet.com/propedit.html
于 2012-12-19T02:47:03.350 に答える