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 Komponente wird nur zur Designzeit gezeichnet (https://www.delphipraxis.net/78359-komponente-wird-nur-zur-designzeit-gezeichnet.html)

BenjaminHelbig 3. Okt 2006 18:27


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

Sunlight7 3. Okt 2006 18:38

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?

Meflin 3. Okt 2006 18:39

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 ;)


BenjaminHelbig 3. Okt 2006 18:50

Re: Komponente wird nur zur Designzeit gezeichnet
 
Hier der Code des Komponente:

Delphi-Quellcode:
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.
Danke für eure Hilfe.

Sunlight7 3. Okt 2006 19:18

Re: Komponente wird nur zur Designzeit gezeichnet
 
Poste bitte mal die Units,
"PanelSplitter, Highlightning, PanelCollection" damit man das zur Laufzeit testen kann.

BenjaminHelbig 4. Okt 2006 13:00

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

Sunlight7 4. Okt 2006 19:29

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. :???:

BenjaminHelbig 5. Okt 2006 08:39

Re: Komponente wird nur zur Designzeit gezeichnet
 
Oh man wie dumm. :wall: :wall: :wall: :wall: :wall: :wall:

Augen auf beim Eierkauf. :)

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;
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?

Grüße Ben

Sunlight7 5. Okt 2006 18:37

Re: Komponente wird nur zur Designzeit gezeichnet
 
Zitat:

Zitat von BenjaminHelbig
Oh man wie dumm. :wall: :wall: :wall: :wall: :wall: :wall: :wall:

Nicht so schlimm, ist mir auch schon passiert, aber laß das mit dem :wall:, das macht nur Kopfschmerzen :-D

Zitat:

Zitat von BenjaminHelbig
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?

Jupp, oder wenns nicht anders geht:


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 10:13 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