Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Eigene Componente schreibt als TWinControl inandere Property
Peter18 - Sa 13.08.11 13:45
Titel: Eigene Componente schreibt als TWinControl inandere Property
Ein freundliches Hallo an alle,
ich habe eine Komponente von TEdit abgeleitet und ein Label hinzugefügt. Wenn ich diese Komponente dann per Drag&Drop bewege, nehme ich sie als TWinControl und setze "Top" und "Left" neu. Dann werden jedoch nicht meine Property-Routinen aufgerufen, sondern andere von TWinControl. (Work around: T_Edit(Sender).Top funktioniert, ist aber unschön)
Gibt es eine Möglichkeit von TEdit abzuleiten und die TWinControl-Routinen zu überschreiben oder muß ich von TWinControl ableiten??
Danke im Voraus
Peter
jaenicke - Sa 13.08.11 13:53
Du hast aber SetBounds überschrieben um die Änderungen mitzubekommen?
// EDIT:
Siehe Quelltext von TWinControl:
Delphi-Quelltext
1: 2:
| public procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; |
Peter18 - Sa 13.08.11 14:21
Hallo jaenicke,
Danke für Deine Antwort. "SetBounds" habe ich nicht überschrieben. Wann wird sie denn aufgerufen?
Grüße Peter
jaenicke - Sa 13.08.11 14:25
Immer, wenn Top, Left, Width oder Height geändert wird. Ich sehe aber gerade, das du noch ein aktikes Delphi hast, da gab es das vielleicht noch nicht. Da musst du mal schauen was beim Setzen der Eigenschaft in TWinControl passiert. :nixweiss:
Bei mir in XE sieht das so aus:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TControl.SetTop(Value: Integer); begin SetBounds(FLeft, Value, FWidth, FHeight); [...] end; |
Peter18 - Sa 13.08.11 14:36
Hallo jaenicke,
noch mal Danke für die schnelle Antwort.
Ich habe die Komponente von TEdit abgeleitet. Wie komme ich den dann an "TWinControl" heran?
Delphi-Quelltext
1: 2:
| type T_Edit = class(TEdit) |
Grüße Peter
jaenicke - Sa 13.08.11 15:02
Habe ich doch schon geschrieben, einfach überschreiben.
Delphi-Quelltext
1: 2: 3: 4:
| TExtendedEdit = class(TEdit) public procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; end; |
Das funktioniert auch schon in Delphi 3 so.
Peter18 - Sa 13.08.11 15:24
Hallo jaenicke,
danke, hatte es auch probiert, aber dummer Weise unter "private" eingetragen.
Nun bekomme ich aber einen Stacküberlauf, weil Die Routine beim setzen der Werte auch aufgerufen wird.
Was mache ich falsch??
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure T_Edit.Setbounds(ALeft, ATop, AWidth, AHeight: Integer); begin if ATop >= 16 then begin inherited Top := ATop; Lbl.Top := ATop -16; end; inherited Left := ALeft; Lbl.Left := ALeft; inherited Width := AWidth; inherited Height := AHeight; end; |
Grüße Peter
jaenicke - Sa 13.08.11 15:26
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure T_Edit.Setbounds(ALeft, ATop, AWidth, AHeight: Integer); begin inherited; if ATop >= 16 then Lbl.Top := ATop -16; Lbl.Left := ALeft; end; |
// EDIT:
Sieht ja fast aus als ob du dir das TLabeledEdit von Delphi 7+ nachbauen willst. :mrgreen:
Was machst du denn mit Lbl.Top, wenn ATop < 16? Undefiniert? :D
Peter18 - Sa 13.08.11 17:36
Hallo jaenicke,
kann sein. Es soll ein TEdit mit Label sein. Die Abfrage ist zum Testen erst mal "hart verdratet" später wird es genauer geprüft und sichergestellt, dass das Objekt nicht über Parent hinausgeht (wenn möglich).
Hatte noch ein paar Schwierigkeiten mit dem rekursiven Aufruf, das Ding hat sich verkrümelt, weil bei T_Edit.Top=0 Label.Top=0 sein soll und Edit.Top=16. Aber nun funktioniert es, Danke!!
Grüße 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!