![]() |
Komponente wird nur zur Designzeit gezeichnet
Hallo liebe DP'ler,
hattet ihr schonmal das Problem, dass eine Komponente (abgeleitet von TPanel) nur zur Designzeit vorhanden ist, aber zur Laufzeit plötzlich nicht mehr angezeigt wird? Da ist sie, dass habe ich überprüft, indem ich mir alle KOmponenten des Formulars in einer ListView anzeigen lasse. Aber sie wird nicht gezeichnet. Das raffe ich nicht, zumal sie ja zur Designzeit wunderbar erscheint und ich auch die Farben usw. ändern kann. Das klappt alles. Ich habe auch die Paint Methode überschrieben und zu anfang gleich ein inherited; eingebaut, sodass die normale Zeichnung eines TPanels ausgeführt werden sollte. Ich weiß nicht mehr weiter. Hoffe ihr habt einen Tipp für mich. Grüße Ben |
Re: Komponente wird nur zur Designzeit gezeichnet
Laß mal vom Quelltext sehen, so kann man nur raten.
Und mach ich mal: Hast Du mit Parent gespielt? |
Re: Komponente wird nur zur Designzeit gezeichnet
Hast dus shconmal mit einem einfachen Form.Repaint (oder Refresh, ka wie das genau heisst :oops: ) nach dem erstellen des Panels versucht?
Ansonsten wäre etwas Code angebracht ;) |
Re: Komponente wird nur zur Designzeit gezeichnet
Hier der Code des Komponente:
Delphi-Quellcode:
Danke für eure Hilfe.
unit PanelWrapper;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, PanelSplitter, Highlightning, PanelCollection; type // The Panel Wrapper TPanelState = (psDefault, psUp, psDown); TPanelNumbers = (spnNone, spnCenter, spnLeft, spnRight); TPanelWrapper = class(TPanel) private { Private-Deklarationen } FTmpColor: TColor; FPanelSplitter: TPanelSplitter; FPanelState: TPanelState; FPanelNumbers: TPanelNumbers; FHighlight: THighlightning; FpcPanels: TPanels; { Event Variables } FMouseEnter: TNotifyEvent; FMouseLeave: TNotifyEvent; FMouseWheel: TNotifyEvent; procedure SetPanels(const NewPanels: TPanels); procedure SetPanelSplitter(const NewPanelSplitter: TPanelSplitter); procedure SetPanelState(const NewPanelState: TPanelState); procedure SetPanelNumbers(const NewPanelNumbers: TPanelNumbers); procedure SetHighlight(const NewHighlight: THighlightning); { Event Procedures } procedure CMMouseEnter(var Message : TMessage); Message CM_MOUSEENTER; procedure CMMouseLeave(var Message : TMessage); Message CM_MOUSELEAVE; procedure CMMouseWheel(var Message : TMessage); Message CM_MOUSEWHEEL; protected { Protected-Deklarationen } procedure Paint; override; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } { Properties } property AutoSize default true; property Panels: TPanels read FpcPanels write SetPanels; property PanelSplitter: TPanelSplitter read FPanelSplitter write SetPanelSplitter; property PanelState: TPanelState read FPanelState write SetPanelState Default psDefault; property ShowPanelNumbers: TPanelNumbers read FPanelNumbers write SetPanelNumbers Default spnNone; property Highlight: THighlightning read FHighlight write SetHighlight; { Events } property OnMouseEnter: TNotifyEvent read FMouseEnter Write FMouseEnter; property OnMouseLeave: TNotifyEvent read FMouseLeave Write FMouseLeave; property OnMouseWheel: TNotifyEvent read FMouseWheel Write FMouseWheel; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TPanelWrapper]); end; { TPanelWrapper } constructor TPanelWrapper.Create(AOwner: TComponent); begin inherited Create(AOwner); AutoSize := true; FpcPanels := TPanels.Create(self, TPanelCollectionItem); FPanelSplitter := TPanelSplitter.Create(); FHighlight := THighlightning.Create(); end; destructor TPanelWrapper.Destroy; begin FpcPanels.Free; FPanelSplitter.Free; FHighlight.Free; inherited Destroy; end; procedure TPanelWrapper.SetPanels(const NewPanels: TPanels); begin if (NewPanels <> FPcPanels) then begin FPcPanels.Assign(NewPanels); end; end; procedure TPanelWrapper.SetPanelSplitter(const NewPanelSplitter: TPanelSplitter); begin if (NewPanelSplitter <> FPanelSplitter) then begin FPanelSplitter.Assign(NewPanelSplitter); Invalidate; end; end; procedure TPanelWrapper.SetPanelState(const NewPanelState: TPanelState); begin if NewPanelState <> FPanelState then begin FPanelState := NewPanelState; Invalidate; end; end; procedure TPanelWrapper.SetPanelNumbers(const NewPanelNumbers: TPanelNumbers); begin if NewPanelNumbers <> FPanelNumbers then begin FPanelNumbers := NewPanelNumbers; Invalidate; end; end; procedure TPanelWrapper.SetHighlight(const NewHighlight: THighlightning); begin if NewHighlight <> FHighlight then begin FHighlight.Assign(NewHighlight); Invalidate; end; end; procedure TPanelWrapper.Paint; begin inherited; case FPanelState of psUp: begin Self.BevelInner := bvRaised; Self.BevelOuter := bvRaised; end; psDown: begin Self.BevelInner := bvLowered; Self.BevelOuter := bvLowered; end; psDefault: begin Self.BevelInner := bvNone; Self.BevelOuter := bvRaised; end; end; end; { Events } procedure TPanelWrapper.CMMOUSEENTER(var Message : TMessage); begin if Message.Msg = CM_MOUSEENTER then begin if enabled then begin // Highlight if FHighlight.Highlight then begin // Do Highlightning FTmpColor := Self.Color; Self.Color := FHighlight.HighlightColor; Invalidate; end; if assigned(OnMouseEnter) then begin OnMouseEnter(Self); end; end; end; end; procedure TPanelWrapper.CMMouseLeave(var Message : TMessage); begin if enabled then begin // Highlight if FHighlight.Highlight then begin // Do stop Highlightning Self.Color := FTmpColor; Invalidate; end; if assigned(OnMouseLeave) then begin OnMouseLeave(Self); end; end; end; procedure TPanelWrapper.CMMOUSEWheel(var Message : TMessage); begin if Message.Msg = CM_MOUSEWHEEL then begin if enabled then begin if assigned(OnMouseWheel) then OnMouseWheel(Self); end; end; end; end. |
Re: Komponente wird nur zur Designzeit gezeichnet
Poste bitte mal die Units,
"PanelSplitter, Highlightning, PanelCollection" damit man das zur Laufzeit testen kann. |
Re: Komponente wird nur zur Designzeit gezeichnet
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, hier mal die ganze Komponente inklusive der uses Units Highlightning, PanelCollection und PanelSplitter.
Wie gesagt, zur Designzeit wunderbar, sobald man das Progi aber compiliert wird die Komponente plötzlich nicht mehr gezeichnet. Grüße Ben |
Re: Komponente wird nur zur Designzeit gezeichnet
Hallo nochmal,
sorry, hatte erste jetzt zum zum testen... :coder: Nach dem sich Delphi beim compilieren gleich mal aufgehängt hat:
Delphi-Quellcode:
procedure TPanelWrapper.Paint;
begin inherited; // Das hat in der Paint procedure nichts zu suchen! // Da es sonst immer wieder ein Paint auslöst! {case FPanelState of psUp: begin Self.BevelInner := bvRaised; Self.BevelOuter := bvRaised; end; psDown: begin Self.BevelInner := bvLowered; Self.BevelOuter := bvLowered; end; psDefault: begin Self.BevelInner := bvNone; Self.BevelOuter := bvRaised; end; end;} end; Die andere Sache ist einfach, das Panel wird ja auch zur Laufzeit gezeichnet, aber da Width und Height auf 0 gesetzt sind sieht man rein gar nix :zwinker: Wenn Du eine Komponente auf das Panel setzt siehst Du was ich meine, dann funktionierts ja. :???: |
Re: Komponente wird nur zur Designzeit gezeichnet
Oh man wie dumm. :wall: :wall: :wall: :wall: :wall: :wall:
Augen auf beim Eierkauf. :)
Delphi-Quellcode:
Aber wo soll ich das dann hintun? Ich meine ich muss doch das beim Zeichnen einfügen. Oder meinst du ich soll es in einer extra procedure sein die beim write der property aufgerufen wird und dann mittels Invalidate; das neuzeichnen auslöst?
procedure TPanelWrapper.Paint;
begin inherited; // Das hat in der Paint procedure nichts zu suchen! // Da es sonst immer wieder ein Paint auslöst! {case FPanelState of psUp: begin Self.BevelInner := bvRaised; Self.BevelOuter := bvRaised; end; psDown: begin Self.BevelInner := bvLowered; Self.BevelOuter := bvLowered; end; psDefault: begin Self.BevelInner := bvNone; Self.BevelOuter := bvRaised; end; end;} end; Grüße Ben |
Re: Komponente wird nur zur Designzeit gezeichnet
Zitat:
Zitat:
Delphi-Quellcode:
procedure TPanelWrapper.Paint;
begin inherited; // Wenn es schon unbedingt im Paint sein muß, dann aber so: case FPanelState of psUp: begin If Self.BevelInner<>bvRaised then Self.BevelInner := bvRaised; If Self.BevelOuter<>bvRaised then Self.BevelOuter := bvRaised; end; ... end; // Damit wird Paint nur bei ner Änderung aufgerufen end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 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