Chodzi mi żeby długość była zwracana np w cm.
hmm, możesz musisz chyba znać coś takiego jak DPI (dots per inch) w swoim systemie. Standardowo windows XP ma 96 DPI co daje ok 38 pikseli na centymetr. Odpowiedzi swojej nie jestem pewien.
Nie pamiętam nazwy funckji ... GetDeviceCaps ... one zwracają rozdzielczość (w zależności od parametrów). Można sobie z tego przeliczyć m. in. to co chcesz.
Zadanie jest proste. Jeżeli podczas drukowania chcesz znać, jaka jest odległość w milimetrach między dwoma punktami np. 132 i 2186, leżącymi w tej samej osi, robisz coś takiego:
- Przekopiuj tuż za implementation funkcję widoczną poniżej.
function DPI_na_MM(cal:integer):single;
var
a:integer;
b:real;
begin
a:=GetDeviceCaps(Printer.Handle,LogPixelSX); // rozdzielczość
b:=cal*25.4/a;
Result:=b;
end;
- Teraz pod dowolnym buttonem wrzuć coś takiego (pamiętaj o umieszczeniu Labela):
with Printer,Printer.Canvas do
Label1.Caption:=FormatFloat('0.00 mm', DPI_na_MM(2186-132));
Mam nadzieję, że pamiętasz o wpisaniu w sekcji uses modułu Printers. Jeżeli klikniesz na Button1 otrzymasz odpowiedź, jaka jest odległość między tymi dwoma punktami. U mnie mam wynik 86,95 mm. Ważne jest to, że powyższa funkcja uwzględnia rozdzielczość drukarki ale tylko w osi X. Gdybyś chciał mierzyć odległość między dwoma punktami leżącymi po przekątnej wydruku sprawa się komplikuje, bo trzeba stosować np. twierdzenie Pitagorasa no i uwzgledniać rozdzielczość drukarki w osi Y (zwykle obie rozdzielczości są takie same, więc nie komplikujmy i niech zostanie jedna). Np. dla dwóch punktów (132,376) i (2186,1777), procedura może tak wyglądać:
Label2.Caption:=FormatFloat('0.00 mm', DPI_na_MM(Round(Sqrt(Power((1777-376),2)+Power((2186-132),2)))));
Trochę skomplikowane, ale działa. Powinno wyjść 105,24 mm