Autor |
Beitrag |
IhopeonlyReader
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
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 Gausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 29.06.2012 um 13:29
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 ....
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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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)
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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 29.06.12 17:01
IhopeonlyReader hat folgendes geschrieben : | Jedoch sind das ja noch keine Lösungen^^ |
Wenn das was Gausi 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 Gausi geschrieben hat, ClientToScreen eben.
Wenn es das nicht ist, dann ist die Frage was du sonst meinst.
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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
Gut, deine Sache...
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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Fr 29.06.12 17:28
Eine Antwort zur Frage  Thema geschlossen
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: So 01.07.12 13:41
Ok  aber links und rechts sind ja soweit ich weiß immer gleichbreit... oder?
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
www.entwickler-ecke....rder=asc&start=0
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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... 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!
|
|