Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen (https://www.delphipraxis.net/203867-stringgrid-ueber-den-rand-z-b-einer-groupbox-hinweg-anzeigen.html)

norwegen60 1. Apr 2020 23:14

StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Hallo zusammen

Ich möchte in bestimmten Fällen ein Stringgrid anzeigen, das z.B. in einer GroupBox liegt. Das Stringgrid soll aber ähnlich wie eine ausgeklappte ComboBox nicht durch den Rand der GroupBox eingegrenzt werden. Gibt es da eine Möglichkeit?

Ich kann das StringGrid natürlich auch auf das Form legen und ganz nach vorne bringen. Dann wäre aber die Positionierung relative zu einem Control in der GroupBox das Problem. Die GroupBox kann auch noch ein paar Ebenen über dem Form liegen.

Hat jemand eine Idee wie das am Einfachsten geht

Danke
Gerd

himitsu 2. Apr 2020 00:12

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
in FMX ja
ohne Cutting wird da nichts begrenzt
und dann gibt es da auch noch TPopup, wo man was reinmachen kann und dass sich dann, wie ein PopupMenü/DropdownMenü freifliegend über der Form öffnen lässt.

in VCL nein
ABER, wenn das Grid nicht in der GroupBox liegt, sondern ebenfalls auf einem der Parents der GroupBox (inkl. der Form) und wenn es in der Erstellungsreihenfolge als Letztes, also über allem Anderen, dann .....

hoika 2. Apr 2020 04:43

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Hall,
du könntest in dem Fall ja den Parent des Grids auf der Groupbox setzen.

norwegen60 2. Apr 2020 08:17

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Zitat:

Zitat von himitsu (Beitrag 1461044)
in VCL nein
ABER, wenn das Grid nicht in der GroupBox liegt, sondern ebenfalls auf einem der Parents der GroupBox (inkl. der Form) und wenn es in der Erstellungsreihenfolge als Letztes, also über allem Anderen, dann .....

Es ist VCL.
Nein: Schade. Da es beim Pulldown einer ComboBox ja auch geht hatte ich gehofft es gäbe eine Eigenschaft

Das mit dem Parent hatte ich ja selber geschrieben. Wie ermittle ich dann aber die Position relativ zu einer Componente in der GroupBox.
So sieht die "bittere" Realität aus
  1. StringGrid1 soll am linken Rand direkt unter Edit1 sichbar werden sobald Edit1 den Focus hat
  2. Edit1 liegt nahe am unteren Rand von GroupBox1
  3. GroupBox1 liegt alBottom auf Panel1
  4. Panel1 liegt alBottom auf GroupBox2
  5. GroupBox2 liegt alClient in Tabsheet1
  6. Tabsheet1 liegt in PageControl1
  7. PageControl1 liegt irgendwo in GroupBox2 und hätte zum ersten mal unten Platz
d.h. damit StringGrid1 nicht nach unten beschränkt wäre, müsste es auf Form1 oder GroupBox2 liegen

Wie bekomme ich möglichst einfach die Koordinaten von TEdit umgerechnet auf Form1 oder GroupBox2?

Geht das nur, indem ich durch alle Componenten gehe?

Und schlagt mich nicht für den "Wahnsinns" Aufbau. Den durfte ich übernehmen.

HolgerX 2. Apr 2020 10:36

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Hmm..

Alternativ ein (StayOnTop) Formular ohne Rand machen, dort das Grid drauf packen und dieses Fenster dann positionieren. Zur Anzeige natürlich Show und nicht ShowModal verwenden.

Über MouseMove kannst Du dann dieses Fenster verschieben.

Per z.B. Edit.ClientToScreen(Point(Edit.Left,Edit.Top)) kannst Du dann die untere linke Ecke des Edits angeben und erhälst die Position auf dem Bildschirm.

Dann nur dem Fenster des Grids als Top und Left die X/Y Koordinate geben und die Gridform hängt unter dem Edit.

Besser aber Du verwendest dann vielleicht ein MouseHook, da Du somit unabhängig vom unter der Maus liegenden Control direkt die Bildschirm MousePos erhälst.

norwegen60 2. Apr 2020 15:38

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Dann ist
Delphi-Quellcode:
StringGrid1.Left := PageControl1.Left + Tabsheet1.Left + GroupBox2.Left + Panel1.Left + GroupBox1.Left + Edit1 .Left;
doch einfacher.
Ich hatte darauf gehofft, dass es eine "einfache" Möglichkeit gibt die Positionen aus einem gemeinsamen Koordinatensystem zu holen

Grüße
Gerd

Uwe Raabe 2. Apr 2020 17:19

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Geht schon einfacher, solange StringGrid1.Parent auch in der ParentListe von Edit1 vorkommt.

Delphi-Quellcode:
var
  P: TPoint;
begin
  P := Edit1.ClientToParent(TPoint.Create(0, Edit1.Height), StringGrid1.Parent);
  StringGrid1.Left := P.X;
  StringGrid1.Top := P.Y;
  StringGrid1.BringToFront;
end;

norwegen60 2. Apr 2020 17:36

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Wow. Das hört sich doch gut an.

Zitat:

...solange StringGrid1.Parent auch in der ParentListe von Edit1 vorkommt...
Müsste doch immer erfüllt sein wenn Stringrid auf einem der Unter-Parents von Edit liegt, oder?

norwegen60 2. Apr 2020 17:49

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Es scheitert daran, dass er das TPoint.Create nicht erkennt "Unknown identifier"
Delphi-Quellcode:
 P := Edit1.ClientToParent(TPoint.Create(0, Edit1.Height), StringGrid1.Parent)
Ich verwende Delphi XE

Uwe Raabe 2. Apr 2020 18:09

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Zitat:

Zitat von norwegen60 (Beitrag 1461101)
Ich verwende Delphi XE

OK, das konnte ich anhand deines Profils nicht ahnen.

HolgerX 2. Apr 2020 19:09

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Hmm..

Bedenkt bitte, dass sich das Grid immer nur im Rahmen 'seines' Parent befinden kann.
Wenn somit das Edit oder die Groupbox sehr weit unten auf der Form sind und das Grid auf der selbern Form oder einem anderen Container (wie Panel) liegt, welcher ebenfalls auf der Form liegt, dann dürfte das Grid sehr klein sein ;)

Mit eigener Form kann diese über die Grenze der Form 'hinausgehen' auf dem die Groupbox liegt.
Sprich das gleiche Verhalten, was ein Popup-Menu hat.

Uwe Raabe 2. Apr 2020 19:36

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Zitat:

Zitat von HolgerX (Beitrag 1461107)
Mit eigener Form kann diese über die Grenze der Form 'hinausgehen' auf dem die Groupbox liegt.

In dem Fall lässt sich die Position des Forms sogar noch einfacher ermitteln:
Delphi-Quellcode:
var
  P: TPoint;
begin
  P := Edit1.ClientToScreen(Point(0, Edit1.Height));
  StringGrid1Form.Left := P.X;
  StringGrid1Form.Top := P.Y;
  StringGrid1Form.BringToFront;
end;

himitsu 2. Apr 2020 19:42

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Zitat:

Zitat von norwegen60 (Beitrag 1461053)
Nein: Schade. Da es beim Pulldown einer ComboBox ja auch geht hatte ich gehofft es gäbe eine Eigenschaft

Wie bei MainMenu und PopupMenu ist dieses DropDown ein eigenes Fenster, welches über deine Form gelegt wird.
So wie es auch TPopup im FMX macht. (zur DesignTime ein Panel und wird zur Laufzeit in ein Fenster verschoben)

Aber so lange die Komponente innerhalb des Forms liegt, muß man nur einen passenden Parent und die richtige Z-Position wählen.
Innerhalb einer Komponente/Form kann aber nichts über deren Rand hinaus ragen.

HolgerX 2. Apr 2020 20:25

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Hmm..

Zitat:

Zitat von Uwe Raabe (Beitrag 1461109)
Zitat:

Zitat von HolgerX (Beitrag 1461107)
Mit eigener Form kann diese über die Grenze der Form 'hinausgehen' auf dem die Groupbox liegt.

In dem Fall lässt sich die Position des Forms sogar noch einfacher ermitteln:
Delphi-Quellcode:
var
  P: TPoint;
begin
  P := Edit1.ClientToScreen(Point(0, Edit1.Height));
  StringGrid1Form.Left := P.X;
  StringGrid1Form.Top := P.Y;
  StringGrid1Form.BringToFront;
end;


So hatte ich das auch angedacht, nur mit der Erweiterung, dass das Grid nur angezeigt wird, wenn die Maus über dem Edit ist (deshalb MouseHook um das Verlassen des Edits zuverlässig zu erkennen ;) ) ansonsten würde das Grid ja immer auch alle anderen Fenster/Applikationen verdecken, wenn es OnTop ist ;)

norwegen60 3. Apr 2020 00:06

AW: StringGrid über den Rand z.B. einer GroupBox hinweg anzeigen
 
Vielen Dank. So klappt es einwandfrei


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

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