TGraphicControl -> Ableitung neuer Komponeneten

Rund um die LCL und andere Komponenten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

TGraphicControl -> Ableitung neuer Komponeneten

Beitrag von af0815 »

Ich arbeite derzeit mit Komponenten von Jim Cooper (diagramming classes), die sind mittlerweile auch in der Jedi (unter Beispiele) drinnen.

Dort werden die Komponenten, weil sie grafisch sind, von TGraphicControl abgeleitet. Bis jetzt bin ich da auf einige liebe Eigenschaften drauf gekommen :cry: :shock:

*) Wenn keine Höhe und/oder Breite gesetzt, dann funktioniert die Vererbung von 'paint' nicht -> so als würde das virtual/override fehlen !!

*) Der Canvas ist nur so groß wie die Komponente, alles andere wird nicht gezeichnet -> also clipping auf die eigene Region.


Gibt es noch so Informationen zu TGraphicControl ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich glaube das diese Komponente irgenwie keine Tastertur Ereignise verarbeiten kann oder ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TGraphicControl -> Ableitung neuer Komponeneten

Beitrag von theo »

af0815 hat geschrieben: :cry: :shock:


Ich kann deine Entrüstung nicht nachvollziehen.

Was soll denn gemalt werden, wenn es keine Grösse hat?
Wohin sonst als in den eigenen Bereich soll denn gemalt werden?


:roll:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Ich kann deine Entrüstung nicht nachvollziehen.

Nicht Entrüstung sondern Überraschung. Denn wenn das Ding keine Ausdehnung hat, so habe ich erwartet, das die Vererbung funktioniert. Denn nur den 'paint' von TObject aufzurufen und nicht die richtige, ist schon ein bischen stark. Was ich im paint mache (vielleicht die größße prüfen und gegebenfalls ändern) ist einmal egal. Ich habe ja so nicht einmal die Chance sowas zu checken. Und was ist, wenn ich dann im paint am Canvas des Parents etwas machen will ?!

@pluto: Das ist nicht unüberwindlich :-) Dafür hat sie fast keinen Overhead.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

af0815 hat geschrieben: so habe ich erwartet, das die Vererbung funktioniert.

Naja, die "Vererbung" wird wohl schon funzen, bloss Paint wird halt nicht aufgerufen, wieso auch?


af0815 hat geschrieben:Was ich im paint mache (vielleicht die größße prüfen und gegebenfalls ändern) ist einmal egal. Ich habe ja so nicht einmal die Chance sowas zu checken. Und was ist, wenn ich dann im paint am Canvas des Parents etwas machen will ?!


Ich will nicht ausschliessen, dass ich einfach nicht verstehe was du machen willst, aber
für mich klingt das alles ein bisschen verworren und nach Holzweg.
Nimm doch die dafür geeigneten Events wie OnResize, OnChangeBounds etc..

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Was möchtes du denn in einem onPaint Ereignis prüfen ?
dort wird eigentlich nur gezeichnet oder sehe ich das falsch ?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

@theo
af0815 hat folgendes geschrieben:

so habe ich erwartet, das die Vererbung funktioniert.

Naja, die "Vererbung" wird wohl schon funzen, bloss Paint wird halt nicht aufgerufen, wieso auch?


Eben NICHT, es wird definitiv das falsche Paint aufgerufen. Wenn keines aufgerufen worden wäre, so hätte ich es noch verstanden, nur die Vererbung sterben zu lassen und nur Paint des TObject aufzurufen, ist mir zu steil.

@pluto
Meistens die Daten, mit denen ich zeichnen will, prüfe ich. Und 'divisions by zero' sind ziemlich lästig, wennst du vielleicht skalierst.

@all
Ok, es hat sich also noch niemand wirklich mit TGraphicControl beschäftigt und meine Frage war ja lediglich, ob wer noch Informationen hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

af0815 hat geschrieben:Eben NICHT, es wird definitiv das falsche Paint aufgerufen. Wenn keines aufgerufen worden wäre, so hätte ich es noch verstanden, nur die Vererbung sterben zu lassen und nur Paint des TObject aufzurufen, ist mir zu steil.


Wie soll denn das gehen? Wie hast du das "festgestellt"?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

dann hast du evlt. in deinem abgeleitet klasse die methode nicht mit override gegenzeichnet !
Wenn du der meinung bis die falsche Methode aufgerufen wird !
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wie soll denn das gehen? Wie hast du das "festgestellt"?

ich vertrau af jetzt einfach mal und sag: "per debugger ?"

dann hast du evlt. in deinem abgeleitet klasse die methode nicht mit override gegenzeichnet !


siehe senf dazugeben im anderen thread. wenn er die methode nicht mit override gekennzeichnet hätte wär der code nicht compilierbar gewesen

@af0815
wenn du dir sicher bist, -> bugreport denk der dürfte in ner woche erledigt sein nach meinen erfahrungen zumal die 0.9.22 bald raus ist und alles an gravierenden fehler in pre 0.9.22 geschoben wird jetzt. denk die 0.9.22 wird sehr schön und stabil
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wie soll denn das gehen? Wie hast du das "festgestellt"?
Christian hat geschrieben:ich vertrau af jetzt einfach mal und sag: "per debugger ?"


Dann erklär mir doch bitte mal Teil 1 der Frage. Wie kann man die "Vererbung sterben lassen" aufgrund von Werten die zur Laufzeit gesetzt werden?
Das würde mich ernsthaft interessieren.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

@Christian
Du hast recht, mit dem debugger, ich hatte sogar in jeder von mir in der Vererbung angelegten Klasse die Breakpoints (in paint) sitzen, bzw. habe paint explizit aufgerufen und getraced.

@theo
Ich glaube nicht, das das Verhalten ein Bug ist. Da hat der Compiler/Linker eventuell schon recht. NUR DAS VERHALTEN IST NICHT DOKUMENTIERT.

Das kann dir bei anderen Komponenten auch ganz schön Ärger machen. Ich habe auf der Mailingliste dann auch schon sehen müssen mit der TGraphicControl, das die spärliche Doku erst an das eigentümliche Verhalten bezüglich Canvas angepasst wurde.

Ist/war lehrreich
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Wenn man aber richtig mit override überschrieben hat, dann sollte man in der Paint-Methode regelmäßig auch ein inherited loslassen, sonst ist die Vorgänger-Methode nämlich wirklich und endgültig "überschrieben" was ja auch durch "override" ausgesagt wird.

Vielleicht hapert's an dem inherited, obwohl das manchmal etwas lästig ist damit zu arbeiten.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

af0815 hat geschrieben:Ich glaube nicht, das das Verhalten ein Bug ist. Da hat der Compiler/Linker eventuell schon recht. NUR DAS VERHALTEN IST NICHT DOKUMENTIERT.


Naja, man hat aber die Sourcen ;-)

Ich würde mal tippen, dass dein "Hund" hier begraben liegt:

wincontrol.inc Line 3021

Code: Alles auswählen

procedure TWinControl.PaintControls(DC: HDC; First: TControl);

dort wird doch einfach

Code: Alles auswählen

RectVisible(DC, Rect(Left, Top, Left + Width, Top + Height)

niemals true wenn das Rect keine Dimensionen hat und somit auch

Code: Alles auswählen

Perform(LM_PAINT, WParam(DC), 0);

nie aufgerufen und somit wird auch das nicht ausgeführt:

Code: Alles auswählen

procedure TGraphicControl.WMPaint(var Message: TLMPaint);

und damit auch:

Code: Alles auswählen

procedure TGraphicControl.Paint;

nicht.
Alles ganz normal und kein Vererbungs-Voodoo, oder?

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

@theo

Sichert es aber nicht auch die Parent-Methode ab, das bei Aufruf von inherited trotzdem im Parent ausgeführt auch wenn die HxB-Dimension gleich 0 wird?

Zumindest müßte er dann im Debugger den Aufruf hinkriegen und nachvollziehen können warum das nicht geht.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten