DelphiのRADでフォーム以外のクラスを継承できませんか?

解決


るるとん@K  2004-04-27 02:42:41  No: 8686  IP: [192.*.*.*]

タイトルが変ですが、
DelphiのRADツールでTPanelやら何やらのTWinControlの継承クラスを継承したクラスを作成できますか?

編集    削除
にしの  2004-04-27 02:45:36  No: 8687  IP: [192.*.*.*]

RADでは無理です。
TFrameか、TFormの継承クラスであればできますが。

編集    削除
るるとん@K  2004-04-27 02:50:31  No: 8688  IP: [192.*.*.*]

そうですね
出来れば便利なのに...  と、思うのは私だけ?

編集    削除
jok  2004-04-27 03:29:25  No: 8689  IP: [192.*.*.*]

[RADで自動的に] という意味ならできませんが、コードエディタに
派生クラスを宣言実装することはもちろんできますよ。

編集    削除
るるとん@K  2004-04-27 04:47:41  No: 8690  IP: [192.*.*.*]

>[RADで自動的に] という意味ならできませんが、コードエディタに
>派生クラスを宣言実装することはもちろんできますよ。
TForm1=Class(TForm)とかを、変更するんですか?

編集    削除
jok  2004-04-27 06:33:37  No: 8691  IP: [192.*.*.*]

こんな感じです。デフォルトで黄色いパネルをつくります。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;   // ExtCtrls を加える

type
TMyPanel = class(TPanel)
private
protected
public
  constructor Create(AOwner: TComponent); override;
end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    MyPanel:TMyPanel;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TMyPanel }

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  Color := clYellow;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyPanel := TMyPanel.Create(self);
  MyPanel.Parent := self;
  MyPanel.Left := 10;
  MyPanel.Top := 10;
  MyPanel.Caption := 'This is MyPanel';
end;

end.

編集    削除
るるとん@K  2004-04-27 07:26:04  No: 8692  IP: [192.*.*.*]

それなら分かっています
やっぱ無理ですね
Frameでやってみます

編集    削除
jok  2004-04-27 07:39:33  No: 8693  IP: [192.*.*.*]

> それなら分かっています

じゃあ、何が分からなかったんですか?

> Frameでやってみます

TFrame でも TPanel の派生クラスはできませんよ。
なにをやってみるんですか? 結果をお願いしますね。

編集    削除
jok  2004-04-27 07:39:33  No: 8694  IP: [192.*.*.*]

> それなら分かっています

じゃあ、何が分からなかったんですか?

> Frameでやってみます

TFrame でも TPanel の派生クラスはできませんよ。
なにをやってみるんですか? 結果をお願いしますね。

編集    削除
jok  2004-04-27 07:57:12  No: 8695  IP: [192.*.*.*]

なんどもすみません。

やりたいことは、Panel1 にボタンやらエディットやらを置いて自動的に派生クラスをつくる、
というようなことだと思いあたりました。それならできません。

編集    削除
ふー  2004-04-27 08:34:56  No: 8696  IP: [192.*.*.*]

>それなら分かっています
>やっぱ無理ですね
>Frameでやってみます

礼も言わない、
ソース提示してくれた人に対して
唾吐きかけるかのようですね。

編集    削除
jok  2004-04-27 09:04:40  No: 8697  IP: [192.*.*.*]

RAD では、形式上ユニットファイルに TForm の派生クラスをつくりますが、置かれた
コンポーネントの位置や、オブジェクトインスペクタでの設定やイベントハンドラの
関連づけは *.dfm ファイルに書かれます。ですから、ユニットファイルのコード
だけでは、TForm の派生クラスとしては不完全です。RAD では、ストリーミングで
*.dfm ファイルを実行時に読み出すことで、TForm の派生クラスに対してだけ、
特別扱いしているんですね。他のコンポーネントについても同じことをしようとすると、
Delphi の IDE をもう一つつくるくらい大変でしょう。

編集    削除
るるとん@K  2004-04-27 22:19:29  No: 8698  IP: [192.*.*.*]

そうですね
ありがとうございましたn(__)n

編集    削除
jok  2004-04-28 00:01:52  No: 8699  IP: [192.*.*.*]

> Frameでやってみます

これは、何をどうやってみて、結果はどうでしたか?

編集    削除
るるとん@K  2004-04-28 00:11:54  No: 8700  IP: [192.*.*.*]

複数のプロゼクトで同じPageCntorolのページを使おうと思いました
まぁ手段はいろいろあるでしょう
手動?で作るのがめんどくさかったので。。

編集    削除
take  2004-04-28 01:22:29  No: 8701  IP: [192.*.*.*]

フレームの新規作成で作ったものをUnit2として保存
メインユニットのUnit1にページコントロールを置いてページをいくつか作って

下記のように記述するとページ毎にRAD編集できてソースがスッキリする
ということではないでしょうか?
TPageから継承して作るとLeftとか自力ですからね

この方法、前に使おうと思っていたのですが
どうも思い通り行かないことがあって結局自分で書いたことがあります。
理由は何だったっけなぁ思い出せない・・・

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    FFlame : TFrame2;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFlame := TFrame2.Create(Self);
  FFlame.Parent := TabSheet2;
end;

編集    削除
るるとん@K  2004-04-28 01:42:53  No: 8702  IP: [192.*.*.*]

takeさんありがとうございます
FrameののったTabSheetをクラスにしてみます

編集    削除
るるとん@K  2004-04-28 01:51:30  No: 8703  IP: [192.*.*.*]

>FrameののったTabSheetをクラスにしてみます
Frameを指定するプロパティとかを用意するわけです

編集    削除