TShape anzeigen in Startformular

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

TShape anzeigen in Startformular

Beitrag von USchoch »

Hallo
In einer Anwendung habe ich im Startformular eine TShape-Komponente. Auf diese sollen beim Start der Anwendung einige Linien und Kreise angezeigt werden. Ich rufe im Ereignis OnActivate des Formulars die Procedure "Anzeigen" auf, welche die Linien und Kreise anzeigt. Diese werden aber nicht angezeigt. Wenn ich in der Procedure "Anzeigen" einen Breakpoint setze, so stoppt das Programm dort. Also wird die Procedure ausgeführt, aber eben nichts angezeigt. Warum wohl? Wenn ich mit einem Button die Procedure aufrufe, funktioniert die Anzeige

Gruss
Uli

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: TShape anzeigen in Startformular

Beitrag von wp_xyz »

USchoch hat geschrieben:
Di 15. Dez 2020, 17:00
Wenn ich mit einem Button die Procedure aufrufe, funktioniert die Anzeige
Auch das bezweifle ich. Mach das mal und schiebe ein anderes Fenster zur Hälfte darüber und dann wieder weg. Ich vermute, dass dan plötzlich die Hälfte deiner Ausgabe wegradiert ist.

Wenn du auf dem Canvas eines Control, bei dir einem TShape, selbst etwas zeichnen willst, musst du immer im Kopf haben, dass dein Betriebssystem zu jedem Zeitpunkt verlangen kann, dass das control neu gezeichnet werden muss, zum Beispiel eben, weil der Benutzer ein anderes Fenster über das Control bewegt. Wenn du aber den Code zum Zeichnen nur mit einem ButtonClick ausführst, "weiß" das Control nicht, wie es sich neu zeichnen kann. Der richtige Ort ist immer das OnPaint-Ereignis des Controls; das wird ausgerufen, wenn das Betriebssystem eine erneute Ausgabe verlangt. Also rufe "Anzeigen()" im OnPaint-Ereignis des TShape auf, dann sollte es funktionieren.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TShape anzeigen in Startformular

Beitrag von Winni »

Hi!

Fausformel:

Alle graphischen Elemente haben eine flüchtige Anzeige und müssen im OnPaint event neu gezeichnet werden

Beispiel: PaintBox, Shape

AUSSER:

Die Komponenten die eine Bitmap besitzen. Die Bitmap kümmert sich um sich selbst

Beispiel: Image, SpeedButton

Winni

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: TShape anzeigen in Startformular

Beitrag von braunbär »

Das ist zwar offtopic hinsichtlich der ursprünglichen Frage, passt denke ich aber doch irgendwie hier herein:
wp_xyz hat geschrieben:
Di 15. Dez 2020, 17:22
Der richtige Ort ist immer das OnPaint-Ereignis des Controls; das wird ausgerufen, wenn das Betriebssystem eine erneute Ausgabe verlangt. Also rufe "Anzeigen()" im OnPaint-Ereignis des TShape auf, dann sollte es funktionieren.
Das habe ich bis jetzt auch gedacht. Aber im Moment suche ich aber beim TButton und beim TBitBtn vergeblich ein OnPaint. Wie funktioniert das eigentlich bei diesen Button-Komponenten?

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: TShape anzeigen in Startformular

Beitrag von braunbär »

Eben habe ich noch nachgeschaut, auch ein TEdit veröffentlich kein OnPaint

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TShape anzeigen in Startformular

Beitrag von Winni »

Hi!

TButton und TBitbutton werden vom Betriebssystem gezeichnet.
Das reicht Lazarus nur zum jeweiligen widgetset durch.
Es gibt ein paar wüste Tricks zum Malen, aber die sind nicht sehr schön.

Das gleiche gilt für TEdit.

Außerdem redete ich von grafischen Komponenten.

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TShape anzeigen in Startformular

Beitrag von Winni »

Hi!

