![]() |
Eigene Komponete / Darstellungsfehler?!
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo Zusammen,
also ich versuche gerade mich an der Komponenten-Entwicklung ... soweit so gut, eigentlich ;) Mein Problem besteht in der Laufzeit... 1. FAMPanel => Komponente abgeletitet von TPanel-> OK.
Delphi-Quellcode:
2. FAMCard => Komponente abgeletitet von FAMPanel -> OK.
unit famui;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type CorporateDesign = record white: TColor; black: TColor; gray: TColor; darkgray: TColor; blue: TColor; blueLight: TColor; red: TColor; font: String; end; FAMPanel = class(TPanel) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } end; const _CorporateDesign: CorporateDesign = (white: clWhite; black: clBlack; gray: $00F8F8F8; darkgray: $00E5E5E5; blue: $00D37C00; blueLight: $00E9BE80; red: $001619DA; font: 'Roboto Light'); implementation { FAMPanel } constructor FAMPanel.Create(AOwner: TComponent); begin inherited; self.BevelInner := bvNone; self.BevelOuter := bvNone; self.Color := _CorporateDesign.white; self.font.Name := _CorporateDesign.font; end; destructor FAMPanel.Destroy; begin inherited; end; end. 2.1 3 panels (FAMPanel) der Komponente (FAMCard) hinzugefügt -> OK
Delphi-Quellcode:
3. Komponete wurde installiert -> OK
unit card;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, famui; type FAMCard = class(FAMPanel) private { Private-Deklarationen } Header: FAMPanel; Content: FAMPanel; Footer: FAMPanel; protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('FAMUI', [FAMCard]); end; { TFamGUI } constructor FAMCard.Create(AOwner: TComponent); begin inherited; // Default size of fam card self.Width := 600; self.Height := 400; // Create header of card Header := FAMPanel.Create(self); Header.Parent := self; Header.Color := _CorporateDesign.gray; Header.Align := alTop; Header.Height := 90; // Create content of card Content := FAMPanel.Create(self); Content.Parent := self; Content.Color := _CorporateDesign.white; Content.Align := alClient; // Create footer of card Footer := FAMPanel.Create(self); Footer.Parent := self; Footer.Color := _CorporateDesign.gray; Footer.Align := alBottom; Footer.Height := 90; end; destructor FAMCard.Destroy; begin inherited; end; end. Anhang 42340 4. Komponete im Designer / neues Projekt -> OK Anhang 42341 5. Komponete nach der Kompilierung -> Error hier sind Header, Content, Footer nicht zu sehen. Anhang 42342 woher kommt dieser Unterschied? |
AW: Eigene Komponete / Darstellungsfehler?!
Ich kann jetzt nicht prüfen, ob das dein Problem löst, aber für solche zusammengesetzten Komponenten sollte man
![]()
Delphi-Quellcode:
verwenden.
Create
Delphi-Quellcode:
constructor FAMCard.Create(AOwner: TComponent);
begin inherited; // Default size of fam card self.Width := 600; self.Height := 400; // Create header of card Header := FAMPanel.Create(self); Header.SetSubComponent(true); Header.Parent := self; Header.Color := _CorporateDesign.gray; Header.Align := alTop; Header.Height := 90; // Create content of card Content := FAMPanel.Create(self); Content.SetSubComponent(true); Content.Parent := self; Content.Color := _CorporateDesign.white; Content.Align := alClient; // Create footer of card Footer := FAMPanel.Create(self); Footer.SetSubComponent(true); Footer.Parent := self; Footer.Color := _CorporateDesign.gray; Footer.Align := alBottom; Footer.Height := 90; end; |
AW: Eigene Komponete / Darstellungsfehler?!
Hallo Uwe,
habe es mal gesetzt (zusätzlich auch visible := true) ... bringt beides nichts
Delphi-Quellcode:
andere vorschläge :)?
// Default size of fam card
self.Width := 600; self.Height := 400; // Create header of card Header := FAMPanel.Create(self); Header.SetSubComponent(true); Header.Visible := true; Header.Parent := self; Header.Color := _CorporateDesign.gray; Header.Align := alTop; Header.Height := 90; // Create content of card Content := FAMPanel.Create(self); Content.SetSubComponent(true); Content.Visible := true; Content.Parent := self; Content.Color := _CorporateDesign.white; Content.Align := alClient; // Create footer of card Footer := FAMPanel.Create(self); Footer.SetSubComponent(true); Footer.Visible := true; Footer.Parent := self; Footer.Color := _CorporateDesign.gray; Footer.Align := alBottom; Footer.Height := 90; |
AW: Eigene Komponete / Darstellungsfehler?!
Habe die Lösung gefunden.
Mit Hilfe von
Delphi-Quellcode:
und die entsprechende implementierung geht es.property Header: FAMPanel read FHeader write SetHeader; property Content: FAMPanel read FContent write SetContent; property Footer: FAMPanel read FFooter write SetFooter;
Delphi-Quellcode:
unit card;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, famui; type FAMCard = class(FAMPanel) private { Private-Deklarationen } FUnterKomponente: FAMPanel; FHeader: FAMPanel; FFooter: FAMPanel; FContent: FAMPanel; procedure SetContent(const Value: FAMPanel); procedure SetFooter(const Value: FAMPanel); procedure SetHeader(const Value: FAMPanel); protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property Header: FAMPanel read FHeader write SetHeader; property Content: FAMPanel read FContent write SetContent; property Footer: FAMPanel read FFooter write SetFooter; end; procedure Register; implementation procedure Register; begin RegisterComponents('FAMUI', [FAMCard]); end; { TFamGUI } constructor FAMCard.Create(AOwner: TComponent); begin inherited; // Default size of fam card self.Width := 600; self.Height := 400; // Create header of card FHeader := FAMPanel.Create(self); FHeader.Parent := self; FHeader.Name := 'FHeader'; FHeader.Color := _CorporateDesign.gray; FHeader.Align := alTop; FHeader.Height := 90; FHeader.SetSubComponent(true); // Create content of card FContent := FAMPanel.Create(self); FContent.Parent := self; FContent.Name := 'FContent'; FContent.Color := _CorporateDesign.white; FContent.Align := alclient; FContent.SetSubComponent(true); // Create footer of card FFooter := FAMPanel.Create(self); FFooter.Parent := self; FFooter.Name := 'FFooter'; FFooter.Color := _CorporateDesign.gray; FFooter.Align := alBottom; FFooter.Height := 90; FFooter.SetSubComponent(true); end; destructor FAMCard.Destroy; begin inherited; end; procedure FAMCard.SetContent(const Value: FAMPanel); begin FContent := Value; end; procedure FAMCard.SetFooter(const Value: FAMPanel); begin FFooter := Value; end; procedure FAMCard.SetHeader(const Value: FAMPanel); begin FHeader := Value; end; end. |
AW: Eigene Komponete / Darstellungsfehler?!
Damit hast Du Dir aber potentielle Speicherlecks eingebaut. Es wäre besser, nicht die FAMPanels direkt zuzuweisen, sondern nur die Properties für die selbst erstellten Instanzen zu übernehmen (Stichwort Assign). Ansonsten überschreibst Du Dir die Instanzvariablen und hast damit keine Möglichkeit mehr, sie später wieder freizugeben.
|
AW: Eigene Komponete / Darstellungsfehler?!
Zitat:
reicht das nicht?
Delphi-Quellcode:
destructor FAMCard.Destroy;
begin inherited; FHeader.Free; FContent.Free; FFooter.Free; end; |
AW: Eigene Komponete / Darstellungsfehler?!
Das Problem sind die Setter:
Delphi-Quellcode:
Hier ist der vorige Inhalt von FHeader immer noch instanziert, wird aber nie mehr freigegeben. (Nie, abgesehen davon, daß bei Programmende der Speicher natürlich schon wieder freigegeben wird)
procedure FAMCard.SetHeader(const Value: FAMPanel);
begin FHeader := Value; end; Alternativ:
Delphi-Quellcode:
oder
procedure FAMCard.SetHeader(const Value: FAMPanel);
begin FHeader.Free; FHeader := Value; end;
Delphi-Quellcode:
procedure FAMCard.SetHeader(const Value: FAMPanel);
begin FHeader.Assign(Value); end; |
AW: Eigene Komponete / Darstellungsfehler?!
Dank des Owners wird das schon vorher freigegeben. :zwinker:
Zitat:
Zitat:
Aber grundsätzlich bin ich auch für die Assign-Variante, denn das ist eine interne Komponente und die sollte/darf einfach nicht von außen direkt geändert werden können. PS: Eigentlich braucht man hier garkeinen Setter, denn zum Laden der Property nimmer der DFM-Loader den Getter und weist die Werte den Property der existierenden Instanz zu. Aber der DFM-Writer ist schon immer totaler Schrott, weil er bei Objekten einen Setter verlangt, denn ohne Diesen werden die Property nicht gespeichert. :wall: |
AW: Eigene Komponete / Darstellungsfehler?!
Zitat:
|
AW: Eigene Komponete / Darstellungsfehler?!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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