TShape anzeigen in Startformular
TShape anzeigen in Startformular
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
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
Re: TShape anzeigen in Startformular
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.
- 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
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
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
-
- 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
Das ist zwar offtopic hinsichtlich der ursprünglichen Frage, passt denke ich aber doch irgendwie hier herein:
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?
-
- 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
Eben habe ich noch nachgeschaut, auch ein TEdit veröffentlich kein OnPaint
- 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
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
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
- 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
Hi!
In den Tiefen meiner Festplatte hab ich den alten Trick gefunden,
wie man einem BitBtn eine farbige Fläche verpasst.
Winni
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
-
- 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
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
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.
-
- 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
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?
- 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
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
-
- 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
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
.
.
- 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
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
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
Re: TShape anzeigen in Startformular
Hallo an die ersten beiden Antworter
Das mit OnPaint funktioniert, besten Dank.
Uli Schoch
Das mit OnPaint funktioniert, besten Dank.
Uli Schoch