Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 24.05.13 19:01 
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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Fr 24.05.13 20:11 
Suchst Du vielleicht 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.
ausblenden 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]

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 24.05.13 20:58 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.05.13 21:00 
Sofern die Komponente auf dem Formular liegt, reicht es auch einfach den Owner zu nehmen.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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);!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.05.13 07:25 
Ich würde zumindest schreiben (Owner as TForm) oder es besser richtig prüfen:
ausblenden Delphi-Quelltext
1:
2:
if Assigned(Owner) and (Owner is TForm) then
...

Für diesen Beitrag haben gedankt: galagher
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Sa 25.05.13 09:23 
Wäre da GetParentForm nicht doch die bessere Lösung?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.05.13 10:12 
Wenn TBalloonControl denn von TControl abgeleitet wäre, aber das bezweifle ich doch eher... ;-)