Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bildschirm-Groesse in mm auslesen (https://www.delphipraxis.net/159831-bildschirm-groesse-mm-auslesen.html)

thomas2009 14. Apr 2011 15:25

Bildschirm-Groesse in mm auslesen
 
Hi

gibt es eine andere alternative Methode um den Bildschirm-Groesse
in Millimeter auslesen zu können ?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  DC : HDC;
  cm :Single;
begin
DC := GetDC(Form1.Handle); { or Canvas.Handle }
cm:=(GetDeviceCaps(DC,LOGPIXELSX)/2.54);

Edit1.Text := FloatToStr(Round( (StrToInt('1024')*10) / cm));
Edit2.Text := FloatToStr(Round( (StrToInt('768')*10) / cm));

end;
Ich erhalte :
271 mm
x
203 mm
:|

DeddyH 14. Apr 2011 15:32

AW: Bildschirm-Groesse in mm auslesen
 
Erklär uns doch erstmal Zeile für Zeile, was Dein Code tun soll. Ich steig da nicht ganz durch.

shmia 14. Apr 2011 15:39

AW: Bildschirm-Groesse in mm auslesen
 
Also irgendwie habe ich gerade ein Déjà-vu:
Pixel in Millimiter umrechnen mit dieser Funktion ? by thomas2009

Satty67 14. Apr 2011 15:54

AW: Bildschirm-Groesse in mm auslesen
 
Wenn Forms eingebunden ist, bietet sich die Verwendung von Screen an.

Screen.Width/Height mit Screen.PixelsPerInch verrechnet gibt bei mir millimetergenaue (und korrekte) Werte.

thomas2009 14. Apr 2011 16:43

AW: Bildschirm-Groesse in mm auslesen
 
Danke Andreas für den Link ;)

Also wenn ich genauso tue :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
x: Double;
begin
x:= screen.Width/screen.Height * Screen.PixelsPerInch;
Caption:=FloatToStr(x);
end;
Ich erhalte : 128
Was bedeutet das dann ?

jfheins 14. Apr 2011 16:51

AW: Bildschirm-Groesse in mm auslesen
 
Zitat:

Zitat von thomas2009 (Beitrag 1095139)
Danke Andreas für den Link ;)

Also wenn ich genauso tue :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
x: Double;
begin
x:= screen.Width/screen.Height * Screen.PixelsPerInch;
Caption:=FloatToStr(x);
end;
Ich erhalte : 128
Was bedeutet das dann ?

Es gibt viele Möglichkeiten, aber ich tippe darauf: Du hast einen Monitor mit 4:3 Seitenverhältnis und 96 ppi Auflösung.

Für dein Problem zielführender ist es natürlich wenn am Ende schon von den Einheiten was anderes rauskommt.
z.B. Indem man
Code:
screen.Width/Screen.PixelsPerInch
Rechnet. Dann kommen Zoll raus ;)

Aphton 14. Apr 2011 17:18

AW: Bildschirm-Groesse in mm auslesen
 
Warum eine andere Methode?

EDIT:
Delphi-Quellcode:
{1}
DC := GetDC(Form1.Handle);
{2}
Edit1.Text := FloatToStr(Round( (StrToInt('1024')*10) / cm));
Edit2.Text := FloatToStr(Round( (StrToInt('768')*10) / cm));
{1}
Warum das Handle der Form?
{2}
*facepalm

Weiters: Ich denke mal, deine Auflösung ist nicht 1024x768 und deshalb werden falsche Werte angezeigt?! Falls ja, dann gugg doch mal genauer hin -.-'

EDIT2:
LOGPIXELSX liefert dir folgendes zurück
Zitat:

Zitat von http://msdn.microsoft.com/en-us/library/dd144877%28v=vs.85%29.aspx
Number of pixels per logical inch along the screen width. In a system with multiple display monitors, this value is the same for all monitors.

Ansonten, hier
Delphi-Quellcode:
procedure GetDisplaySize(var mm: TPoint);
asm
  xchg eax, esi
  mov [esi], -1
  mov [esi+4], -1
  call GetDesktopWindow
  xchg edi, eax
  push edi
  call GetDC
  test eax, eax
  jnz @continue
  ret
  @continue:
  push ebp
  mov ebp, esp
  sub esp, $10
  push eax
  push edi
  push $5A
  push eax
  push $58
  push eax
  call GetDeviceCaps
  mov ecx, 100
  mul ecx
  mov [ebp-$10], eax
  call GetDeviceCaps
  mov ecx, 100
  mul ecx
  mov [ebp-$0C], eax
  push 1
  push 0
  call GetSystemMetrics
  mov [ebp-$08], eax
  call GetSystemMetrics
  mov [ebp-$04], eax
  mov eax, [ebp-$08]
  mov ecx, 2540
  push ecx
  mul ecx
  cdq
  mov ecx, [ebp-$10]
  idiv ecx
  mov [esi], eax
  mov eax, [ebp-$04]
  pop ecx
  mul ecx
  cdq
  mov ecx, [ebp-$0C]
  idiv ecx
  mov [esi+$04], eax
  call ReleaseDC
  mov esp, ebp
  pop ebp
  xchg eax, esi
end;

thomas2009 14. Apr 2011 18:26

AW: Bildschirm-Groesse in mm auslesen
 
Ich habe den Code etwas geändert, obwohl das gleiche Ergebnis erhalte
aber es ist noch einfacher
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
x: Double;
begin
X:=screen.Width/Screen.PixelsPerInch;
Caption:=FloatToStr(x*25.43);// screen.Width in mm
end;
Ich erhalte : 271,25333 :thumb:

