Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Caption bei TCustomPanel
Peter18 - Mo 21.03.16 18:05
Titel: Caption bei TCustomPanel
Ein freundliches Hallo an alle,
ich wollte ein Panel erstellen, das über weitere Properties und Objekte zur Fortschrittsanzeige verfügt. Da zur Ableitung von Komponenten die "Custom"-Componenten empfohlen werden habe ich "TCustomPanel" gewählt. Vor allem auch, weil hier nichts von "Caption" in der Hilfe angegeben ist! Zu meiner Überraschung tauchte aber eine entsprechende Anzeige im Panel auf. Zwar setze ich im Constructor >>Caption := '' ;<<, was dazu führt, dass nach dem ersten Erstellen ein Text angezeigt wird, der aber beim Neuaufbau des Formulars nicht mehr erscheint. Im Objektinspektor erscheint "Caption" auch nicht.
Da "CustomPanel.Caption" im Formular zentriert erscheint habe ich eine weiter rechts stehende Textanzeige, die ich gern verwenden würde. Es müsste doch möglich sein "CustomPanel.Caption" auf diese Anzeige umzuleiten. Für Tipps wäre ich dankbar!
Und noch eine Frage: Ich habe die Tage sehr viel experementiert und eine Reihe ähnlicher Komponenten erzeugt und registriert. Muss ich, wenn ich diesen Schrott wieder lös werden will, "unregister" verwenden oder genügt es die Objekte in der Objektgalerie mit [DEL] zu entfernen? Wär ja schön, wenn dann auch die Registry geputzt würde.
Grüße von der etwas sonnigen Nordsee
Peter
CCRDude - Di 22.03.16 10:06
Caption erbt TCustomPanel von TControl. Dort nachgeschaut hat die Property Caption einen Getter namens GetText und einen Setter namens SetText. Diese sind leider private.
In Lazarus verwenden diese wiederum RealGetText und RealSetText, die protected sind und somit in einem eigenen TCustomPanel überschrieben werden können mit eigenen Handlern.
In Delphi müsste wohl CM_TEXTCHANGED überschrieben werden, um auf Neuzuweisungen von Caption zu reagieren. Ggfls. kombiniert mit ShowCaption = false.
Als Empfehlung zum Testen: Komponenten während der Testphase dynamisch erzeugen, erspart Zeit :) Zum Aufräumen kann ich leider nichts sagen, ich habe alle meine Komponenten aus diesem Grund dynamisch (und verwende zudem fast nur noch Lazarus).
Peter18 - Di 22.03.16 11:54
Hallo CCRDude,
danke Dir für Deine Antwort! Hört sich so an, als hätte da jemand nicht aufgepasst. Ist auch kein großes Drama, wär nur schön gewesen, wenn alles sauber ist. "ShowCaption" werde ich mal ausprobieren.
Habe
Delphi-Quelltext
1:
| inherited ShowCaption := false; |
ausprobiert, und es wurde angemeckert.
Kannst Du mir ein Beispiel geben, wie "CM_TEXTCHANGED" aussehen muß?
Vielleicht hast Du auch einen Link, wo die Lazarus VCL-Komponenten zu finden sind, am besten ohne sie installieren zu müssen. ( Dort gib es viel, aber noch habe ich die VCL-Komponenten nicht gefunden. )
Meine Komponenten habe ich bisher auch immer dynamisch erzeugt, diese Variante wollte ich mal ausprobieren. Caption hat warscheinlich bei dem "Schrott" zu Problemen geführt. Besser hier als in einem Projekt.
Wenn niemand einen Tipp hat muß ich mal die Registry durchstöbern und das Ganze austesten.
Grüße von der etwas regnerischen Nordsee
Peter
CCRDude - Di 22.03.16 13:43
Hmmm... so grob geraten:
Delphi-Quelltext
1: 2: 3: 4: 5:
| type TMyPanel = class(TCustomPanel) private procedure MyTextChanged(var Message: TMessage); message CM_TEXTCHANGED; end; |
Diese Prozedur sollte bei jeder Textänderung aufgerufen werden, schließe ich aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TControl.SetText(const Value: TCaption); begin if GetText <> Value then {$IF DEFINED(CLR)} begin FText := Value; Perform(CM_TEXTCHANGED, 0, 0); end; {$ELSE} SetTextBuf(PChar(Value)); {$IFEND} end; |
Wobei das Delphi XE ist, am besten prüfst Du in Deiner Delphi-Version, wie genau TControl.SetText dort implementiert ist.
Die VCL heißt unter Lazarus LCL, ist aber ziemlich kompatibel. TControl befindet sich in der
control.inc [
http://svn.freepascal.org/svn/lazarus/trunk/lcl/include/control.inc] (der Rest lässt sich auch per Browser finden -
repository [
http://svn.freepascal.org/svn/lazarus/trunk/lcl/]).
Peter18 - Di 22.03.16 15:07
Hallo CCRDude,
Dank Dir nochmals. Leider sind in meiner Delphi-Version nur wenige Quellen enthalten, daher kann ich nicht nachsehen, wie das Eine oder Andere gelöst wurde.
Hast Du auch ein Beispiel für den Inhalt von "MyTextChanged". Da fehlt mir im Moment auch jede Vorstellung. Meine Quelldateien geben zu dem Thema auch nichts her.
Bei Lazarus habe ich nun aber auch viel zu lesen. Vielleicht hilft es in dem einen oder anderen Fall ja weiter. Dank Dir!
Grüße von der jetzt sonnigen Nordsee
Peter
Peter18 - Di 22.03.16 18:35
Ein freundliches Hallo an alle,
es geht doch etwas einfacher als gedacht. Man muß nur auf die richtige Idee kommen!
Mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| public constructor Create( Owner: TComponent ); override; destructor Destroy; override; procedure Paint; override; |
und
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TPPanel.Paint; begin if inherited Caption <> '' then begin oLbl.Caption := inherited Caption; inherited Caption := '' ; end; inherited; Canvas.Pen.Color := clRed ; Canvas.Rectangle( 2, 2, 193, 19 ); end; |
ist die Kuh vom Eis.
Grüße von der noch immer sonnigen Nordsee
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!