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 Form.Top und Height während des Verschiebens ermitteln (https://www.delphipraxis.net/133324-form-top-und-height-waehrend-des-verschiebens-ermitteln.html)

PinKing2 29. Apr 2009 20:48


Form.Top und Height während des Verschiebens ermitteln
 
Hallo zusammen,

ich möchte während des Verschiebens einer Form die neuen Werte für Top und Height
ermitteln (also die Werte wo die Form während des Verschiebens gerade ist).
Ich bekomme die Werte aber immer erst, wenn ich die Maustaste loslasse und
die Form an der Endposition angekommen ist.

Gibt es einen Trick die Werte auch zwischendurch zu ermitteln?

Eine Funktion TForm1.WMMOVE(var Msg: TWMMove); habe ich drin,
nur was muss ich da drin jetzt machen, damit die Werte aktualisiert werden?

Wäre für einen kleinen Tipp echt dankbar!


Gruss,

Andy.

Delphi 2005 PE

jaenicke 29. Apr 2009 21:18

Re: Form.Top und Height während des Verschiebens ermitteln
 
Benutze einfach das Ereignis OnCanResize deines Formulars. Anders als OnResize wird dieses Ereignis bereits während des Verschiebens aufgerufen.

oki 29. Apr 2009 21:22

Re: Form.Top und Height während des Verschiebens ermitteln
 
schau mal im MSDN unter wm_move nach. ich glaube, Delphi sollte auch einen TWMMove Record bereit stellen. Imho ist im WParam ein Zeiger auf einen Rect-Record abgelegt. Mit TRect(Msg.WParam^) solltest du an die Koordinaten kommen.

wm_move wird definitiv auch während der Bewegung ausgelöst.

Gruß oki

jaenicke 29. Apr 2009 21:26

Re: Form.Top und Height während des Verschiebens ermitteln
 
Funktioniert ja sicherlich auch. Und man kann ja auch direkt Top und Left in WMMove abfragen, das klappt sicher auch, denn wenn das Formular an der neuen Stelle ist, dann sind diese Werte auch aktualisiert.

// EDIT:
Es gibt auch: Msg.XPos, Msg.YPos, Msg.Pos.x, Msg.Pos.y ;-)
Und das klappt so auch:
Delphi-Quellcode:
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMMove(var Msg: TWMMove); message WM_MOVE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMove(var Msg: TWMMove);
begin
  Caption := IntToStr(Left) + ', ' + IntToStr(Top);
end;

PinKing2 29. Apr 2009 22:38

Re: Form.Top und Height während des Verschiebens ermitteln
 
Hallo,

vielen Dank für die Antworten. Leider funktioniert das bei mir nicht.

Delphi-Quellcode:
procedure TForm2.WMMOVE(var Msg: TWMMove);
begin
    Form1.Label2.Caption:= IntToStr(Top);
end;
Wenn ich Form2 bewege, wird Label2 von Form1 erst dann geändert, wenn ich
die Maustaste loslasse.

Was mache ich falsch?

Gruss,

Andy.

jaenicke 29. Apr 2009 22:42

Re: Form.Top und Height während des Verschiebens ermitteln
 
Das kann ich nicht reproduzieren, jedenfalls unter Vista hier nicht.

Benutzt du noch XP? Dann müsste ich das in einem virtuellen PC einmal testen, richtig installiert habe ich es nur noch auf einem Testrechner.

// EDIT:
Auch unter XP klappt das wunderbar. Läuft da noch etwas anderes im Hintergrund oder so?

PinKing2 29. Apr 2009 23:14

Re: Form.Top und Height während des Verschiebens ermitteln
 
Ja, ich arbeite mit XP und es läuft nichts besonderes
im Hintergrund.

Vielen Dank für Eure Mühen, ich muss nun erst mal schlafen
und werde mir die Sache die Tage mal in Ruhe ansehen.
Wenn ich den Fehler bei mir finde, melde ich mich...

Gruss,

Andy.

jaenicke 29. Apr 2009 23:16

Re: Form.Top und Height während des Verschiebens ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal mein Testprojekt, getestet mit Delphi 7 und 2006, Windows XP und Vista. :firejump:

PinKing2 30. Apr 2009 06:08

Re: Form.Top und Height während des Verschiebens ermitteln
 
Hallo Sebastian,

auch bei Deinem Programm funktioniert das bei mir nicht.
Ich öffnen die zweite Form über den Button und verschiebe
dann die zweite Form. Dein Label für Top auf Form1 wird bei
mir immer erst aktualisiert, wenn ich die Maustaste loslasse...

Könnte es auch an der Grafikkarte und dessen Treibern liegen,
oder muss man zwischendurch den Screen refreshen, oder sowas?


Trotzdem vielen Dank für Deine Mühen!

Gruss,

Andy.

oki 30. Apr 2009 06:16

Re: Form.Top und Height während des Verschiebens ermitteln
 
Zitat:

Zitat von PinKing2
Hallo,

vielen Dank für die Antworten. Leider funktioniert das bei mir nicht.

Delphi-Quellcode:
procedure TForm2.WMMOVE(var Msg: TWMMove);
begin
    Form1.Label2.Caption:= IntToStr(Top);
end;
Wenn ich Form2 bewege, wird Label2 von Form1 erst dann geändert, wenn ich
die Maustaste loslasse.

Was mache ich falsch?

Gruss,

Andy.

wm_move liefert dir die neuen Koordinaten vor der Änderung in Msg. Somit hast du die Möglichkeit diese zu beeinflussen. Left, Top .. sind zu diesem Zeitpunkt noch nicht die neuen Werte. Läßt du das Msg ohne Änderung durchgehen, werden die darin enthaltenen neuen Koordinaten für Left, Top etc. übernommen. Geändert sind die Werte erst in wm_moved. Da kannst du auf Left und Top uns Width ... zugreifen.
Also sind bei wm_move die Koordinaten in Msg nicht identisch mit den Propertys des Fensers.

Somit musst du es so machen wie ich es beschrieben hatte oder das so schreiben:
Delphi-Quellcode:
procedure TForm2.WMMOVE(var Msg: TWMMove);
begin
  inherited;
  Form1.Label2.Caption:= IntToStr(Top);
  Application.ProcessMessages; // das mal testen, kann aber auch Probleme verursachen
end;
Gruß oki

PinKing2 30. Apr 2009 08:51

Re: Form.Top und Height während des Verschiebens ermitteln
 
Hallo Freunde,

so jetzt weiss ich warum ich so verzweifelt bin... :wink:


Ich habe bei meinem (schon etwas älterem) Laptop unter
Systemsteuerung -> System -> Reiter "Erweitert" -> Systemleistung Einstellungen ->
Visuelle Effekte den Haken bei "Für optimale Leistung anpassen" ausgewählt und
dann funktioniert das alles nicht. Wichtig ist wohl der Haken bei "Fensterinhalt
beim Ziehen anzeigen", denn wenn man den auswählt, funktioniert es.

Kann man das zur Laufzeit des Programmes einschalten? Könnte man dem Benutzer
ja per Checkbox auswählen lassen.

Allerdings hab ich jetzt noch ein neues Problem. Wenn ich jetzt "Für optimale
Darstellung anpassen" auswähle, verschwinden bei mir zwei Panels die eigentlich
rechts und links unten jeweils ein Pixel vom Rand in der Form liegen zur Hälfte
im unteren Bildschirmrand... :(

Ich hatte Hier gestern auch schon ein Problem gepostet, da ist auch ein Screenshot dabei.
Ich rede von den beiden grünen Punkten unten in der Form ohne Rahmen.

Hat da jemand eine Idee zu?

Nachtrag:

Meine Panels verschwinden am unteren Bildrand, wenn unter
Systemsteuerung -> System -> Reiter "Erweitert" -> Systemleistung Einstellungen ->
Visuelle Effekte der Haken bei "Visuelle Stile für Fenster und Schaltflächen verwenden"
ausgewählt ist. Muss man auf diese Einstellung irgendwie im Programm reagieren, damit
alles richtig gezeichnet wird?


Gruss,

Andy.

jaenicke 30. Apr 2009 13:53

Re: Form.Top und Height während des Verschiebens ermitteln
 
Wenn das Fenster natürlich nicht gleich verschoben wird, dann ändert sich die Position ja auch nicht. Der Prozentsatz an PCs mit dieser Einstellung dürfte allerdings verschwindend gering sein. Was mich daran erinnert, dass ich da bei einer meiner Komponenten evtl. auch nicht 100% kompatibel dazu bin. ;-)

Bei den visuellen Stilen werden die Komponenten anders dargestellt, Panels z.B. transparent, alles mit abgerundeten Ecken, aber die Position sollte sich nicht ändern.
Ein XP-Manifest bzw. die Komponente TXPManifest hast du aber drin?

PinKing2 30. Apr 2009 17:30

Re: Form.Top und Height während des Verschiebens ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 2)
Die Ursache scheint folgender zu sein. Ich habe die visuellen Stile
unter Windows abgestellt und erstelle mein Formular. Ich positioniere
die Panels am unteren Rand (Anchors: Left,bzw.Right und Bottom)
und alles sieht gut aus. Läuft mein Programm jetzt auf einem PC mit
visuellen Stilen ist der Rahmen breiter und um diese Differenz
werden die Panels nach unten verschoben. Kann das sein?

Anbei 2 Bilder.

Gruss,

Andy.

jaenicke 30. Apr 2009 19:19

Re: Form.Top und Height während des Verschiebens ermitteln
 
Das ist richtig, aber damit hatte ich nie Probleme, da ich die Komponenten nie direkt an den Rand gesetzt habe, es sei denn mit Align = alClient oder so. Ganz ohne Rand sieht das doch ohnehin meistens nicht gut aus. :stupid:

Außerdem gibt es das Problem auch nur bei älteren Delphiversionen, zumindest ab Delphi 2006 / Turbo Delphi ist das behoben... ;-)

Deshalb könntest du evtl. einfach das kostenlose Turbo Delphi zumindest zum Kompilieren benutzen, welches im übrigen ohnehin sehr viel besser funktioniert und deutlich mehr Funktionen hat als die von dir angegebene Delphi 2005 PE (wo ich gedacht hätte, dass es da auch schon korrekt ginge).


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 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-2025 by Thomas Breitkreuz