DeddyH 14. Apr 2011 18:46

AW: Bildschirm-Groesse in mm auslesen
 
Und ganz ohne StrToInt :mrgreen:

thomas2009 14. Apr 2011 19:12

AW: Bildschirm-Groesse in mm auslesen
 
Wie rufe ich die Funktion auf ?
Delphi-Quellcode:
var
Form1: TForm;
x,y : Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Screen.width;
y:=Screen.Height;

GetDisplaySize(x,y);
caption:=IntToStr(x);
end;
Ich erhalte -1 :-D

Satty67 14. Apr 2011 19:36

AW: Bildschirm-Groesse in mm auslesen
 
Ich glaube nicht mehr an Bequemlichkeit und Copy&Paste Kultur, ich hoffe es ist nichts ansteckendes (und das Internet als Isolations-Schicht ausreichend ist) ;)

Delphi-Quellcode:
function ScreenSizeMM: TSize;
begin
  Result.cx := Round((Screen.Width / Screen.PixelsPerInch) * 25.4);
  Result.cy := Round((Screen.Height / Screen.PixelsPerInch) * 25.4);
end;
Ein Bier drauf, dass der Ergebnistyp weitere Schwierigkeiten macht und der Thread noch nicht zuende ist.

Aphton 14. Apr 2011 19:50

AW: Bildschirm-Groesse in mm auslesen
 
Zitat:

Zitat von thomas2009 (Beitrag 1095182)
Wie rufe ich die Funktion auf ?
Delphi-Quellcode:
var
Form1: TForm;
x,y : Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Screen.width;
y:=Screen.Height;

GetDisplaySize(x,y);
caption:=IntToStr(x);
end;
Ich erhalte -1 :-D

Sry, habs ausgebessert... :stupid:
"Kopiers" noch einmal

markus5766h 14. Apr 2011 20:02

AW: Bildschirm-Groesse in mm auslesen
 
Hallo,

ich werf' dann mal das in's Rennen :
Code:

type
  fScreenMM = array[0..1] of Real;

.
.
.

function ScreenMM : fScreenMM;
begin
  Result[0] := Screen.Width / Screen.PixelsPerInch * 25.4;
  Result[1] := Screen.Height / Screen.PixelsPerInch * 25.4;
end;

Luckie 14. Apr 2011 20:06

AW: Bildschirm-Groesse in mm auslesen
 
Zitat:

Zitat von Aphton (Beitrag 1095205)
Sry, habs ausgebessert... :stupid:

Was kommt jetzt raus? Pi? :mrgreen:

Aphton 14. Apr 2011 20:08

AW: Bildschirm-Groesse in mm auslesen
 
Ohh.. hmm
Evt xD

Edit: So, tut mir echt leid! Nun sollte es funzen. Habs zuerst so programmiert, dass es mit einer TPoint Variable funktioniert und die Anpassung bei der Umstellung auf zwei Integer Variablen nicht durchgeführt.

Sollte aber nun klappen! xD

thomas2009 14. Apr 2011 20:19

AW: Bildschirm-Groesse in mm auslesen
 
hallo @Satty67
das ist genau was @jfheins geschrieben hat
#6

Zitat:

Zitat von Aphton (Beitrag 1095205)
Sry, habs ausgebessert... :stupid:
"Kopiers" noch einmal

Nun funktioniert's, ich erhalte für die Breite 270

himitsu 14. Apr 2011 20:23

AW: Bildschirm-Groesse in mm auslesen
 
Auch wenn ich nicht verstehe, warum man sowas in Assembler verschlüsseln muß. :gruebel:

Kann mir nicht vorstellen, daß eine Pascalvariante viel langsamer ist (außer daß diese dadurch kürzer und übersichtlicher würde) und so oft sollte sich die Bildschirmgröße nicht verändern, als das man dieses zumillionen Mal die Sekunde ausrechnen müßte.

Aphton 14. Apr 2011 20:28

AW: Bildschirm-Groesse in mm auslesen
 
Eh nicht, aber da er es nicht entschlüsseln kann wird er nicht behaupten können, er habe es selbst geschrieben.
Im Falle einer Hausübung dürfte sich das für mich positiv auswirken :)
Ansonsten - da er durchs Kopieren sowieso nichts lernt, macht es keinen großen Unterschied

Satty67 14. Apr 2011 20:32

AW: Bildschirm-Groesse in mm auslesen
 
Zitat:

Zitat von thomas2009 (Beitrag 1095219)
das ist genau was @jfheins geschrieben hat

Ja irgendwie haben wir alle es geschrieben, abgesehen von der Umsetzung ist das Prinzip immer das gleiche.

Daniel 15. Apr 2011 07:29

AW: Bildschirm-Groesse in mm auslesen
 
Und da ich nicht erkennen kann, dass Thomas seit Tagen auch nur ansatzweise einen der angebotenen Links gelesen hat und damit in der Lage wäre, die Begriffe / Maßeinheiten "Zoll", "Inch", "Pixel" und "mm" in einen logischen Zusammenhang zu bringen, mache ich hier zu.

Solange Du nicht in der Lage bist, die Ergebnisse Deiner Funktionen wenigstens über den Daumen auf ihre Qualität hin zu prüfen, könntest Du auch einen Zufallszahlengenerator einbauen. Und solange Du Dich weigerst, Dir ein Mindestmaß an Hintergrundwissen (für Deine eigenen Problemstellungen) anzueignen, weigere ich mich, dieses und andere Themen offen zu lassen.


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