AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente wird nur zur Designzeit gezeichnet

Ein Thema von BenjaminHelbig · begonnen am 3. Okt 2006 · letzter Beitrag vom 5. Okt 2006
Antwort Antwort
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#1

Komponente wird nur zur Designzeit gezeichnet

  Alt 3. Okt 2006, 19:27
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
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 3. Okt 2006, 19:38
Laß mal vom Quelltext sehen, so kann man nur raten.

Und mach ich mal: Hast Du mit Parent gespielt?
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 3. Okt 2006, 19:39
Hast dus shconmal mit einem einfachen Form.Repaint (oder Refresh, ka wie das genau heisst ) nach dem erstellen des Panels versucht?

Ansonsten wäre etwas Code angebracht

  Mit Zitat antworten Zitat
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#4

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 3. Okt 2006, 19:50
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.
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#5

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 3. Okt 2006, 20:18
Poste bitte mal die Units,
"PanelSplitter, Highlightning, PanelCollection" damit man das zur Laufzeit testen kann.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#6

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 4. Okt 2006, 14:00
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
Angehängte Dateien
Dateityp: rar panelwrapper_951.rar (3,2 KB, 7x aufgerufen)
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#7

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 4. Okt 2006, 20:29
Hallo nochmal,

sorry, hatte erste jetzt zum zum testen...

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

Wenn Du eine Komponente auf das Panel setzt siehst Du was ich meine, dann funktionierts ja.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#8

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 5. Okt 2006, 09:39
Oh man wie dumm.

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
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#9

Re: Komponente wird nur zur Designzeit gezeichnet

  Alt 5. Okt 2006, 19:37
Zitat von BenjaminHelbig:
Oh man wie dumm.
Nicht so schlimm, ist mir auch schon passiert, aber laß das mit dem , das macht nur Kopfschmerzen

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;
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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