Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Position eines geschachtelten TControl direkt im Verhältnis zur Form (https://www.delphipraxis.net/175571-position-eines-geschachtelten-tcontrol-direkt-im-verhaeltnis-zur-form.html)

Der schöne Günther 1. Jul 2013 17:54

Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Puh, was für ein komplizierter Titel.

Die Frage ist allerdings simpel: Wenn irgendein
Delphi-Quellcode:
TControl
(z.B. ein Button) in einem
Delphi-Quellcode:
TPanel
steckt liefern die Properties
Delphi-Quellcode:
Left
und
Delphi-Quellcode:
Top
ja die Koordinaten im Verhältnis zum übergeordneten
Delphi-Quellcode:
TPanel
. Jetzt würde ich allerdings gerne wissen, welche Koordinaten der
Delphi-Quellcode:
TButton
direkt auf der Form hat.

Klar, ich kann wiederum einfach die Koordinaten des Panels addieren, aber was, wenn das Panel wieder in etwas drinsteckt? Natürlich kann ich mir jetzt einfach etwas basteln das sich immer den Parent anschaut und die Koordinaten solange aufaddiert, bis es kein Parent mehr gibt bzw. das angeschaute Objekt letztendlich die Form selbst ist. Aber da gibt es doch bestimmt etwas fertiges und ich sehe es nicht?

Aviator 1. Jul 2013 18:12

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Ich hab mir die beiden Funktionen letztens selbst geschrieben um das Problem zu lösen. Durchlaufe einfach rekursiv nach oben, bis der Parent eine TForm ist. Obs jetzt der beste Weg ist weiß ich nicht, aber es hat seinen Zweck erfüllt.

Delphi-Quellcode:
function GetCompleteHeight(ChildComponent: TWinControl): Integer;
begin
  if (ChildComponent.HasParent AND (ChildComponent.Parent.ClassType <> TForm)) then
    Result := GetCompleteHeight(ChildComponent.Parent) + ChildComponent.Top
  else Result := 0;
end;

function GetCompleteLeftPos(ChildComponent: TWinControl): Integer;
begin
  if (ChildComponent.HasParent AND (ChildComponent.Parent.ClassType <> TForm)) then
    Result := GetCompleteLeftPos(ChildComponent.Parent) + ChildComponent.Left
  else Result := 0;
end;

stahli 1. Jul 2013 19:52

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Vielleicht auch ClientToScreen und dann die Position des Formulars abziehen...?
Könnte aber Probleme mit dem Rahmen geben.

Insofern ist eine Funktion wie von Aviator sicher geschickter.

jaenicke 1. Jul 2013 20:14

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Zitat:

Zitat von stahli (Beitrag 1220332)
Vielleicht auch ClientToScreen und dann die Position des Formulars abziehen...?
Könnte aber Probleme mit dem Rahmen geben.

Da gibts keine Probleme mit dem Rahmen:
Delphi-Quellcode:
// ClientToScreen bezogen auf den Parent und ScreenToClient bezogen auf das Formular, fertig
Self.ScreenToClient(MyControl.Parent.ClientToScreen(MyControl.BoundsRect.TopLeft))

Uwe Raabe 1. Jul 2013 23:05

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Warum nicht gleich ClientToParent?

stahli 1. Jul 2013 23:15

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
:thumb:

[OT]Jetzt wollte ich Dir gerade mal einen kleinen Lapsus unterstellen und siehe da... mannooo ... man kann ja das Formular als Parent angeben... :duck: :wink:[/OT]

Der schöne Günther 2. Jul 2013 09:05

AW: Position eines geschachtelten TControl direkt im Verhältnis zur Form
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1220342)
Warum nicht gleich ClientToParent?

Großartig, genau das! Ich hatte irgendwie übersehen, dass man mittels zweitem Parameter den Parent gezielt angeben konnte.

Aber auch die anderen Vorschläge sind super, Danke auch hier :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz