Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Aufrufendes Form und dessen Eigenschaften ermitteln
galagher - Fr 24.05.13 19:01
Titel: Aufrufendes Form und dessen Eigenschaften ermitteln
Hallo!
Wie kann ich bei einer nur zur Laufzeit sichtbaren Fenster-Komponente das aufrufende Form ermitteln? Ich brauche Zugriff auf dessen Eigenschaften Left, Top, Width, Height. Bei sichtbaren Komponenten wie TButton ist das ja kein Problem: Button1.Parent.Left;.
Konkret handelt es sich um eine "Balloon"-Komponente, die einfach ein Fenster ohne Titelleiste ist, abgerundete Ecken und optional einen "Sprechblasenpfeil" hat, ihr wisst, was ich meine. Jedenfalls ist das ein eigenes Form, und ich möchte es mittig in der aufrufenden Form positionieren. Wie bekomme ich die Eigenschaften der aufrufenden Form?
lg
galagher
//Edit: Ich habe den Quelltext der "Balloon"-Komponente, kann ihn also bearbeiten!
Palladin007 - Fr 24.05.13 19:31
Du kannst die überladene Methode ShowDialog verwenden, die einen optionalen Parameter Owner verlangt.
Dem übergibst du this und schon kennt deine Form den Aufrufer.
Allerdings wird die Form dann als Dialog geöffnet. Ich weiß grad nicht, ob die Methode Show auch diesen Parameter hat, glaube allerdings nicht.
Wenn dir das nicht passt, kannst du ja noch die aufrufende Form im Konstruktor verlangen, oder in einer Eigenschaft nach der Instanzierung und vor dem Aufruf fest legen.
galagher - Fr 24.05.13 19:44
Palladin007 hat folgendes geschrieben : |
Wenn dir das nicht passt, kannst du ja noch die aufrufende Form im Konstruktor verlangen, oder in einer Eigenschaft nach der Instanzierung und vor dem Aufruf fest legen. |
Daran habe ich schon gedacht, weiss aber nicht, wie zB. eine Property aussehen soll, die eine Form enthält, idealerweise zunächst die, auf der die Ballon-Komponente liegt. :nixweiss:
Weiss leider auch nicht, wie die aufrufende Form im Konstruktor zu verlangen ist. Sieht so aus:
constructor TBalloonControl.Create(AOwner: TComponent); Oder übersehe ich da etwas?
Palladin007 - Fr 24.05.13 19:57
Weißt du was?
Ich Blödmann bin schon wieder in den Delphi-Teil des Forums gerutscht, obwohl ich gar kein Delphi kann xD
Aber da das ja auch .NET-Framework nutzen kann, müsste das ja ähnlich sein, nur Quell-Code kann ich keinen zeigen.
Wegen der Eigenschaft:
Wenn sich die Daten, die du brauchst, nicht mehr ändern, kannst du ja auch einfach nur die an eine Eigenschaft geben, oder du baust einen extra kleinen Typ, der sie enthält.
Die ganze Form zu übergeben ist wahrscheinlich nur sinnvoll, wenn sich die Daten nachträglich ändern, denn dann hast du das Problem, dass int kein Referenz-Typ ist und sich dann nicht mit ändert.
Dann brauchst du die Form um die Daten neu abfragen zu können.
Wie die Eigenschaft aussieht, kann ich dir nicht sagen.
Aber wenn der Typ der einer Form ist (fals das anders heißt) und du die Egenschaft nach dem Instanzieren oder een mit Hilfe des Konstruktors definierst, dann ist das eigentlich wie bei jeder anderen Eigenschaft auch.
WasWeißDennIch - Fr 24.05.13 20:11
Suchst Du vielleicht
GetParentForm [
http://docwiki.embarcadero.com/Libraries/XE3/de/Vcl.Forms.GetParentForm]?
[edit] Sry, falsch verstanden, Du suchst ja nicht das eigene Formular. Wie wird der Hint denn aufgerufen? Gibt es da so etwas wie einen Sender-Parameter? Ansonsten wäre der Weg über die genannte Property auch denkbar.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TDeinBalloonHint = class(TElternklasse) private FCallingForm: TForm; ... public ... property CallingForm: TForm read FCallingForm write FCallingForm; end;
...
if Assigned(FCallingForm) then begin Left := FCallingForm.Left + (FCallingForm.Width - Width) div 2; Top := FCallingForm.Top + (FCallingForm.Height - Height) div 2; end; |
[/edit]
galagher - Fr 24.05.13 20:58
WasWeißDennIch hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TDeinBalloonHint = class(TElternklasse) private FCallingForm: TForm; ... public ... property CallingForm: TForm read FCallingForm write FCallingForm; end;
...
if Assigned(FCallingForm) then begin Left := FCallingForm.Left + (FCallingForm.Width - Width) div 2; Top := FCallingForm.Top + (FCallingForm.Height - Height) div 2; end; | [/edit] |
Dank deiner Hilfe habe ich es mit einigen Anpassungen hinbekommen!
property CallingForm habe ich weggelassen, da es nicht sinnvoll ist, den Wert zu ändern.
jaenicke - Fr 24.05.13 21:00
Sofern die Komponente auf dem Formular liegt, reicht es auch einfach den Owner zu nehmen.
galagher - Fr 24.05.13 21:33
jaenicke hat folgendes geschrieben : |
Sofern die Komponente auf dem Formular liegt, reicht es auch einfach den Owner zu nehmen. |
Ja, klappt mit
TForm(Owner);!
jaenicke - Fr 24.05.13 21:37
Ich würde aber vorher mit is testen, ob AOwner auch vom Typ TForm ist. Denn manuell erzeugt kann man auch etwas anderes als Owner zuweisen. (Oder zumindest solltest du mit as casten, damit man auch eine passende Fehlermeldung bekommt.)
galagher - Fr 24.05.13 21:44
jaenicke hat folgendes geschrieben : |
Ich würde aber vorher mit is testen, ob AOwner auch vom Typ TForm ist. |
Normalerweise ja, aber da sich die Komponente zur Designzeit sowieso nur auf der Parent-Form platzieren lässt (wie zB. auch TFontDialog), kann man darauf doch verzichten, oder?
jaenicke - Fr 24.05.13 23:22
Wie gesagt, wenn sie jemand manuell zur Laufzeit erzeugt, kann er als Owner nil oder ganz etwas anderes angeben.
galagher - Sa 25.05.13 07:03
jaenicke hat folgendes geschrieben : |
Wie gesagt, wenn sie jemand manuell zur Laufzeit erzeugt, kann er als Owner nil oder ganz etwas anderes angeben. |
Hm, ja...
Im Moment sieht das so aus:
FCallingForm := TForm(Owner); Was muss ich da ändern?
Gar nichts offenbar, das Anzeigen mittig in der Form funktioniert dann einfach nicht, wenn Owner nil ist, zB.
BalloonControl0 := TBalloonControl.Create(nil);, wohingegen
BalloonControl0 := TBalloonControl.Create(Form1); sehr wohl wie gewünscht mittig dargestellt wird.
jaenicke - Sa 25.05.13 07:25
Ich würde zumindest schreiben
(Owner as TForm) oder es besser richtig prüfen:
Delphi-Quelltext
1: 2:
| if Assigned(Owner) and (Owner is TForm) then ... |
WasWeißDennIch - Sa 25.05.13 09:23
Wäre da GetParentForm nicht doch die bessere Lösung?
jaenicke - Sa 25.05.13 10:12
Wenn TBalloonControl denn von TControl abgeleitet wäre, aber das bezweifle ich doch eher... ;-)
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!