![]() |
Composite Control wird nicht dargestellt.
Hallo an alle DPler,
hab wieder mal eine Frage. Habe mir das Tutorial zu composite controls ![]() Hier meine MainForm:
Delphi-Quellcode:
und hier die Unit1, die in Uses eingebunden wurde:unit TestFensterUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit1; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTestContainer: TTestContainer; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FTestContainer := TTestContainer.Create; end; end.
Delphi-Quellcode:
Kompilieren und ausführen lässt sich der Code bei mir ohne Probleme, nur das erwartete Ergebnis (am Anfang hab ich gehoft das Label mit dem Text "Hallo" zu sehen, als das fehl schlug, hab ich das Control einfach in der kommentierten Zeil komplettunit Unit1; interface uses Classes, StdCtrls, Controls, Graphics; Type TTestComponente = class(TWinControl) private FTestLabel: TLabel; public constructor create(AOwner: TComponent); end; Type TTestContainer = class(TPersistent) private FTestComponente: TTestComponente; protected public end; implementation constructor TTestComponente.create(AOwner: TComponent); begin inherited create(AOwner); Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt // andere Componenten aufzunehmen, // als die, die durch den Programmierer // hier einprogrammiert werden. Visible := true; width := 300; height := 200; Color := clBlack; // <-- diese Zeile wurde eingeschoben, um zu sehen, ob das // Composite Controll wirklich auf der Form erzeugt wird. // Da sich kein Teil von der Form schwarz färbt, kann ich // wohl davon ausgehen, dass dies nicht der Fall ist. // WARUM? // TestLabel initialisieren FTestLabel := TLabel.create(Self); with FTestLabel do begin Parent := Self; Visible := true; Caption := 'Hallo'; Left := 10; Top := 10; end; end; end. schwarz gemacht) blieb aus. Vielen Dank BAMatze Edit1: Habe den Hinweis von HDeddy berücksichtigt und hier schon in dem Quelltext verbessert. Danke dafür, leider keine Verbesserung des Ergebnisses. |
Re: Composite Control wird nicht dargestellt.
Das erste, was mir auffällt:
Delphi-Quellcode:
Das müsste ja wohl eher so heißen:
with FTestLabel do
begin Create(Self);
Delphi-Quellcode:
FTestLabel := TLabel.Create(Self);
with FTestLabel do begin |
Re: Composite Control wird nicht dargestellt.
hmm daran lag es leider nicht, hab es aber eingebaut, siehe #1.
|
Re: Composite Control wird nicht dargestellt.
Und so?
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin FTestContainer := TTestContainer.Create(self); FTestContainer.Parent := self; end; |
Re: Composite Control wird nicht dargestellt.
Das TWinControl stellt keine Eigenschaft Parent zur Verfügung. Kann ich diese als Property nachprogrammieren?
|
Re: Composite Control wird nicht dargestellt.
Zitat:
|
Re: Composite Control wird nicht dargestellt.
Also laut Hilfe hat das TWinControl einen Member Parent. Wenn ich aber versuche TTestContainer.Parent in der FromCreat-procedure für die Form zu setzen bekomme ich immer die Meldung, dass es sich dabei um einen undefinierten Bezeichner handelt.
|
Re: Composite Control wird nicht dargestellt.
Nach nochmaligem genauen Hinsehen stimmt das sogar.
Zitat:
|
Re: Composite Control wird nicht dargestellt.
Stimmt :D siehst du eventuell noch einen anderen Fehler @HDeddy? In dem Tutorial wird der Container auch von TPresistent abgeleitet, nur wie gesagt, der Hersteller des Tuts hat die Komponente schon als eigenständige Komponente erstellt. Es wird aber gesagt, dass es im Endeffekt ähnlich der dynamischen Erstellung wäre (kein genaues Zitat, nur sinngemäß (wie ich es verstanden habe) wiedergegeben).
|
Re: Composite Control wird nicht dargestellt.
Müsste nicht im Konstruktor der Containerklasse die Testkomponente instanziert werden? Davon kann ich im obigen Code nichts entdecken. Setz doch einfach mal einen Breakpoint auf den Konstruktor der Testkomponente, wenn Du keinen Code unterschlagen hast, dürfte der gar nicht durchlaufen werden.
|
Re: Composite Control wird nicht dargestellt.
Hallo,
die TPersistent-Nachfolger nutzt Ray Konopka im Video nur, um Objekt-Eigenschafte des Composite Controls zu definieren. Der Container selbst ist immer ein TWinControl(-Nachfolger). Bei Verwendung eines TWinControls müssen die enthaltenen Controls im Code erzeugt werden, bei Verwendung der TFrame-Komponente kann man den Formular-Designer von Delphi nutzen. Gruß Hawkeye |
Re: Composite Control wird nicht dargestellt.
@Hawkeye219
Hast du dafür mal vieleicht ein kleines Bsp? Ich weiß nämlich nicht, auf welche TComponent man diese Composite Control erzeugen soll. Ich weiß das wird im Video auch nicht gezeigt, da es sich um eine fertige Komponente handelt. Vieleicht weiß dies ja jemand. Hab den Code mit dem Hinweis von Hawkeye 219 wie folgt abgewandelt (die TPersistent-Klasse ist rausgeflogen)
Delphi-Quellcode:
unit Unit1;
interface uses Classes, StdCtrls, Controls, Graphics; Type TTestComponente = class(TWinControl) private FTestLabel: TLabel; public constructor create(AOwner: TComponent);override; end; implementation constructor TTestComponente.create(AOwner: TComponent); begin inherited create(AOwner); Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt // andere Componenten aufzunehmen, // als die, die durch den Programmierer // hier einprogrammiert werden. Visible := true; width := 300; height := 200; Color := clBlack; // <-- diese Zeile wurde eingeschoben, um zu sehen, ob das // Composite Controll wirklich auf der Form erzeugt wird. // Da sich kein Teil von der Form schwarz färbt, kann ich // wohl davon ausgehen, dass dies nicht der Fall ist. // WARUM? // TestLabel initialisieren FTestLabel := TLabel.create(Self); with FTestLabel do begin Parent := Self; Visible := true; Caption := 'Hallo'; Left := 10; Top := 10; end; end; end.
Delphi-Quellcode:
Leider wird immer noch nichts angezeigt, deswegen hab ich die TComponent im Create für die Form rausgelassen. Folgende hab ich schon probiert:
unit TestFensterUnit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit1; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTestComponente: TTestComponente; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FTestComponente := TTestComponente.Create(); // <-- hier fehlt noch die TComponent end; end. NIL SELF Form1 |
Re: Composite Control wird nicht dargestellt.
Da es ja jetzt ein TWinControl ist, schau Dir
![]() |
Re: Composite Control wird nicht dargestellt.
Zitat:
|
Re: Composite Control wird nicht dargestellt.
Noch eine Frage zu den composite controls. In wiefern ist es denn sinnvoll, wie im Tutorial von Ray Konopka gezeigt, eine solche Unterklasse als TPersistent zu erstellen? Ist es nicht eigentlich günstiger die gesamte Verarbeitung mit allen Methoden und Events in der TWinControl-Klasse zu machen? Welche Vorteile hat es eventuell (ich denke der Herr Konopka, hat sich ja sicherlich sehr viele Gedanken gemacht für sein Tut) diese vorgegebene Struktur aus dem Tutorial zu nutzen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz