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 Mainform VertScrollbaran MDI anpassen (https://www.delphipraxis.net/57220-mainform-vertscrollbaran-mdi-anpassen.html)

jaikai 17. Nov 2005 12:46


Mainform VertScrollbaran MDI anpassen
 
Hi Leute,

Da liegen x MDI-Childs untereinander, verdeckt von einer Eingabemaske, die VertScrollbar erscheint und ich will, daß das passende MDI-Child(wird ausgelesen)immer ganz oben sichtbar wird.

Wie kann ich runtime die VertScrollbar.Position an das Top des MDI-Childs anpassen. Ich will aber auch nicht den Top des MDI-Childs ändern, die bestehende Anodnung muß bleiben!

Gescheiterte Versuche:
With Mainform.VertScrollbar do Position := i;
Mainform.ScrollBy(0, i);
SendMessage(Mainform.Handle, WM_VSCROLL, SB_THUMBPOSITION, i);


Danke

negaH 17. Nov 2005 12:49

Re: Mainform VertScrollbaran MDI anpassen
 
schon mal

Delphi-Quellcode:
SendMessage(Mainform.ClientHandle, WM_VSCROLL, SB_THUMBPOSITION, i);
probiert ?

Gruß hagen

jaikai 17. Nov 2005 13:27

Geht nicht
 
Danke,

Aber der kackt ab, weil der int-Wert als '23:' beschrieben wird und ich nicht bestimmen kann, wie und wo der herkommen soll.

Irgendwie isses das nich... schade

negaH 17. Nov 2005 17:22

Re: Mainform VertScrollbaran MDI anpassen
 
Zitat:

Aber der kackt ab, weil der int-Wert als '23:' beschrieben wird und ich nicht bestimmen kann, wie und wo der herkommen soll.

Häää ???? Kannst du diesen Satz mal umschreiben und mit mehr Infos untermauern, bitte ?

Das funktioniert sehr wohl, zumindestens damals unter Delphi3 als ich's selber brauchte hat es fuktioniert. Du musst nur aufpassen das die globale Variable "MainForm" auch wirklich dein MainForm enthält.

Besser ist nämlich

Delphi-Quellcode:
if Assigned(Application.MainForm) and IsWindow(Application.MainForm.ClientHandle) then
  SendMessage(Application.MainForm.ClientHandle, .....);
Gruß Hagen

jaikai 17. Nov 2005 20:01

Re: Mainform VertScrollbaran MDI anpassen
 
H,

Danke zunächst.

Vorweg zum nachfolgenden Code:
Es ist der allerletzte Schluß einer aus der Mainform aufgerufenen Procedur ( nach nem Click in einer ListView). Da sich die größen ständig ändern hab ich eine Routine gebastelt, die die absoluten Größen aller MDi's steuert und durhläuft, neue Positionen (Top) setzt und nach den Vorgaben ausrichtet.

var i ist weder belastet noch belegt, Rückgabe okay.

...

Delphi-Quellcode:
i := 0;
if (Mainform.FindComponent(Bearbeitungs_Frame) as TMDIChild) <> nil then
   with (Mainform.FindComponent(Bearbeitungs_Frame) as TMDIChild) do begin
      i := top;
      end;

if Assigned(Application.MainForm) and IsWindow(Application.MainForm.ClientHandle) then
  SendMessage(Mainform.ClientHandle, WM_VSCROLL, SB_THUMBPOSITION, i);
Focus hatte die ListView
Laß ich mir (i) als showmessage ausgeben, dann passiert kein Laufzeit-Fehler, aber es passiert auch nichts mit dem 'Top' des MDI. Werd mich nochmal reinhängen, aber ich fürchte, es ist delphiinteres Wunderzeugs...

Muss wohl auf Frames umsteigen...

Gruß

Danke

negaH 18. Nov 2005 00:47

Re: Mainform VertScrollbaran MDI anpassen
 
Ich glaube du machst da einen Denkfehler.

Egal welche Position deine Scrollbar einnimmt die Koordinaten aller Childfenster bleiben immer unverändert. Deine Schleife um I zu berechnen wird im Grunde also immer den gleichen Wert liefern so lange du keines der Childs verschoben hast. Die Scrollbar ist davon absolut unbeeindruckt da der Clientbereich des MDI Forms einfach per Offsets wie ein "Sichtfenster" auf die MDI Childs arbeitet.

Anders ausgedrückt: bewegst du die Scrollbars so werden NICHT die Koordinaten der MDI Child Fenster verändert, diese bleiben gleich.

Angenommen du möchtest das Aktive Control der Childs immer vollständig sichtbar haben, dann musst du so vorgehen:

1.) ermittle ClientRect vom MainForm
2.) ermittle ClientRect vom ActiveControl
3.) konvertiere mit MapWindowPoints() das ActiveControl.ClientRect in die relativen Koordinaten zu MainForm.ClientHandle.
4.) berechne nun einen X,Y Offset so daß dieses Rect innerhalb des sichtbaren Bereiches vom MainForm.ClientRect zum liegen kommt
5.) der X,Y Offset ist nun der additive Offset auf MainForm.ClientHandle.WindowOrg um die Position der vertikalen und horizontalen Scrollbar einzustellen


Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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