Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 21.03.16 18:05 
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
Hält's aus hier
Beiträge: 5
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ausblenden 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
Hält's aus hier
Beiträge: 5
Erhaltene Danke: 2



BeitragVerfasst: Di 22.03.16 13:43 
Hmmm... so grob geraten:

ausblenden 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:
ausblenden 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, 00);
  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 (der Rest lässt sich auch per Browser finden - repository).

Für diesen Beitrag haben gedankt: Peter18
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  public
    { Public-Deklarationen }
    constructor Create( Owner: TComponent );                           override;
    destructor  Destroy;                                               override;
    // Methoden
    procedure Paint;                                                   override;

und
ausblenden 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( 2219319 );
end;

ist die Kuh vom Eis.

Grüße von der noch immer sonnigen Nordsee

Peter
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Fr 25.03.16 13:54