Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi screenToClient liefert komische Werte (https://www.delphipraxis.net/151129-screentoclient-liefert-komische-werte.html)

SimonRap 6. Mai 2010 20:39


screenToClient liefert komische Werte
 
hi leute,
wie der titel sagt:
Delphi-Quellcode:
procedure bla(blabla);
VAR x,x2,y,y2:INTEGER; xy:TPoint;
  min4.ScreenToClient(xy);//min4=Timage;
  x:=xy.X;
  y:=xy.Y;
  x2:=mouse.CursorPos.X;
  y2:=mouse.CursorPos.Y;
showmessage(its(x)+' '+ its(y)+' '+its(x2)+' '+its(y2));
// its ist nur:
function its(n:INTEGER):STRING;
  begin
    result:=inttostr(n);
  end;
//bissel schreiben sparen ;-)
Joa, so weit so gut aber als ergebnis der ShowMessage kommt:
'1242332 4208231 864 134'
Hm... bei einer Auflösung von 1024x768 ist 1242332 doch sehr unwahrscheinlich ;-)
Die Mauspositionen stimmen...
Außerdem ändern sich die ersten beiden (ScreenToClient) Werte nie...
Habe ich da einen Denkfehler oder etwas vergessen?
Hoffe ihr könnt mir helfen

wicht 6. Mai 2010 20:46

Re: screenToClient gibt komische Werte
 
Ganz davon abgesehen, dass dein Code sich vermutlich nicht kompilieren lässt:

Delphi-Quellcode:
var
  x,x2,y,y2:INTEGER;
  xy:TPoint;
min4.ScreenToClient(xy);//min4=Timage; // Wo ist hiervor das begin? Oder braucht man das nicht!?
falls vor min4..... ein "begin" wäre, wäre xy nicht initialisiert. Deshalb kommt so ein komischer Wert raus. Also so:

Delphi-Quellcode:
var
  xy: TPoint;
begin
  xy := Mouse.CursorPos;
  xy := ScreenToClient(xy);
  // Jetzt ShowMessage
end;
HTH

blauweiss 6. Mai 2010 20:46

Re: screenToClient gibt komische Werte
 
Hi SimonRap,

ScreenToClient ist eine Funktion und liefert einen Wert zurück.
Versuch mal
Delphi-Quellcode:
xy := min4.ScreenToClient(Point(0,0))
oder so ähnlich.... :-D

Grüße,
blauweiss

SimonRap 6. Mai 2010 20:56

Re: screenToClient gibt komische Werte
 
Zitat:

Zitat von SimonRap
...

Delphi-Quellcode:
procedure bla(blabla);
VAR x,x2,y,y2:INTEGER; xy:TPoint;
  min4.ScreenToClient(xy);//min4=Timage;
  x:=xy.X;
...
...

ähm ich dachte an den "BLAs" sieht man, dass ich das auf die Schnelle getippt hab... Hab begin^^
(glaub sogar, wenn ichs nich hätte würde er meckern)
...
xy := min4.ScreenToClient(Point(0,0))
...
Klar.. mist... sag ich doch: denkfehler^^
Is ja ne Function...
...
aber nun die Showmessage:
'-794 -128 866 134'
Hm... irgendwas stimmt da nich^^
(also ich hab jetzt:
Delphi-Quellcode:
{GAANZ WICHTIG:} begin {*zwinker* @ wicht ;-)}
xy := min4.ScreenToClient(Point(0,0));
x:=xy.X;
 y:=xy.Y;
)
Wie kommt der denn jetzt auf minus?
mfg simon

SimonRap 6. Mai 2010 21:23

Re: screenToClient gibt komische Werte
 
oder hab ich die funktion koplett falsch verstanden?
Meinem Verständnis nach wäre
Image1.screentoclient(form1.screentoclient);
das selbe wie
image1.left und image1.height
oder?

Ich verstehs nichmehr...
Kann mir jemand helfen?
need help simon

Medium 6. Mai 2010 21:46

Re: screenToClient liefert komische Werte
 
ClientToScreen() und ScreenToClient() fragen die Mausposition nicht selbsttätig ab, das musst du schon noch selber tun. Dafür ist ja der Parameter vom Typ TPoint gedacht. Die Funktionen sind dazu gedacht, dass wenn man z.B. mit Mouse.CursorPos die Bildschirmkoordinaten erfragt hat, man aber die relativen Koords zu einem Formular braucht, diese mit
Delphi-Quellcode:
var
  formRelativePos: TPoint;
begin
  formRelativePos := Form1.ScreenToClient(Mouse.CursorPos);
bekommen kann. Umgekehrt liefern manche Ereignisse/Berechnungen auch relative Koordinaten, und wenn man dann aber die Bildschirmkoordinaten braucht, nimmt man sich die Gegenfunktion ClientToScreen() her. Der wichtige Teil ist aber, dass DU selber die Mausposition nicht übergibst, und deswegen keine sinnvollen Werte bekommst.

SimonRap 6. Mai 2010 22:03

Re: screenToClient liefert komische Werte
 
also zeigt die funktion die position gesehen von der mauspos (der gegebene TPoint)...
wenn ich aber anstatt die Maus position ne 0,0 gebe, müsste dann nicht die position des bildes direkt rauskommen?
also image1.ScreenToClient(0,0)
Dann gibt der doch die Position relativ zum Punkt 0,0 aus oder?
[edit=völlig durcheinander]
quatsch...
er rechnet ja dann die position des 0,0 vom image 1 aus gesehen aus[/edit]

Medium 6. Mai 2010 22:09

Re: screenToClient liefert komische Werte
 
Nein. Die Funktion interpretiert (0,0) als Bildschirmkoordinate, und gibt dir diese relativ zu (Image.Left, Image.Top).

Ein Image ist schon ein bischen komplizierter, aber tun wir das mal:

Annahmen:
Image.Top = 80
Image.Left = 100

Image liegt auf Form (und nicht innerhalb eines weiteren Panels oder sonstiges, einfach nackt aufm Form).

Form.Top = 50
Form.Left = 250

Image.ScreenToClient(Point(0,0)) gibt dann einen Point: TPoint zurück:
Point.X = 0-80-50 = -130
Point.Y = 0-100-250 = -350

Zu interpretieren als: Bildschirmpunkt (0,0) liegt 130 Pixel links vom, und 350 Pixel oberhalb der oberen linken Ecke von Image.

SimonRap 6. Mai 2010 22:14

Re: screenToClient liefert komische Werte
 
mist is mir auch grad klar geworden (edit, deswegen kam auch minus raus, jetzt versteh ich das...glaub ich)
aber naja zu spät...
wiedermal denkfehler sry
Kann man denn (ohne die form.left und top auf 0 zu setzen) die position von 0 aus berechnen?
also so tun, als ob ein Object bei 0,0 ist und dann dieses object.screentoclient??
Gibt es da ne Möglichkeit?

Medium 6. Mai 2010 22:24

Re: screenToClient liefert komische Werte
 
Ähm, was hast du überhaupt vor? Also was genau hast du, und wo willst du hin? Ich glaube, du bist hier auf einem höheren Level aufm falschen Dampfer.


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