In den Tiefen meiner Festplatte hab ich den alten Trick gefunden,
wie man einem BitBtn eine farbige Fläche verpasst.

Code: Alles auswählen

// quick hack to make TBitBtn to colored button
procedure Bitinit(B : TBitBtn);
var R : Trect;
   cap: string;
   dx,dy : integer;
   P: Pstring;
begin
 if B.Caption <> '' then
   begin
     cap := B.Caption;
     B.Tag := PtrInt(@cap);
     B.Caption := '';
   end else // already done
   begin
     P := Pointer(B.Tag);
     if B.Tag <> 0 then cap := P^ else cap := '???';
   end;

 B.glyph.SetSize(B.width,B.height);
 R := GetRect(B);
 B.Glyph.Canvas.brush.Color := B.Color;
 B.Glyph.Canvas.FillRect(R);

 B.Glyph.Canvas.Font := B.Font;
 dx := (B.glyph.Width - B.Glyph.Canvas.TextWidth(cap)) div 2;
 dy := (B.glyph.Height - B.Glyph.Canvas.TextHeight(cap)) div 2;
 B.Glyph.Canvas.TextOut(dx,dy,cap);
 end;

Winni

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: TShape anzeigen in Startformular

Beitrag von braunbär »

Naja, das Problem ist aber hier doch auch, dass du im Laufe des Programmlaufs nicht erfährst, wann du Bitinit aufrufen musst.
Weil wenn sich das Betriebssystem um das Zeichnen kümmert, dann wird es von Bitinit nichts wissen.

Faszinierend, dass TBitBtn eine property TBitBtn.color hat, die anscheinend nichts tut, genausowenig wie TBitBtn.Font.Color :)
Zuletzt geändert von braunbär am Di 15. Dez 2020, 20:41, insgesamt 2-mal geändert.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: TShape anzeigen in Startformular

Beitrag von braunbär »

Winni hat geschrieben:
Di 15. Dez 2020, 18:58
Außerdem redete ich von grafischen Komponenten.
Naj, so viel "graphischer" als TButton hätte ich TPanel a priori nicht eingestuft. Aber klar, wenn das Betriebssystem alles macht, dann gibts eben kein OnPaint.
Wenn man einen Button mit speziellm Aussehen will, wird man den wohl am besten von TPanel ableiten und selber zeichnen?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TShape anzeigen in Startformular

Beitrag von Winni »

braunbär hat geschrieben:
Di 15. Dez 2020, 20:22
Naja, das Problem ist aber hier doch auch, dass du im Laufe des Programmlaufs nicht erfährst, wann du Bitinit aufrufen musst.
Weil wenn sich das Betriebssystem um das Zeichnen kümmert, dann wird es von Bitinit nichts wissen.
Hallol!

Na, so etwas wie BitInit gehört - wie jeder weiss - in FormCreate.

Also hast Du den Code nicht verstanden.
Lieber mal ausprobieren, bevor Du Fake-News verbreitest.

Winni

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: TShape anzeigen in Startformular

Beitrag von braunbär »

Hab mir das jetzt nochmal genauer angeschaut. Ja, für einfache Fälle funktioniert das, ist aber trotzdem mit Vorsicht zu genießen. Eine Änderung der Caption zur Laufzeit wird der Button wahrscheinlich nicht ganz optimal umsetzen :)
.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TShape anzeigen in Startformular

Beitrag von Winni »

Hi!

Was ist da mit Vorsicht zu geniessen??
Der Code hat schon mit Delphi 1 mit 16 Bit gefunzt.
Und hat nie gemuckt.

Wenn Du die Caption änderst, dann musst Du danach natürlich BitInit aufrufen.
Aus dem Code ersehbar.

Winni

USchoch
Beiträge: 26
Registriert: Do 16. Mär 2017, 14:01

Re: TShape anzeigen in Startformular

Beitrag von USchoch »

Hallo an die ersten beiden Antworter

Das mit OnPaint funktioniert, besten Dank.

Uli Schoch

Antworten