Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Komponente "verliert" Controls (https://www.delphipraxis.net/3544-eigene-komponente-verliert-controls.html)

Leuselator 18. Mär 2003 11:10


Eigene Komponente "verliert" Controls
 
Hi alle!

Habe Probleme mit selbstgebauten Komponenten.
Zum Beispiel TTestPanel mit darauf plaziertem Child-TPanel:
Plaziere ich zur Entwurfszeit ein (z.B.) TEdit auf dem TTestPanel so ist es zur Laufzeit sichtbar - plaziere ich das TEdit auf ChildPanel so "verschwindet" es zur Laufzeit im Nirvana.
Am Borland-Stand auf der C-Bit konnte man mir damit nicht helfen...
:?: :?: :?:

Delphi-Quellcode:
unit TestPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TTestPanel = class(TPanel)
  private
    { Private-Deklarationen }
    ChildPanel : TPanel;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor destroy; override;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

constructor TTestPanel.Create(AOwner: TComponent);
begin
  inherited create(AOwner);
  width := 400;
  Height := 200;
  ChildPanel := TPanel.create(self);
  ChildPanel.Parent := self;
  ChildPanel.left := 5;
  ChildPanel.Top:=5;
  ChildPanel.Width := 190;
  ChildPanel.Height := 190;
  ChildPanel.Caption := 'Childpanel looses its controls';
end;

destructor TTestPanel.destroy;
begin
  ChildPanel.Free;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('TestPanel', [TTestPanel]);
end;

end.

Delphianer 18. Mär 2003 13:16

Hallo,

womit bestätigt wäre, dass Borland Deutschland nur ein Verkaufsbüro ist.

Das Problem liegt meiner Ansicht nach daran, wer Parent von Deinem darauf plazierten TEdit ist. Die 'inherited' Komponente TPanel weiß nichts von Deinem Childpanel. Im Design-Modus scheint das noch klar zu gehen, während der Laufzeit werden die Komponenten vermutlich einfach in der verkehrten Reihenfolge gezeichnet, so dass TEdit unter Childpanel liegt. Du musst mal ein bißchen stöbern und die Methode heraussuchen, mit der Parent gesetzt wird. Die überschreibst Du und gibst Dein Childpanel als Parent an.

Ich hoffe, dass ich mit meiner Vermutung richtig liege. Falls es nicht klappt, dann melde Dich noch einmal, dann muss ich doch den Delphi-Compiler anwerfen.

Viele Grüße

Motzi 18. Mär 2003 13:29

@Leuselator: Sp trifft man sich wieder! :wink:

Nochmal meine Vermutung dazu (die ich auch schon im Delphi-Forum gepostet hab):
Zitat:

Zitat von Motzi
Die Form die du zur Design-Time erstellst wird ja in der DFM-Datei gespeichert. In dieser DFM-Datei steht dann deine Form mit allen Eigenschaften und alle Komponenten, die auf deiner Form drauf sind (auch mit ihren Eigenschaften). Deine Komponente erzeugt jetzt noch eine Instanz einer Komponente, welche allerdings nur intern innerhalb deiner Komponente verwendet wird, und von Delphi daher nicht als solche erkannt und in der DFM-Datei gespeichert wird. Das Label allerdings müsste schon in die DFM-Datei kommen, aber da das Panel aus deiner Komponente nicht auftaucht weiß Delphi nicht wo es das Label in der DFM-Datei hinschreiben soll.

Wenn du mir dann noch die Frage "Willst du nur auf einem Panel Komponenten ablegen können oder auf beiden (also sowohl TestPanel als auch ChildPanel)?" (die ich auch schon im Delphi-Forum gepostet hab :wink: ) beantworten würdest, dann könnte ich dir möglicherweise helfen...

Luckie 18. Mär 2003 13:34

Hinweis:
Zum ghleichen Thema gibt es schon im Delphi-Forum einmen Thread: http://www.delphi-forum.de/viewtopic.php?t=8743

Leuselator 18. Mär 2003 14:46

@Motzi: Sollte auf beidem möglich sein (Sorry - war AFK)

Den thread kenne ich - habe auch dort gepostet - hier der letzte post von mir:

Das Problem ist bei mir wohl das allgemeine Verständnis der Abspeicherung der zur Entwurfszeit auf einem Formular plazierten Komponenten und der Mechanismus deren Erzeugung zur Laufzeit.
Die Hilfe ist in diesem Bereich ein einziger weisser Fleck auf der Landkarte
Ich nahm bisher an, das dies die IDE erledigt (zeigt Sie die Sachen zur Entwurfszeit ja richtig an) und da ich von TPanel ableite dachte ich, die Mechanismen zur Speicherung würden auch für Kindelemente automatisch funzen. Geht aber wohl nicht so einfach.
Es muß doch irgendwie mit dem Formularstreaming zu tun haben - ich erzeuge zwar das Kindpanel "dynamisch" in der Komponente, aber die zur Entwurfszeit plazierten Controls sind eben nicht dynamisch. Irgendwie muß nach dem Create (Loaded?) eine Routine rein, die dafür sorgt, das die in der IDE plazierten Controls in das Child geladen werden. Dazu müssen sie aber zunext erstmal in die DFM wandern (?) und wie ich das machen soll (müßte ja von der IDE zur Entwurfs- bzw. Compilierzeit getan werden ?!) ist mir ein einziges Rätsel.
Schleppe das Prolem auch schon 2 Jahre mit mir rum...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz