Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Fr 29.06.12 12:48 
Guten Tag,
ich mal ein Problem mit der Berechnung der Mauskoordinaten.. eigentlich ist das alles kein Problem, jedoch
mache ich das ganze mit einem Timer und dann mit Mouse.CursorPos ...
ich teste nun ob der Cursor z.B. über einem Button ist, aber hierbei trat das ereignis immer nur auf, wenn ich knapp über dem Button war und nicht auf dem Button.. nach einigen Nachberechnungen etc. bemerkete ich das meine Rechnungen richtig waren :D
Jedoch fehlt mir genau die Größe des Oberen Randes der Form.
Denn die Form.Top gibt den beginn der Form an nicht des Randes ( Borders ?!)
Nun würde ich gerne wissen, wie ich die Höhe dieses Randes berechnen kann bzw. wie ich herausbekomme wo nicht die Form sondern das Fenster beginnt...

Freu mich auf eure Antworten :)


Moderiert von user profile iconGausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 29.06.2012 um 13:29

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 29.06.12 13:28 
Beantwortet zwar nicht die Frage, aber löst wahrscheinlich das Problem: Schau dir mal die Methode ScreenToClient bzw. ClientToScreen an, die jedes TControl hat. :D

_________________
We are, we were and will not be.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 29.06.12 13:53 
Wenn die Rahmen unverändert sind könntest Du Dir sysmetrics anschauen.
Das hier ist was anderes, aber vielleicht hilft es ....
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm5.Timer1Timer(Sender: TObject);
var
 winctrl:TWinControl;
begin
  winctrl :=FindVCLWindow(Mouse.CursorPos);
  if Assigned(winctrl) then Caption := winctrl.Name else Caption :='';
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Fr 29.06.12 16:27 
Ok... das sind ja schonmal intressierte, die versuchen zu helfen :)

Jedoch sind das ja noch keine Lösungen^^

Ich hab mal ne Idee... Also:

FormMouseMove event einstellen und die CursorPos abfragen, dann den Cursor auf die Form setzen und abfragen wo er sich mit
Mouse.CursorPos.Y die Y koordinate holen und mit
der Form Mouse Move die Position des Cursors in der Form holen...

Sagen wir als Variable dafür einfach mal FMMCPY (FormMouseMoveCursorPosY) und TMCPY (T für Timer).
(Form nennen wir einfach Form1)
die Variable ObererRand ist halt der Oberere Rand (es ist eine Integer Variable)
ausblenden Delphi-Quelltext
1:
ObererRand := TMCPY - (FMMCPY+Form1.Top);					


Allerdings wäre das dann wiederrum sehr umständlich dann wieder das Formmousemove einzubauen, da man mit "Cursor auf Form setzen" ja auch z.B. einen Button treffen könnte und dann das Formmousemove event nicht eintreten würde... Mann müsste dazu also noch ein "freies" Plätzchen für den Cursor finden...

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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 29.06.12 17:01 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
Jedoch sind das ja noch keine Lösungen^^
Wenn das was user profile iconGausi geschrieben hat nicht passt, solltest du vielleicht noch einmal schreiben was du machen möchtest.

Ich hatte das genau wie Gausi verstanden:
Du willst schauen, ob die Maus sich in den Koordinaten des Buttons befindet und brauchst dafür die Bildschirmkoordinaten des Buttons um dann mit PtInRect zu prüfen, ob die Mauskoordinate in dem Buttonrechteck liegt. Also genau was user profile iconGausi geschrieben hat, ClientToScreen eben.

Wenn es das nicht ist, dann ist die Frage was du sonst meinst. :gruebel:

Davon abgesehen:
Wie wäre es mit OnMouseEnter und OnMouseLeave als Ereignisse deines Buttons? Da bekommst du direkt Ereignisse, wenn die Maus über den Button kommt oder wieder heruntergeht. Dann kannst du dir die ganze Rechnerei und den Timer sparen...
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Fr 29.06.12 17:12 
Als Beispiel nen Button... ich möchte herausfinden, wie groß (hoch) der oberere Rand der Form ist !

Ein Beispiel zu beantworten ist nicht die Frage zu lösen ...

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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 29.06.12 17:22 
Du willst also unbedingt eine Lösung für ein Problem, das sich nur stellt, weil du das ganze unbedingt selbst berechnen willst statt die fertigen Funktionen dafür zu nehmen oder es vielleicht gleich besser zu machen? :shock: :autsch:
Gut, deine Sache... :roll:

Die Randgrößen bekommst du mit GetSystemMetrics heraus:
msdn.microsoft.com/e...esktop/ms724385.aspx
SM_CYCAPTION ist z.B. die Größe des Bereichs der Titelleiste des Fensters.

Aber denke daran, dass es verschiedene Ränder gibt, je nachdem ob dein Fenster in der Größe veränderbar ist oder nicht. Das musst du dann natürlich alles berücksichtigen, wenn du das manuell machen willst.
Und der linke Rand mag zwar schmal sein, ist aber auch da und sollte auch berücksichtigt werden.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Fr 29.06.12 17:28 
Eine Antwort zur Frage :) Thema geschlossen

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Sa 30.06.12 17:17 
Ist der Rand unten und rechts eigentlich genau so breit wie der links? (bzw. bei dem unten so hoch)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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 30.06.12 18:37 
Nein, nicht unbedingt. Deshalb findest du in der verlinkten Liste ja auch die Höhe des horizontalen Randes und die Breite des vertikalen Randes einzeln. :zwinker:
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 01.07.12 13:41 
Ok :) aber links und rechts sind ja soweit ich weiß immer gleichbreit... oder?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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: So 01.07.12 14:25 
Da es dafür keine Einstellung gibt, muss es so sein, ja.
(Es würde sonst auch vermutlich etwas seltsam aussehen.)
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 01.07.12 14:36 
Ich denke ich werde dann eine Unit dazu schreiben, wie man alle Ränder (breite + höhe) rausbekommt

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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: So 01.07.12 14:42 
Es gibt in Delphi auch schon einiges in der Richtung fertig.

Da ich nicht weiß was du machen möchtest, weiß ich nicht, ob dir das hilft, aber es gibt z.B. ClientWidth, ClientHeight und ClientRect um die Größe des Clientbereiches des Formulars zu bekommen sowie ClientOrigin um dessen Abstand vom Bildschirmrand zu bestimmen.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 01.07.12 15:26 
ja, so kann man relativ einfach die seitenränder ausrechnen, aber nicht oben und unten, da man das verhältnis hierzwischen nicht kennt...

aber evt lasss ich es damit noch abgleichen

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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: So 01.07.12 15:29 
Was willst du denn mit den Randgrößen machen? Ich meine man kann die meisten Berechnungen auch schon direkt machen, eigentlich braucht man die Randgrößen kaum selbst, es sei denn man will z.B. so etwas machen: :gruebel:
www.entwickler-ecke....rder=asc&start=0
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 01.07.12 15:47 
Naja dazu kann man auch BorderStyle None verwenden und dann nur auf einer Groupbox basteln^^, außenrum dann buttons und panels und labels aller Art setzen um einenen eigenen Style zu haben, aber mir ging es einfach nur darum, dass mir der Rand fehlte in einer Berechung.. (Form.top+Button.Top+Button.height ist ca direkt über dem button^^, natürlich ist clienttoscreen eine gute möglichkeit, aber ich hab es lieber mathematisch nachvollziehbar, also soll bei meiner rechnung noch der rand mitberechnet werden^^

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
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: So 01.07.12 16:12 
Ob du nun mehrere API-Funktionen benutzt oder die eine...
msdn.microsoft.com/e...esktop/dd183434.aspx
Bei der kannst du wenigstens davon ausgehen, dass die weiter funktioniert, auch wenn sich in Windows mal etwas an der Berechnung ändert.

Jedenfalls geht das mit dem Button einfach so...
ausblenden Delphi-Quelltext
1:
2:
  if PtInRect(Rect(ClientToScreen(Button1.BoundsRect.TopLeft), ClientToScreen(Button1.BoundsRect.BottomRight)), Mouse.CursorPos) then
    // ...
Oder gleich via Event, siehe Anhang. Wenn etwas passieren soll, wenn die Maus darüber ist, macht ein Timer schlicht keinen Sinn.
Einloggen, um Attachments anzusehen!