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

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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... ;-)