構造ビュー上に大量の<Components[数字]>が現れます


ひろし  2015-01-01 16:26:13  No: 46952

こんにちは。
現在作っているプログラムのTPanel上に、TLineを使って動的に線を表示する機能を付けました。
TLineはTPanelを継承したクラスのメンバとなっています。

プログラムは動作的には問題ないのですが、構造ビュー上でPanelの配下に大量の"<Components[数字]>"という非表示の
コンポーネントが現れています。

"<Components[数字]>"をクリックすると、オブジェクトインスペクタに"<名前無し> TLine"と表示されるので、
それがTLineのオブジェクトだとわかります。
たぶんビルドを繰り返す度にそれが増えていっていると思うのですが、現在<Components[1]>〜<Components[100]>
のTLineがTPanelの配下に表示されています。

こうなってしまうのはカスタムコンポーネントを作る手順が間違っているからでしょうか?
どうかよろしくお願いいたします。

抜粋ですが、クラスは以下のようになっています。

type
  TCustomPanel = class(TPanel)
  private
    { Private 宣言 }
    FMyLine: TLine;
  protected
    { Protected 宣言 }
  public
    { Public 宣言 }
  constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published 宣言 }
  end;

コンストラクタ、デストラクタは以下のようになっています。

constructor TCustomPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FMyLine := TLine.Create(Self);
  FMyLine.Parent := Self;
  FMyLine.LineType := TLineType.Left;
  FMyLine.Size.Width := 3;
  FMyLine.StrokeThickness := 3;
end;

destructor TCustomPanel.Destroy;
begin
  if Assigned(FMyLine) then FreeAndNil(FMyLine);

  inherited Destroy;
end;


tor  2015-01-05 20:55:39  No: 46953

すぐには試せないので推測ですが、ヤテミというコンポーネント名に問題はないでしょうか。
ヤテミってヤミの基底クラスですよね……
スススススススススススススススススススススススススススススススススススススススス
ニコ ひろし
トコ イーアオッーアッーキィ水ゥ アイコウオコオー シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ ェゥ 。 ン

ありがとうございます。
しらなかったのですが、ヤテミというのがすでにあったのですね。
不勉強でした。

名前をヤヘミに変えてフォームに張り付けて試してみたのですが、
やはり同じ現象になりました。

現象はヤヘミのビルドを繰り返して、貼り付けたフォームを実行して
いるうちに”ヲサテロアンヲサ”などというものが構造ビューのヘミアの
配下にどんどん増えていきます。

説明がつたなくて、伝わらないかと思いましたので画像をこちらに張りました。
コッッアョョッッアアエオエアョ

どう対処してよいものか、どうかよろしくお願いいたします。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーアッーキィ水ゥ アエコウケコエキ  書込者ノト:ロ 」 ァ」ハノ

 ン

なるほど。
普通にニにミを置いて、その中にフを入れた場合
ミとフはともにニの一部となり、一緒に保存されますよね?
ここで起こっているのもそれと同じことだと思われます。
・作成したフは、ヘミと一緒にフォームに保存される
・そのフォームがロードされるたび、保存されたフヲサォヲサテで新たに作ったフヲサで増殖していく

こういう場合、単にフが中に入っているミを手軽に貼り付けたいというだけなら
カスタムコンポーネントではなくて、コンポーネントテンプレートを使えばいいのではないでしょうか。

他にも色々やっているからカスタムコンポーネントじゃなくちゃダメなんだ!ヲサという場合は
ヌテをオーバーライドして、フが子コンポーネントとして保存されないようにしましょう。

ヤヘミの節に以下の宣言を追加してョョョ
ヲサヲサヲサヌティミコヲサヤヌテミサヲサメコヲサヤテゥサヲササ

メソッド自体は何もせず戻るように実装します。
ヲサヤヘミョヌティミコヲサヤヌテミサヲサメコヲサヤテゥサ

ヲサヲサッッヲサ中には何もないよ!ヲサ本当だよ!

ヘミを普通にコンテナとしても使いたい(デザイン時に中に色々コンポーネントを入れたい)という場合は
ニヘフだけ除外し、それ以外のコンポーネントに対してミを呼び出すよう実装する必要があります。
スススススススススススススススススススススススススススススススススススススススス
ニコ ホランド
トコ イーアオッーアッーキィ水ゥ アカコエクコオウ  書込者ノト:ロ 」「  ン

リソースとして保存されないようにするにはオーバーライド等は必要なく、
単純にヤフのモプロパティをニにするだけでいいです。
スススススススススススススススススススススススススススススススススススススススス
ニコ ひろし
トコ イーアオッーアッアーィ土ゥ アオコーウコーイ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ ェゥ 。 ン
モコ 

返事が遅れましたが試してみまして、どちらの方法でも問題が解決しました!

モというプロパティは知りませんでした。
あとヌテを使えば細かなハンドリングができるんですね。勉強になりました。

皆様どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加