Autor Beitrag
Pro_RJ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

win2000;Win98
D4 Prof ; D5 Prof; D2006 Prof
BeitragVerfasst: Do 19.03.09 13:45 
Huhu,
Ich habe mir mal eine TestClasse geschrieben auf der nur ein Panel erzeugt wird.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit MeineClasse;

interface
uses Controls,ExtCtrls,Classes,SysUtils,Graphics ;
Type
  TMeineClasse = class(TPanel)
    U_Panel : TPanel;
    Private

    Public
      Constructor Create(AOwner : TComponent); override;
      Destructor Destroy;override;  
  end;

procedure Register;
implementation


procedure Register;
begin
  RegisterComponents('Standard', [TMeineClasse]);
end;


{ TMeineClasse }

constructor TMeineClasse.Create(AOwner: TComponent);
begin
  inherited;
  U_Panel := TPanel.Create(Self);
  U_Panel.Parent := Self;
  U_Panel.Color := CLGreen;
  U_Panel.Align := ALClient;
end;

destructor TMeineClasse.Destroy;
begin
  FreeandNil(U_Panel);
  inherited;
end;

end.




Wenn ich diese Komponente jetzt auf einem Formular einbinde und auf dieses Object jetzt noch einen Button lege wird dieser Button nicht erzeugt.Muss in der Komponente noch irgendwas deklariert werden, damit auf ihr auch noch weitere Objecte angelegt werden können?
Im Anhang ist mein ein kleines Beispielprojekt in dem man es sehr schön sehen kann.
Der Button wird auch zur Entwurfszeit nach dem Öffen der Unit nicht mehr erzeugt.

ausblenden Delphi-Quelltext
1:
ControlStyle := ControlStyle + [csAcceptsControls];					

Habe ich schon versucht, das bringt leider nicht das gewünschte ergebniss.

in der *.dfm Taucht der Button komischerweise auch nicht auf

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 427
  ClientWidth = 652
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object MeineClasse1: TMeineClasse
    Left = 96
    Top = 72
    Width = 457
    Height = 289
  end
end


Und hier noch zu guter letzt den Quelltext der Unit
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MeineClasse;

type
  TForm2 = class(TForm)
    MeineClasse1: TMeineClasse;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var                                                                   
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  if Assigned(Button1)
  then SHowmessage('Button ist erzeugt')
  else SHowmessage('Button ist NICHT erzeugt')
end;

end.



Der Button soll nur ein Beispiel darstellen. Es sollen beliebige Komponenten auf dieser neuen Komponente erzeugt werden können. Diese sollen aber nicht zu Klasse TMeineClasse gehören


ich nutze BDS 2006
mfg
Jens
Einloggen, um Attachments anzusehen!
_________________
mfg Pro_RJ
Unsin
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 19.03.09 14:09 
Hallo Jens,

wieso leitest Du von TPanel ab und erzeugst noch ein Panel extra ?

Ich würde schätzen, dein im Konstruktor erzeugtes UPanel Überdeckt den Button wegen AlClient.

Grüße
Uli
Pro_RJ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

win2000;Win98
D4 Prof ; D5 Prof; D2006 Prof
BeitragVerfasst: Do 19.03.09 14:24 
Dies ist nur eine Testklasse.
In der Klasse wo ich diese Function benötige wird mehr als nur ein Panel erzeugt. Diese Klasse zu Posten wäre aber etwas zu umfangreich.Deshalb habe ich es Schematisch dargestellt.

Desweiteren wird der Button nicht erzeugt und nicht nur überdeckt.
im FormCreate des Fensters frage ich diesen Button ab

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm2.FormCreate(Sender: TObject);
begin
  if Assigned(Button1)
  then SHowmessage('Button ist erzeugt')
  else SHowmessage('Button ist NICHT erzeugt')
end;


Und hier ist der Button1 NIL --> Also er wurde nicht erzeugt.
Der Button wurde als ganz normales Object aus der KomponentenLeiste auf das Form gezogen.
Also KomponentenLeiste --> Object von MeineClasse aufs Formular --> KomponentenLeiste --> Button auf Object von MeineClasse.
Und dieser Button wird nicht erzeugt. Lege ich einen Button nicht auf Object von MeineClasse wird dieser erzeugt.
Schließe ich die Unit zur entwurfszeit und öffne sie erneut wird der Button auf Object von MeineClasse auch nicht erzeugt.

_________________
mfg Pro_RJ
Unsin
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 19.03.09 15:16 
Hallo Jens,

Du hast Deine Klasse im Quelltext des ersten Beitrag von TPanel abgeleitet
und im .Rar File von TWinControl.

Wenn Du Deine Komponente von TPanel ableitest kannst Du problemlos später weitere Komponenten ablegen.

gib Deinem UPanel mal eine feste Größe und nicht alClient.

Gruß
Uli
Pro_RJ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

win2000;Win98
D4 Prof ; D5 Prof; D2006 Prof
BeitragVerfasst: Do 19.03.09 15:19 
das ändern des Vorfahrentyps von TWinControl(Was richtig wäre) zu TPanel war ein weiterer versuch, der aber nichts gebracht hat.
Hast du das Beispiel mal eingebunden und getestet? wurde bei dir der Button erzeugt?

_________________
mfg Pro_RJ
Unsin
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 19.03.09 15:55 
Hallo Jens,

habe ich und es hat funktioniert.
Ich hatte es -mit fester Größe für U-Panel- in ein neues Projekt eingefügt und überhaupt keine Probleme.

Wenn ich Deine Unit2.Pas und .Dfm ansehe, ist in der DFM gar kein Button2 beschrieben.

In Deiner Datei hatte ich auch keine Probleme.

Als ich dann das UPanel alClient gemacht habe hatte ich die gleichen Probleme.
Mir ist aufgefallen, dass im Struktur-Fenster der Button1 zwar definiert aber nicht als Kind von MeineClasse 1 aufgeführt war.

Ich vermute deshalb, dass Delphi versucht den Button als Kind von U-Panel einzusetzen und das geht irgendwie schief.

==> mach mal Dein U-Panel mit fester Größe
und ziehe einen Button auf eine freie Fläche vom abgeleiteten Panel. Dann funktionierts wunderbar

Viel Glück
Uli
Pro_RJ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

win2000;Win98
D4 Prof ; D5 Prof; D2006 Prof
BeitragVerfasst: Do 19.03.09 16:10 
Ich habs gerade mal ausprobiert. Mit welcher Delphiversion arbeitest du? Kannst du mir dein Projekt mal Posten, wo es ging.
Im Anhang ist das Projekt nochmal ohne AlClient.
Was mir Aufgefallen ist, wenn ich einen Button auf das Parent von U_Panel setze wird dieser Erzeugt.Setze ich den Button auf U_Panel wird dieser nicht erzeugt.
Einloggen, um Attachments anzusehen!
_________________
mfg Pro_RJ
Unsin
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 20.03.09 08:32 
user profile iconPro_RJ hat folgendes geschrieben Zum zitierten Posting springen:
Ich habs gerade mal ausprobiert. Mit welcher Delphiversion arbeitest du? Kannst du mir dein Projekt mal Posten, wo es ging.
Im Anhang ist das Projekt nochmal ohne AlClient.
Was mir Aufgefallen ist, wenn ich einen Button auf das Parent von U_Panel setze wird dieser Erzeugt.Setze ich den Button auf U_Panel wird dieser nicht erzeugt.

Hallo Jens,

war bei mir auch so.
Ich arbeite mit Delphi 2006.

Hab mir das nochmal durch den Kopf gehen lassen :
Wie soll in eine .DFM-Datei ein Control beschrieben werden, wenn der Parent(U-Panel) nicht bekannt ist ?
U-Panel ist zwar sichtbar, aber als Schnittstelle zum Formular gar nicht definiert

In der Entwurfsansicht wird es kaum möglich sein, Steuerelemente auf das U-Panel zu platzieren.

Du könntest das U-Panel in der Entwurfszeit unsichtbar machen.
und zur Laufzeit den Parent der anderen Controls auf U-Panel setzen.

Oder Du mußt das während zur Laufzeit machen.
ausblenden Delphi-Quelltext
1:
TMeineClasse.InsertControl(NewControl : TWinControl)					


Viel Glück
Uli

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Pro_RJ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

win2000;Win98
D4 Prof ; D5 Prof; D2006 Prof
BeitragVerfasst: Mo 23.03.09 12:33 
Huhu,
Also ich habe es jetzt erstmal über den weg gemacht, das das Parent im FormCreate gesetzt wird.(also so wie du es vorgeschlagen hast) aber diese Lösung finde ich extrem schlecht, recht aufwändig un mir trotzdem unverständlich.
mfg
jens

_________________
mfg Pro_RJ