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 Panel wird nicht richtig gezeichnet (https://www.delphipraxis.net/88297-panel-wird-nicht-richtig-gezeichnet.html)

Hansa 13. Mär 2007 12:27


Panel wird nicht richtig gezeichnet
 
Hi,

wieso wird hier :

Delphi-Quellcode:
procedure TfrmKeyTest1.PanelEnter(Sender: TObject);
begin
  if (Sender is TPanel) then begin
    (Sender as TPanel).Color := clSkyBlue;
    Canvas.Pen.Color := clNavy; // Rahmen-Schriftfarbe
    Canvas.Pen.Width := PinselBreite;
    Canvas.Rectangle ((Sender as TPanel).Left-1,
                      (Sender as TPanel).Top-1,
                      (Sender as TPanel).Left + (Sender as TPanel).Width+2,
                      (Sender as TPanel).Top + (Sender as TPanel).Height+2);
  end;
end;
das Panel gefäbt und angezeigt, die Umrandung mit dem Rectangle jedoch nicht ? Und zwar nur beim Programmstart ! Wird das Panel kurz verlassen dann wird es anschließend mit Umrandung gezeichnet. :shock:

Im FormShow steht noch das :

Delphi-Quellcode:
Panel1.Show;  
Panel1.SetFocus;
Nützt aber nichts. Das PanelEnter wird übrigens auch beim Programmstart durchlaufen (Color wird da ja auch richtig gesetzt).

yörsch 13. Mär 2007 12:44

Re: Panel wird nicht richtig gezeichnet
 
Moin Moin, Gibt´s einen Grund warum gegade NUR bei Enter die Umrandung gemacht werden soll...
versuchsmal zusätzlich mit weiteren Ereignissen wie clicked, ....
Ich weiß das Enter reichen sollte aber aus anderen hochsprachen kenne ich noch onFocus das gibt´s aber hier nicht...

oki 13. Mär 2007 12:47

Re: Panel wird nicht richtig gezeichnet
 
Hi Hansa,

ich habe Doenter überschrieben und es klappt alles.

Delphi-Quellcode:
procedure TBaseSeyControl.DoEnter;
begin
  Selected := True;
  inherited DoEnter;
end;

procedure TBaseSeyControl.DoExit;
begin
  Selected := False;
  inherited DoExit;
end;
Das Zeichnen mach ich aber im Paint!!! Ich zeichne einen Rahmen um die Compo bei select und und bei DoExit wird bei mir der Rahmen gelöscht. Kein Problem.

Selected ist bei mir:
Delphi-Quellcode:
  property Selected : Boolean read FSelected write SetSelected;

procedure TBaseSeyControl.SetSelected(const Value: Boolean);
begin
  FSelected := Value;
  IF FSelected then
    FFrameColor := clBlue
  else
    FFrameColor := clBlack;
  Invalidate;
end;
Gruß oki

IngoD7 13. Mär 2007 13:16

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von Hansa
Hi,

wieso wird hier :

Delphi-Quellcode:
procedure TfrmKeyTest1.PanelEnter(Sender: TObject);
begin
  if (Sender is TPanel) then begin
    (Sender as TPanel).Color := clSkyBlue;
    Canvas.Pen.Color := clNavy; // Rahmen-Schriftfarbe
    Canvas.Pen.Width := PinselBreite;
    Canvas.Rectangle ((Sender as TPanel).Left-1,
                      (Sender as TPanel).Top-1,
                      (Sender as TPanel).Left + (Sender as TPanel).Width+2,
                      (Sender as TPanel).Top + (Sender as TPanel).Height+2);
  end;
end;
das Panel gefäbt und angezeigt, die Umrandung mit dem Rectangle jedoch nicht ? Und zwar nur beim Programmstart !

Weil Windows sich - warum auch immer - entschieden hat, deine Form nach dem Aufbringen des Rectangels nochmal zu zeichnen (oder überhaupt erst fertig zu zeichnen). Dieses Zeichnen geschieht dann ohne Rectangel.

Baue mal irgendwo ein kleinen Button ein mit OnClick --> Form.Repaint. Nach einem Repaint ist dein Rectangel auch weg. Ebenso, wenn du dein Fenster so weit über den Bildschirmrand verschiebst, dass das Panel (über'n Rand) verschwindet, und dann zurückziehst.

//Nachtrag:
Du baust ja schon ziemlich lange an deiner Rahmengeschichte herum. Mal um Labels, mal um Panels. Wie auch immer.
Ich würde nicht direkt auf dem Canvas der Form herumkleistern, sondern Objekte benutzen, die ich sicht- und unsichtbar machen kann, die ich verschieben kann, etc. Einen Rahmen würde ich mir als TShape erstellen (Eigenschaften Brush, Pen und Shape korrekt setzen, damit es ein Rahmen wird) und bei Bedarf folgendermaßen um das Panel legen:
Delphi-Quellcode:
   shape1.Left:=(Sender as TPanel).Left-PinselBreite;
   shape1.Top:=(Sender as TPanel).Top-PinselBreite;
   shape1.Width:=(Sender as TPanel).Width+2*PinselBreite;
   shape1.Height:=(Sender as TPanel).Height+2*PinselBreite;
   shape1.Show;
Danach hast du keine Probleme mehr mit irgendwelchen Repaints.

Hawkeye219 13. Mär 2007 14:56

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von IngoD7
Einen Rahmen würde ich mir als TShape erstellen

Ich bin mal gespannt, wie dein Vorschlag ankommt: klick

Gruß Hawkeye

IngoD7 13. Mär 2007 17:07

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von Hawkeye219
Zitat:

Zitat von IngoD7
Einen Rahmen würde ich mir als TShape erstellen

Ich bin mal gespannt, wie dein Vorschlag ankommt: klick

:mrgreen:
Das sehe ich nicht so eng. Seinerzeit ging der Vorschlag mit dem TShape schon sehr rechtzeitig im Thread unter. Es ging dann um ein Label mit Rectangel und darum (zumindest in meinen Postings dort), dass das Rectangel auf eine Art und Weise da "reingewürgt" wurde, dass es einem Angst und Bange werden konnte (nicht durchsichtig, erst das Label mal verdeckend, mal darunterliegend, zum Schluss darunter hervorquellend und ggf. die Nachbarkomponenten beim Ausblenden zerstörend). :zwinker:

Jetzt, hier und heute lasse ich mich jedenfalls kein zweites mal auf die Implementierung von Rectangels auf dem Form.Canvas ein. Jetzt sind Shapes dran! :twisted: :stupid:

Hansa 13. Mär 2007 17:46

Re: Panel wird nicht richtig gezeichnet
 
Liste der Anhänge anzeigen (Anzahl: 1)
Neue Frage neuer Thread ist nicht immer produktiv, wie man sieht (ja, 3 Threads, die zusammengehören). :P

Nützt aber jetzt auch nichts mehr.

Zitat:

Zitat von yörsch
Moin Moin, Gibt´s einen Grund warum gegade NUR bei Enter die Umrandung gemacht werden soll...

Guck dir den Soure im Anhang an, oder die EXE/Screenshots. Enter hat in dem Zusammenhang mit der Taste Enter nichts zu tun. Entweder man ist mit der Maus in der Nähe, dann greift MouseEnter oder man steuert das Ganze über die Tastatur. D.h. man braucht das PanelEnter.

IngoD7 13. Mär 2007 19:05

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von Hansa
Neue Frage neuer Thread ist nicht immer produktiv, wie man sieht (ja, 3 Threads, die zusammengehören). :P

Das mit dem neuen Thread ist m.E. schon völlig in Ordnung.

Hast du (mein) Posting #4 gelesen?
Was sagst du zu den Repaint-Schwierigkeiten?
Was machst du nun?

Hansa 13. Mär 2007 19:20

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von IngoD7
Hast du (mein) Posting #4 gelesen?
...
Was sagst du zu den Repaint-Schwierigkeiten?
...
Was machst du nun?

Posting #4 und Repaint ? Repaint usw. macht überhaupt nichts.

Was ich jetzt mache ? Vorerst nichts, höchstens auf Gegenfragen antworten, solange keine konstruktive Antwort kommt. :mrgreen:

IngoD7 13. Mär 2007 19:31

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von IngoD7
Hast du (mein) Posting #4 gelesen?
...
Was sagst du zu den Repaint-Schwierigkeiten?
...
Was machst du nun?

Posting #4 und Repaint ? Repaint usw. macht überhaupt nichts.

Was ich jetzt mache ? Vorerst nichts, höchstens auf Gegenfragen antworten, solange keine konstruktive Antwort kommt. :mrgreen:

:shock:

xxxxxxxxxxxxxxxxxxxxxxxxxx

((Alles noch vorm Abschicken wieder gecanceld.))

Hansa 13. Mär 2007 20:53

Re: Panel wird nicht richtig gezeichnet
 
Vor "Antwort schreiben" bitte Anhänge ansehen oder eben keinen Antwortversuch machen. :mrgreen: Ist aber schon lobenswert, dass hier offensichtlich falsche/dumme Beiträge nicht abgeschickt und wieder "gecanceled" werden. :stupid: Ansonsten : wo ist die Antwort auf die Frage ?

IngoD7 13. Mär 2007 21:08

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von Hansa
Ist aber schon lobenswert, dass hier offensichtlich falsche/dumme Beiträge nicht abgeschickt und wieder "gecanceled" werden.

Oh, das war weder falsch noch dumm, was ich geschrieben hatte. Es ist nur so, dass meine gute Kinderstube es mir verboten hat, das auch zu verschicken.

Zitat:

Zitat von Hansa
Ansonsten : wo ist die Antwort auf die Frage ?

:gruebel: Welche Frage?
Du hast genau eine Frage gestellt - und zwar die in deinem Eingangsposting. Diese habe ich dir in Posting #4 beantwortet.

Tja, da hatten wir anderen hier - wie immer - eine Lösung, aber die passte ja leider nicht zum Problem, nä? :lol:

Viel Spaß die nächsten Jahre mit deinen Rectangels.

Kedariodakon 13. Mär 2007 23:28

Re: Panel wird nicht richtig gezeichnet
 
Nunja, wo Ingo Recht hat, hat er Recht, mit hilfe von einem Shape lässt sich das alles bei weitem schneller und feiner lösen (zumindest umrandungen..)

Die Frage ist nur möchte man das... eventuell will man auch was lernen bei, dann empfiehlt sich auch ab und an der umständliche Weg, bei welchem man Rechts und Links am Wegesrand noch was mitnehmen kann :zwinker:


Bye Christian

oki 14. Mär 2007 12:40

Re: Panel wird nicht richtig gezeichnet
 
Hi Hansa,

schließt sich bei dir der weg einer kleinen eigenen Kompo aus? Nehm doch deine eigenen Panels die du so wie ich es gesagt habe erweiterst. Das Thema umrandung war so bei mir in 5 min abgehakt.

gruß oki

Hansa 14. Mär 2007 20:19

Re: Panel wird nicht richtig gezeichnet
 
Zitat:

Zitat von oki
Das Thema umrandung war so bei mir in 5 min abgehakt.

Dann bringe mal Beispiel. Wäre auch eine Möglichkeit.

Da es nur um das erstmalige Anzeigen der Form geht könnte man auch SetCursorPos usw. verwenden. Alles geht irgendwie. :P @Ingo : TShape hat mit einem Label kaum was zu tun und scheidet deshalb aus.

oki 14. Mär 2007 20:52

Re: Panel wird nicht richtig gezeichnet
 
Hi Hansa,


Zitat:

Zitat von Hansa
Zitat:

Zitat von oki
Das Thema umrandung war so bei mir in 5 min abgehakt.

Dann bringe mal Beispiel. Wäre auch eine Möglichkeit.

Hab ich oben zwar schon gemacht, aber weil du es bist hier noch mal:
Delphi-Quellcode:
  TMyPanel = class(TCustomPanel)  // oder CustomControl, je nach Geschmack
  private
    FDrawFrame: boolean;
    FFrameColor : TColor;                      // Farbe des Frame ändert sich bei Select
    FSelected: Boolean;
    procedure SetDrawFrame(const Value: boolean);
    procedure SetSelected(const Value: Boolean);
  protected
    procedure Paint; override;
    procedure DoEnter; override;
    procedure DoExit; override;
    property Selected : Boolean read FSelected write SetSelected;
  public
  published
    property DrawFrame : boolean read FDrawFrame write SetDrawFrame;
  end;


procedure TMyPanel.Paint;
var OldColor : TColor;
begin
  inherited Paint;
  IF FDrawFrame then begin
    // zur besseren Sichtbarkeit Rahmen um Komponente zeichnen
    Oldcolor := self.Canvas.Brush.Color;
    self.Canvas.Brush.Color := FFrameColor;
    self.Canvas.FrameRect(self.ClientRect);
    self.Canvas.Brush.Color := OldColor;
  end;
end;

procedure TMyPanel.SetSelected(const Value: Boolean);
begin
  FSelected := Value;
  IF FSelected then
    FFrameColor := clBlue
  else
    FFrameColor := clBlack;
  Invalidate;
end;

procedure TMyPanel.DoEnter;
begin
  Selected := True;
  inherited DoEnter;
end;

procedure TMyPanel.DoExit;
begin
  Selected := False;
  inherited DoExit;
end;

procedure TMyPanel.SetDrawFrame(const Value: boolean);
begin
  FDrawFrame := Value;
  Invalidate;
end;
Wenn ich jetzt nichts vergessen hab, dann wars das.
DrawFrame hab ich eingeführt, damit man im OI das Zeichnen auch abschalten kann. Der Rest erklärt sich eigentlich von selbst.

Gruß oki

edit: Schreibfehler beseitigt

Hansa 14. Mär 2007 23:13

Re: Panel wird nicht richtig gezeichnet
 
Thx, Oki. Bei dem Umfang, den das Ganze jetzt hat, wäre tatsächlich eine Komponente in Betracht zu ziehen. Muss mal gucken. Allerdings wird das wenn schon dann von TPanel abgeleitet.

oki 15. Mär 2007 06:09

Re: Panel wird nicht richtig gezeichnet
 
Hi Hansa,
Zitat:

Zitat von Hansa
Allerdings wird das wenn schon dann von TPanel abgeleitet.

je nach Geschmack.

Ich leite immer gerne von den Vorfahren ab, dann kann ich entscheiden welche Eigenschaften published sind.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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