Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 22 janv. 2010 à 19:04
Essayez donc celui-là... il se nomme Meazure...
www.oldware.org/download.php?download=791
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 22 janv. 2010 à 07:59
pour @ DRJEROME
(merci pour la note)
il semblerai que ce soit le picPick mentionné plus haut par JP DEBIARS
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 22 janv. 2010 à 07:57
@ Jean-Pierre : "Surtout pour son option "palette de couleurs, qui donne directement la couleur Delphi."
tu peux essayer celà : (le code couleur delphi est dans le presse papier en sortant)
il suffit d'un TColorDialog,un Tpanel, un Tbutton et un Tedit :
unit Nuancier1;
//---------------------------------------------------------------------------
interface
//---------------------------------------------------------------------------
uses Forms, StdCtrls, Classes, Controls, Dialogs, SysUtils, ExtCtrls ;const projet 'xxx'; version '1';
Type
TForm1 = class(TForm)
C1: TColorDialog;
Panel1: TPanel;
Edit1: TEdit;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1Click(Sender: TObject);
private
{ Déclarations privées }
public
procedure INIT;
procedure QUITTER;
end;
var
Form1: TForm1;
//---------------------------------------------------------------------------
implementation
//---------------------------------------------------------------------------
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject); begin Quitter end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key=#27 then QUITTER; end; // nécessite Form1.keypreview := true
procedure TForm1.QUITTER;
begin
edit1.SelectAll;
edit1.CopyToClipboard;
application.Terminate
end;
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject); begin INIT end;
procedure TForm1.INIT;
begin
Form1.keypreview := true; // pour quitter avec ESC, si pas déjà dans DFM
setbounds(0,0,170,29)
end;
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
if C1.Execute then
begin
edit1.Text := inttostr(C1.Color);
edit1.Color := C1.Color;
end;
end;
procedure TForm1.Edit1Click(Sender: TObject);
begin
if C1.Execute then
begin
edit1.Text := inttostr(C1.Color);
edit1.Color := C1.Color;
end;
end;
end.
+ le DFM :
object Form1: TForm1
Left = 402
Top = 120
BorderIcons = []
BorderStyle = bsNone
Caption = 'Nuancier'
ClientHeight = 88
ClientWidth = 263
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
KeyPreview = True
OldCreateOrder = False
OnCreate = FormCreate
OnKeyPress = FormKeyPress
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 169
Height = 26
Caption = 'Panel1'
Color = 8404992
TabOrder = 0
object Edit1: TEdit
Left = 3
Top = 2
Width = 120
Height = 21
TabOrder = 0
Text = 'Clic'
OnClick = Edit1Click
end
object Button2: TButton
Left = 123
Top = 3
Width = 42
Height = 21
Caption = 'Quitter'
TabOrder = 1
OnClick = Button2Click
end
end
object C1: TColorDialog
Left = 24
Top = 32
end
end
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 21 janv. 2010 à 21:51
oups..;
notons Monsieur Dubois
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 21 janv. 2010 à 21:50
Je relie les posts plus haut,
c'est vrai que les conversions de pixels à millimètres correspondent à la taille à l'impression
Après chacun se fait sa "règle de 3" s'il veut pour faire correspondre les pixels à la taille réelle de son écran mais ce n'est pas le plus important
le tout c'est que ça corresponde à la taille à l'impression
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 21 janv. 2010 à 21:31
Bonjour,
il y a cette aussi réglette transparente qui est pas mal (à adapter):
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 20 janv. 2010 à 16:04
Dubois77, faut pas jeter ta règle...elle a l'avantage de donner d'un seul coup un max de renseignements.
La diagonale, par exemple, qui a l'air d'amuser Blueperfect, permet, en deux mesures, de connaître les dimensions d'un rectangle incliné.
En tout cas, cela a mis un peu d'animation sur Delphifr.
Cordialement
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 20 janv. 2010 à 15:36
Dubois77, tu idée de mesure via un panel est innovante, faut pas l'oublier.
N'empêche que dans le programme recommandé par Debiars (un Jean-Pierre aussi), aucune mesure en millimètres n'est possible ;-)
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 20 janv. 2010 à 12:51
Merci Jean Pierre pour PicPick
Effectivement c'est autre chose
On oublie la règle !
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 20 janv. 2010 à 10:54
@ Debiars, en effet, vu sur un autre angle, je pense que tu as parfaitement raison.
De plus je te remercie pour ta recommandation de PicPick, je l'ai déjà essayé et adopté !
Surtout pour son option "palette de couleurs, qui donne directement la couleur Delphi.
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 janv. 2010 à 22:41
Et pour les diagonales ?
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 19 janv. 2010 à 21:04
Debiars, n'as-tu pas un peu sous-estimé le sujet ?
Mais non,mon cher Jean-pierre, au contraire, je pense avoir fait le tour du sujet...
D'ailleurs Dubois77 a très bien compris mes explications, puisqu'il les applique dans sa dernière fonction Taille.
Il existe un petit logiciel nommé PicPick que l'on trouve sur le net, et qui offre une réglette graduée en pixels, un raporteur et divers outils dont des captures d'écran de format variées. A voir.
Kodeur
Messages postés5Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention19 janvier 2010 19 janv. 2010 à 20:59
Pour le About de Zarco ça doit venir du fait que SnapBuffer et ScreenSnap sont apparues après D7...
Kodeur
Messages postés5Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention19 janvier 2010 19 janv. 2010 à 20:50
Il foire aussi j'ai essayé l'executable téléchargeable.
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 20:45
En tous les cas, le About de Zarco foire complètement, manque des éléments.
Et vous ?
Kodeur
Messages postés5Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention19 janvier 2010 19 janv. 2010 à 20:25
@ DUBOIS77 sur mon portable le "screen ruller m'affiche 495 mm pour mon écran qui en fait 368
Une question bête, la différence ne serait pas liée à la résolution de l'écran utilisée ?
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 20:18
@ dubois77, hé oui, Zarko ne devait pas avoir sous les yeux une dalle plate.
Son écran devait dater un peu ;-)
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 20:03
@ Cari : oui au niveau Canvas, pas ce genre de souci. Les marges et tout et tout, c'est bien pris en compte, et le millimètre est au rendez-vous correctement imprimé.
Mais pôôô trop sur les dalles des écrans plats !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 19 janv. 2010 à 19:59
@ kodeur : La mesure sur l'écran vérifiée avec une règle graduée est parfaite.
sur mon portable le "screen ruller m'affiche 495 mm pour mon écran qui en fait 368
!
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 19 janv. 2010 à 19:55
Il est exact qu'on se fout un peu d'une dimension écran en mm.
Laquelle, vu les réglages possibles sur tous les moniteurs, ne sera de toute façon jamais très précise.
Par contre, là où ça devient très intéressant, c'est de pouvoir prévoir les dimensions d'un objet après impression.
Je n'ai, hélas, pas le temps d'approfondir en ce moment, mais il me semble bien avoir vu des sources qui le faisaient... Car, au niveau logiciel, un Canvas est un Canvas, quelque soit le proprio.
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 19:36
@ Debiars, n'as-tu pas un peu sous-estimé le sujet ? ;-)
Je suis fin près pour l'interrogation lol !
@ Kodeur, oui oui, lien très intéressant, merci !
Mais une chose tout de même m'interpelle ; quel besoin avons nous réellement de la mesure millimétrique ?
Car le millimètre au niveau écran est une notion abstraite, voire virtuelle, en quelque sorte, non ?
Bref, je viens de regarder ce que donne la version à Zarko.
J'ai pris une lettre au format de 230 mm de long.
Après mesure, cela donne 219 mm (axe X). Alors de 230 mm réels à 219 mesurés...
Mon écran mesure à peu près 470 mm (axe X), la mesure me donne dans les 450 mm.
Ceci dit, une solution doit exister permettant d'obtenir le millimètre. Ne cédons pas à la facilité ; ce n'est pas une qualité de programmeur.
@ suivre ;-)
Kodeur
Messages postés5Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention19 janvier 2010 19 janv. 2010 à 18:06
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 19 janv. 2010 à 17:43
J'ai définitivement adopté ce code qui fonctionne et devrait fonctionner chez tout le monde :
dans le type
public
function Taille:string;
//-------------------------------------------------------------------------
function TForm1.Taille:string; // marche sur mon PC
var W,H:integer;
begin
W:=368; // à définir suivant votre écran : taille réelle en mm
H:=230; // à définir suivant votre écran
result := FormatFloat(' ####.##" x"', w / screen.Width * P1.width)
+ FormatFloat(' ####.##" mm" ',h / screen.Height * P1.height)
+ FormatFloat('"/ = "####.##" mm "',sqrt( sqr
(w/screen.Width*P1.width) + sqr(h/screen.Height*P1.height) ) );
end;
//-------------------------------------------------------------------------
procedure TForm1.FormCanResize;
var p,a,e,z:string; mm :TpixDistXY;
begin
Adapte;
p := Taille;
e := TaillePixel(P1.Width,P1.height);
a := Angle(P1.Width,P1.height);
z := e + '/' + p + '/' + a;
P1.Hint := z;
Hint := z;
z := format('[ %d x %d pix / %s / %s ] - ALeft=%d ATop=%d ARight=%d ABottom=%d',
[P1.Width,P1.height,p,a, Left+17,top+35,Left+17+p1.Width,Top+35+p1.Height]);
form2.caption := z;
end;
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 19 janv. 2010 à 15:55
@ Jean-pierre
Je me suis un peux trop fixé sur mon écran qui est "parfait".
Je viens de faire un test avec un NetBook 1024x600 et là ça ne colle plus, Mesure me donne des renseignements faux, donc, dans ce cas, on laisse tomber Mesure.
On peut modifier Regle soit en ajoutant la saisie des dimensions en mm mesurées à la main, soit en les mettant en constantes dans le programme.
On calcule ensuite :
largeur du pixel en mm = largeur de l'écran en mm / Screen.Width
hauteur du pixel en mm = hauteur de l'écran en mm / Screen.Height
Avec ces deux données tu peux calculer la dimension en mm à partir d'un nombre de pixels donné en tenant compte, bien entendu, du sens largeur ou hauteur.
Tu peux également calculer le nombre de pixels par mm en divisant les dimensions de l'écran par le dimensions en mm, ce qui te permet de faire les conversions mm vers pixels.
J'espère m'être bien fait comprendre... Demain, interrogation écrite.
A+ ou pas.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 19 janv. 2010 à 14:56
je reviens toujours à mon cas :
mm := Mesurer(Screen.Width, Screen.Height); // Ok oui mieux...
caption := FormatFloat('####.##" mm"',mm.X) + ' x '
+FormatFloat('####.##" mm"',mm.Y);
me renvoie ma taille écran à 508x318 mm alors qu'il fait réellement 370x230 mm
ou est le bug ?
Comment fais-tu Jean Pierre pour avoir la taille d'un pixel en largeuru et hauteur ?
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 19 janv. 2010 à 14:30
@ Jean-Pierre,
Voyons, où est le problème ?
La procédure Mesurer te les dimensions de l'écran en mm. Une simple division des tailles en mm par les tailles en pixels te permet de trouver la largeur et la hauteur du pixel en mm.
Supposons que tu veuilles tracer un carré de 100 mm à l'écran. Il te suffit donc de multiplier les dimensions du pixel par 100 pour trouver largeur et hauteur du carré en pixels et cela même si le pixel n'est pas carré, auquel cas il te faudra plus de pixels dans un sens que dans l'autre.
Inversement, diviser la taille en pixels par la taille en mm te donne le nombre de pixels par mm...
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 12:00
Oui mais cela s'appelle du "botter en touche", non ? ;-)
Es-t-il dont impossible de déterminer la taille exacte d'un pixel suivant les différents types d'écrans ?
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 19 janv. 2010 à 11:40
Pour relancer le débat : j'ai remplacé la transparence de Form1 par AlphaBlend à 120.
Cela me permet de "coloriser" la règle selon l'humeur du moment, entre autres avantages.
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 19 janv. 2010 à 09:50
Cette dernière mouture me donne, sur mon écran ceci :
Pour une distance réelle mesurée sur un papier de 100 mm :
Axe X = la règle affiche 96,4 mm
Axe Y = la règle affiche 92,5 mm
Je précise que la mesure en Screen est plus proche de la réalité, que la précédente méthode.
Mais c'est pas encore la précision... Ah, ces écrans plats !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 19 janv. 2010 à 09:21
oups !
(pour une distance réelle mesurée de 100 mm, la régle m'affiche avec cette méthode 138.6 !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 19 janv. 2010 à 09:20
Bonjour tout le monde
Bon j'ai remis la function mesurer de Caribensila
(elle ne marche pas chez moi)
quant à la diagonale, il suffit de rajouter :
mm2 := mesurer(P1.Width,P1.height);
FormatFloat('" Diag="####.#" mm "',sqrt( sqr(mm2.x) + sqr(mm2.y)) );
mais comme chez moi les mm ne marchent pas avec cette méthode, je ne le rajoute pas pour l'instant
(pour une distance réelle mesurer de 100 mm, la régle m'affiche avec cette méthode 138.6 !
du coup je me suis compilé un exe avec ma version (avec diagonale) pour pouvoir l'utiliser)
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 19 janv. 2010 à 08:07
Vous n'avez pas l'impression de tourner en rond... un peu ? ;-)
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 18 janv. 2010 à 23:26
Et pour les diagonales ?
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 18 janv. 2010 à 20:48
Arffff, en se basant sur les dimensions du panel de mesure :
De cette façon plus besoin des variables w et h partant en vrille sur mon écran.
Bien mieux non ?
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 18 janv. 2010 à 20:20
A mon avis, les variables w et H foirent un peu.
Car en appliquant la méthode à Cari, c'est nettement mieux, démonstration :
function Taille(w, h: integer): string;
var
aPixDistXY: TPixDistXY;
function Mesurer(const PixDistX, PixDistY:Integer) : TPixDistXY;
// PixDistX est une mesure en pixels.
var DC : HDC;
begin
DC := GetWindowDc(0); // Obtenir contexte graphique de l'écran
Result.X := PixDistX * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES);
Result.Y := PixDistY * GetDeviceCaps(DC,VERTSIZE) / GetDeviceCaps(DC,VERTRES);
end;
begin
//aPixDistXY := Mesurer(w, h); // ces variables W et H à mon avis foirent
// puisqu'en mesurant en Screen, afin de comparer, c'est bien mieux (à un centimètre près)
aPixDistXY := Mesurer(Screen.Width, Screen.Height); // Ok oui mieux...
result := FormatFloat('####.##" mm"',aPixDistXY.X) + ' x '
+FormatFloat('####.##" mm"',aPixDistXY.Y);
end;
J'ai pas trop le temps de rechercher, mais à mon avis tout repose sur ces deux variables.
Mais ce serait intéressant que tous les intervenants disant si au Screen, c'est proche de la réalité ou non.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 18 janv. 2010 à 15:56
« on doit surement pouvoir dépasser »
- Pas à ma connaissance.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 18 janv. 2010 à 15:26
Désolé pour le dfm, j'ai oublié de le copier
Version 7
- ajouté Form2, sur conseil de jean pierre
- limité le déplacement Haut et bas par les touches "pgUp" et "-" à 0
- ajouté coordonnées du rectangle par rapport à l'écran,suite conseil de Caribensila
Le SetForegroundWindow(Self.Handle); préconisé par cincap est déja actif par le FormStyle := fsStayOnTop;
n'est ce pas suffisant ? (question)
Dans FormKeyDown, les limitation (-18-19 et -35-36) doivent surement être adaptées pour chaque version de delphi à cause de la taille des bordures
Le calcul des tailles en mm fonctionne sur mon PC j'ai mesuré 1000 pixels : 254 mm (d'ou la formule)
(en fait j'ai 100 pixel/pouce)
Question : comment faire pour les dimensions de la fenêtre (Form1) soit supérieure à la taille écran dans le cas ou le cadre est positionné à 0
(chez moi ça bloque dès que la form1 à la taille de l'écran : on doit surement pouvoir dépasser ) ?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 18 janv. 2010 à 12:41
@ DUBOIS77
Les ALeft, ATop, ARight, ABottom sont les coordonnées du rectangle par rapport à l'écran. Cela peut être très utile dans certain cas (par exemple pour simuler un clic dans un zone donnée de l'écran).
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 18 janv. 2010 à 11:28
Chouette...
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 18 janv. 2010 à 10:52
Bonjour à toutes et à tous,
Je confirme abscence de Regle1.dfm.
@ DEBIARS
"Une autre bricole : Form1.FormStyle à StayOnTop pour que la règle reste au premier plan."
De préférence ceci dans le oncreate:
SetForegroundWindow(Self.Handle);
@+,
Cincap
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 18 janv. 2010 à 10:52
Patience, ça va venir ;-)
Kodeur
Messages postés5Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention19 janvier 2010 18 janv. 2010 à 10:45
Sous D6 Pro effectivement : Erreur fichier non trouvé Regle1.dfm
cs_lebidouilleur
Messages postés6Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention 7 septembre 2009 18 janv. 2010 à 08:42
le fichier regle1.dfm n'est pas dans le Zip.
est-ce normal?
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 16 janv. 2010 à 17:03
Restera cette histoire de pixels pas toujours carrés suivant le type d'écran !
Pour le hint = super !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 16:26
pour le hint, voila :
//------------------------------------------------------------------------------{Resize}
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
var p,a,e,z:string;
begin
Adapte;
e := TaillePixel(P1.Width,P1.height);
// p := TailleMM(P1.Width,P1.height);
p := NewTaille(P1.Width,P1.height);
a := Angle(P1.Width,P1.height);
z := e + '/' + p + '/' + a;
P1.Caption := z;
P1.Hint := z; ///////<- c'est la
Hint := z; ///////<- c'est la
Caption := Format('[ %d x %d pix / %s / %s ] - %s %s',
[P1.Width,P1.height,p,a,projet,version]);
end;
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 16:14
C'est quoi les ALeft, ATop, ARight, ABottom ?
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 16:12
Pour les dimensions en mm, c'est effectivement pas trop fiable
pour mon ecran de 365 mm (au triple décimètre) la règle (avec le sqrt) m'indique 350 mm
J'ai essayé par tatonnement et (chez moi) cette fonctions donne de bon résultats :
function NewTaille(w,h:integer):string;
function mesure(P:Double):Double;
//begin result := p * 25.4 / Form1.PixelsPerInch; end; // pas efficace
begin result := p * 25.4 / 100; end; // ça c'est bon pour mon écran
begin
result := FormatFloat(' ###.#',Mesure(w))
+ ' x '
+ FormatFloat('###.#" mm" ',Mesure(h));
end;
le coefficient "100" est à adapter à chaque machine à priori
Etonnant, la propriéte Form1.PixelsPerInch est par défaut à 96
j'ai essayé de mettre le coefficient à 96 et bien sur ce n'est pas bon
En fait il faut peut être avoir une mesure en x et Y indépendante avec le coeff qui va bien
Quen pensez vous ?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 16 janv. 2010 à 15:41
Puisqu'on fait de la programmation en direct-live, moi j'veux aussi les ALeft, ATop, ARight, ABottom... lol
Et en profiter pour changer le titre 'règle..." par "instrument de mesure..." ;)
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 15:38
en live !!
pour déplacer la fenêtre
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=33 then top := top - 1; // touche -
if key=34 then top := top + 1; // touche +
if key=109 then left := left - 1; // touche PgDn
if key=107 then left := left + 1; // touche PgUp
if key=37 then begin width := width - 1; adapte end;
if key=39 then begin width := width + 1; adapte end;
if key=38 then begin height := height - 1; adapte end;
if key=40 then begin height := height + 1; adapte end;
end;
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 16 janv. 2010 à 15:14
Par contre, les distances mesurées en millimètres sont (en mon cas) dans le choux.
Sur un écran de presque 50 cm de large, j'ai dans les 32 cm de trouvés.
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 16 janv. 2010 à 15:02
Damned, Roger, tu as été un poil plus rapide que moi...
C'est bien de pouvoir ajuster la longueur et la hauteur, mais ce qui est également bien, c'est de pouvoir, de même, positionner la règle en augmentant ou diminuant Top et Left.
La valse des versions n'est peut-être pas finie...
...alors A+
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 16 janv. 2010 à 15:02
Hé oui au niveau des mesures assez petites, cas ou il est impossible de lire les coordonnées ; le double-clic s'avère indispensable.
Une autre idée serait tip-top : un hintage.
Ce cette façon ce serait plus pratique et non ponctuel. Pas besoin de double-cliquer, il suffirait d'attendre un court instant.
Ou encore mieux et plus simple : une Form secondaire très étroite disposée en Bottom. Cette Form ferait office de barre de notification, en recueillant les coordonnées. Ce serait le panard !
En tous les cas : bravo encore.
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 16 janv. 2010 à 14:55
Pour utiliser VK_LEFT, il faut remplacer FormKeyPress par FormKeyDown pour lequel Key est un WORD...
J'ai tracé un triangle rectangle sur une feuille A4 que j'ai scanné.
Résltat : une image 2484x3496. Après quelques essais, en réduisant l'image à une largeur de 800 pixels j'ai obtenu l'angle ainsi qe les dimensions en mm exactes de mon dessin.
Il me reste maintenant à trouver le bon rapport pour mon imprimante.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 14:45
J'ai trouvé poue les fléches, il faut utiliser
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=37 then begin width := width - 1; adapte end;
if key=39 then begin width := width + 1; adapte end;
if key=38 then begin height := height - 1; adapte end;
if key=40 then begin height := height + 1; adapte end;
end;
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 16 janv. 2010 à 14:11
J'ai posté la MàJ 5 qui prend en compte les différentes remarques de chacun
avec une modif supplémentaire, car sur mon portable, la distance en mm n'était pas bonne avec la function mesurer d'origine (d'ou la bonne remarque de Caribensil sur l'importance des pixels carrés, contrairement à ce que j'avais répondu) :
//-------------------------------------
function Mesurer(PixDist:Double):Double;
//PixDist est une mesure en pixels.
var DC : HDC;
begin
DC := GetWindowDc(0);
//Obtenir contexte graphique de l'écran
Result := PixDist * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES)
end;
Je l'ai modifiée comme ceci :
//-------------------------------------
function Mesurer(PixDist:Double):Double;
var DC:HDC; d:double;
begin
DC := GetWindowDc(0);
d := PixDist * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES);
Result := d / sqrt(2);
end;
J'ai également rajouter un double clis qui donne le résultat lorsque la fenêtre est très petite
c'est plus conforme (chez moi) à mon double décimètre en bois !
Qu'en est-il chez vous ?
Faut-il laisser comme cela ?
Pour Jean Pierre :
le Qt est un résidu d'essai d'utilisation des fléches clavier pour affiner une mesure (j'ai abandonné car je ne sais pas quel code à mettre dans le if Key = , pour le faire marcher : j'ai essayé :
if Key = VK_LEFT then begin width := width-1; adapte end;
ça n'a pas marché : erreur : type incompatible
ce qui est normal puisque VK_LEFT est un Word alors que Key est un char)
cs_Jean-Pierre
Messages postés82Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention20 avril 2010 16 janv. 2010 à 11:35
Salut,
Moi je dis bravo et merci pour cette riche idée !
Je donne un 8/10.
J'aurais même mis 9 si l'indentation correcte à l'esprit Pascal, était présente.
PS : en uses "Qt" servait à quoi ? car j'avais une erreur à ce niveau et l'ai viré.
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 15 janv. 2010 à 19:08
Salut Roger,
Il te manque l'unité Windows dans les uses. La procédure marche impeccable et les pixels sont bien carrés. Pour mon écran 1280x1024, je trouve largeur du pixel 0,2633 mm et hauteur 0,2637 mm.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 15 janv. 2010 à 17:41
Bonjour Pierre
Bonne remarque mais j'ai essayé cette procédure
et mon aide delphi ne trouve pas HDC,GetWindowDc(0) et GetDeviceCap donc je ne sais pas quelle unité il faut que j'ajoute dans les uses pour que cela marche !
si tu peux m'aider ?
Pour les pixels carrés ... cà ne doit pas jouer de façon réellement perceptible, non ?
Cordialement
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 15 janv. 2010 à 01:46
PS: Et surtout, attention pour l'angle avec cette histoire de pixels rectangulaires !
yvessimon
Messages postés637Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 9 janvier 2017 13 janv. 2010 à 08:44
Bonjour,
Affiche l'angle d'une diagonale , ce qui permet d'avoir un angle soit avec horizontale soit la verticale.
Salutations
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 12 janv. 2010 à 15:17
et pour pouvoir lire les petite valeurs, modification u caption :
Caption := Format('%d / %d - %s %s',[P1.Width,P1.height,projet,version]);
on met les valeurs d'abord, la réclame après !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 12 janv. 2010 à 15:07
Et on peut aussi limiter Form1.Constraints.MinHeight à 58 (mini 1 pixel en hauteur)
la largeur se bloque toute seule à la bonne valeur (sur mon PC)
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 12 janv. 2010 à 14:55
Oui effectivement c'est mieux !
par contre pour revenir au popup, (qui marche chez moi) après avoir fait "Top" qui décale la règle vers le haut, à la première modification de taille, la fenêtre redescend toute seule d'une dizaine de pixel ! ??
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 12 janv. 2010 à 14:09
Je compile également avec Delphi 7...???
Une autre bricole : Form1.FormStyle à StayOnTop pour que la règle reste au premier plan.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 12 janv. 2010 à 10:14
Salut Jean Pierre
C'est bizarre, chez moi ça marche
Je compile avec delphi 7.0 (Build 4.453)
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 12 janv. 2010 à 09:49
Salut Roger,
Autre bémol, le click droit ne popup rien du tout, quel que soit l'endroit où je l'exécute. Après essai, cela est dû à la transparence de la forme.
J'ai donc rajouté dans FormKeyPress le déclenchement du popup par l'appui sur la touche espace...
if Key = #32 then PopupMenu1.Popup(Left+50, Top+50);
jp :-)
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 11 janv. 2010 à 18:00
Bonjour Jean Pierre
Merci pour le conseil (voir version 2)
Peut être devrais je garder les deux ans le cas ou on mesure tout en haut (utilisation du popup "Top" ?
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 11 janv. 2010 à 15:35
Intéressant.
Petit ennui : les dimensions sont parfois difficiles à lire...mélange avec le fond...
j'ai donc remplacé dans FormCanResize, P1.Caption := par
23 janv. 2010 à 11:34
@ Jean-Pierre : Idem ton lien http://www.cthing.com/Meazure.asp
Merci à vous !
22 janv. 2010 à 19:04
www.oldware.org/download.php?download=791
22 janv. 2010 à 07:59
(merci pour la note)
il semblerai que ce soit le picPick mentionné plus haut par JP DEBIARS
22 janv. 2010 à 07:57
tu peux essayer celà : (le code couleur delphi est dans le presse papier en sortant)
il suffit d'un TColorDialog,un Tpanel, un Tbutton et un Tedit :
unit Nuancier1;
//---------------------------------------------------------------------------
interface
//---------------------------------------------------------------------------
uses Forms, StdCtrls, Classes, Controls, Dialogs, SysUtils, ExtCtrls ;const projet 'xxx'; version '1';
Type
TForm1 = class(TForm)
C1: TColorDialog;
Panel1: TPanel;
Edit1: TEdit;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1Click(Sender: TObject);
private
{ Déclarations privées }
public
procedure INIT;
procedure QUITTER;
end;
var
Form1: TForm1;
//---------------------------------------------------------------------------
implementation
//---------------------------------------------------------------------------
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject); begin Quitter end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key=#27 then QUITTER; end; // nécessite Form1.keypreview := true
procedure TForm1.QUITTER;
begin
edit1.SelectAll;
edit1.CopyToClipboard;
application.Terminate
end;
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject); begin INIT end;
procedure TForm1.INIT;
begin
Form1.keypreview := true; // pour quitter avec ESC, si pas déjà dans DFM
setbounds(0,0,170,29)
end;
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
if C1.Execute then
begin
edit1.Text := inttostr(C1.Color);
edit1.Color := C1.Color;
end;
end;
procedure TForm1.Edit1Click(Sender: TObject);
begin
if C1.Execute then
begin
edit1.Text := inttostr(C1.Color);
edit1.Color := C1.Color;
end;
end;
end.
+ le DFM :
object Form1: TForm1
Left = 402
Top = 120
BorderIcons = []
BorderStyle = bsNone
Caption = 'Nuancier'
ClientHeight = 88
ClientWidth = 263
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
KeyPreview = True
OldCreateOrder = False
OnCreate = FormCreate
OnKeyPress = FormKeyPress
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 169
Height = 26
Caption = 'Panel1'
Color = 8404992
TabOrder = 0
object Edit1: TEdit
Left = 3
Top = 2
Width = 120
Height = 21
TabOrder = 0
Text = 'Clic'
OnClick = Edit1Click
end
object Button2: TButton
Left = 123
Top = 3
Width = 42
Height = 21
Caption = 'Quitter'
TabOrder = 1
OnClick = Button2Click
end
end
object C1: TColorDialog
Left = 24
Top = 32
end
end
21 janv. 2010 à 21:51
notons Monsieur Dubois
21 janv. 2010 à 21:50
c'est vrai que les conversions de pixels à millimètres correspondent à la taille à l'impression
Après chacun se fait sa "règle de 3" s'il veut pour faire correspondre les pixels à la taille réelle de son écran mais ce n'est pas le plus important
le tout c'est que ça corresponde à la taille à l'impression
21 janv. 2010 à 21:31
il y a cette aussi réglette transparente qui est pas mal (à adapter):
http://delphi.about.com/od/fullcodeprojects/ss/screen_ruler.htm
20 janv. 2010 à 16:04
La diagonale, par exemple, qui a l'air d'amuser Blueperfect, permet, en deux mesures, de connaître les dimensions d'un rectangle incliné.
En tout cas, cela a mis un peu d'animation sur Delphifr.
Cordialement
20 janv. 2010 à 15:36
N'empêche que dans le programme recommandé par Debiars (un Jean-Pierre aussi), aucune mesure en millimètres n'est possible ;-)
20 janv. 2010 à 12:51
Effectivement c'est autre chose
On oublie la règle !
20 janv. 2010 à 10:54
De plus je te remercie pour ta recommandation de PicPick, je l'ai déjà essayé et adopté !
Surtout pour son option "palette de couleurs, qui donne directement la couleur Delphi.
19 janv. 2010 à 22:41
19 janv. 2010 à 21:04
Mais non,mon cher Jean-pierre, au contraire, je pense avoir fait le tour du sujet...
D'ailleurs Dubois77 a très bien compris mes explications, puisqu'il les applique dans sa dernière fonction Taille.
Il existe un petit logiciel nommé PicPick que l'on trouve sur le net, et qui offre une réglette graduée en pixels, un raporteur et divers outils dont des captures d'écran de format variées. A voir.
19 janv. 2010 à 20:59
19 janv. 2010 à 20:50
19 janv. 2010 à 20:45
Et vous ?
19 janv. 2010 à 20:25
Une question bête, la différence ne serait pas liée à la résolution de l'écran utilisée ?
19 janv. 2010 à 20:18
Son écran devait dater un peu ;-)
19 janv. 2010 à 20:03
Mais pôôô trop sur les dalles des écrans plats !
19 janv. 2010 à 19:59
sur mon portable le "screen ruller m'affiche 495 mm pour mon écran qui en fait 368
!
19 janv. 2010 à 19:55
Laquelle, vu les réglages possibles sur tous les moniteurs, ne sera de toute façon jamais très précise.
Par contre, là où ça devient très intéressant, c'est de pouvoir prévoir les dimensions d'un objet après impression.
Je n'ai, hélas, pas le temps d'approfondir en ce moment, mais il me semble bien avoir vu des sources qui le faisaient... Car, au niveau logiciel, un Canvas est un Canvas, quelque soit le proprio.
19 janv. 2010 à 19:36
Je suis fin près pour l'interrogation lol !
@ Kodeur, oui oui, lien très intéressant, merci !
Mais une chose tout de même m'interpelle ; quel besoin avons nous réellement de la mesure millimétrique ?
Car le millimètre au niveau écran est une notion abstraite, voire virtuelle, en quelque sorte, non ?
Bref, je viens de regarder ce que donne la version à Zarko.
J'ai pris une lettre au format de 230 mm de long.
Après mesure, cela donne 219 mm (axe X). Alors de 230 mm réels à 219 mesurés...
Mon écran mesure à peu près 470 mm (axe X), la mesure me donne dans les 450 mm.
Ceci dit, une solution doit exister permettant d'obtenir le millimètre. Ne cédons pas à la facilité ; ce n'est pas une qualité de programmeur.
@ suivre ;-)
19 janv. 2010 à 18:06
http://delphi.about.com/od/fullcodeprojects/ss/screen_ruler.htm
19 janv. 2010 à 17:43
dans le type
public
function Taille:string;
//-------------------------------------------------------------------------
function TForm1.Taille:string; // marche sur mon PC
var W,H:integer;
begin
W:=368; // à définir suivant votre écran : taille réelle en mm
H:=230; // à définir suivant votre écran
result := FormatFloat(' ####.##" x"', w / screen.Width * P1.width)
+ FormatFloat(' ####.##" mm" ',h / screen.Height * P1.height)
+ FormatFloat('"/ = "####.##" mm "',sqrt( sqr
(w/screen.Width*P1.width) + sqr(h/screen.Height*P1.height) ) );
end;
//-------------------------------------------------------------------------
procedure TForm1.FormCanResize;
var p,a,e,z:string; mm :TpixDistXY;
begin
Adapte;
p := Taille;
e := TaillePixel(P1.Width,P1.height);
a := Angle(P1.Width,P1.height);
z := e + '/' + p + '/' + a;
P1.Hint := z;
Hint := z;
z := format('[ %d x %d pix / %s / %s ] - ALeft=%d ATop=%d ARight=%d ABottom=%d',
[P1.Width,P1.height,p,a, Left+17,top+35,Left+17+p1.Width,Top+35+p1.Height]);
form2.caption := z;
end;
19 janv. 2010 à 15:55
Je me suis un peux trop fixé sur mon écran qui est "parfait".
Je viens de faire un test avec un NetBook 1024x600 et là ça ne colle plus, Mesure me donne des renseignements faux, donc, dans ce cas, on laisse tomber Mesure.
On peut modifier Regle soit en ajoutant la saisie des dimensions en mm mesurées à la main, soit en les mettant en constantes dans le programme.
On calcule ensuite :
largeur du pixel en mm = largeur de l'écran en mm / Screen.Width
hauteur du pixel en mm = hauteur de l'écran en mm / Screen.Height
Avec ces deux données tu peux calculer la dimension en mm à partir d'un nombre de pixels donné en tenant compte, bien entendu, du sens largeur ou hauteur.
Tu peux également calculer le nombre de pixels par mm en divisant les dimensions de l'écran par le dimensions en mm, ce qui te permet de faire les conversions mm vers pixels.
J'espère m'être bien fait comprendre... Demain, interrogation écrite.
A+ ou pas.
19 janv. 2010 à 14:56
mm := Mesurer(Screen.Width, Screen.Height); // Ok oui mieux...
caption := FormatFloat('####.##" mm"',mm.X) + ' x '
+FormatFloat('####.##" mm"',mm.Y);
me renvoie ma taille écran à 508x318 mm alors qu'il fait réellement 370x230 mm
ou est le bug ?
Comment fais-tu Jean Pierre pour avoir la taille d'un pixel en largeuru et hauteur ?
19 janv. 2010 à 14:30
Voyons, où est le problème ?
La procédure Mesurer te les dimensions de l'écran en mm. Une simple division des tailles en mm par les tailles en pixels te permet de trouver la largeur et la hauteur du pixel en mm.
Supposons que tu veuilles tracer un carré de 100 mm à l'écran. Il te suffit donc de multiplier les dimensions du pixel par 100 pour trouver largeur et hauteur du carré en pixels et cela même si le pixel n'est pas carré, auquel cas il te faudra plus de pixels dans un sens que dans l'autre.
Inversement, diviser la taille en pixels par la taille en mm te donne le nombre de pixels par mm...
19 janv. 2010 à 12:00
Es-t-il dont impossible de déterminer la taille exacte d'un pixel suivant les différents types d'écrans ?
19 janv. 2010 à 11:40
Cela me permet de "coloriser" la règle selon l'humeur du moment, entre autres avantages.
19 janv. 2010 à 09:50
Pour une distance réelle mesurée sur un papier de 100 mm :
Axe X = la règle affiche 96,4 mm
Axe Y = la règle affiche 92,5 mm
Je précise que la mesure en Screen est plus proche de la réalité, que la précédente méthode.
Mais c'est pas encore la précision... Ah, ces écrans plats !
19 janv. 2010 à 09:21
(pour une distance réelle mesurée de 100 mm, la régle m'affiche avec cette méthode 138.6 !
19 janv. 2010 à 09:20
Bon j'ai remis la function mesurer de Caribensila
(elle ne marche pas chez moi)
quant à la diagonale, il suffit de rajouter :
mm2 := mesurer(P1.Width,P1.height);
FormatFloat('" Diag="####.#" mm "',sqrt( sqr(mm2.x) + sqr(mm2.y)) );
mais comme chez moi les mm ne marchent pas avec cette méthode, je ne le rajoute pas pour l'instant
(pour une distance réelle mesurer de 100 mm, la régle m'affiche avec cette méthode 138.6 !
du coup je me suis compilé un exe avec ma version (avec diagonale) pour pouvoir l'utiliser)
19 janv. 2010 à 08:07
18 janv. 2010 à 23:26
18 janv. 2010 à 20:48
aPixDistXY := Mesurer(Form1.P1.Width, Form1.P1.Height);
De cette façon plus besoin des variables w et h partant en vrille sur mon écran.
Bien mieux non ?
18 janv. 2010 à 20:20
Car en appliquant la méthode à Cari, c'est nettement mieux, démonstration :
function Taille(w, h: integer): string;
var
aPixDistXY: TPixDistXY;
function Mesurer(const PixDistX, PixDistY:Integer) : TPixDistXY;
// PixDistX est une mesure en pixels.
var DC : HDC;
begin
DC := GetWindowDc(0); // Obtenir contexte graphique de l'écran
Result.X := PixDistX * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES);
Result.Y := PixDistY * GetDeviceCaps(DC,VERTSIZE) / GetDeviceCaps(DC,VERTRES);
end;
begin
//aPixDistXY := Mesurer(w, h); // ces variables W et H à mon avis foirent
// puisqu'en mesurant en Screen, afin de comparer, c'est bien mieux (à un centimètre près)
aPixDistXY := Mesurer(Screen.Width, Screen.Height); // Ok oui mieux...
result := FormatFloat('####.##" mm"',aPixDistXY.X) + ' x '
+FormatFloat('####.##" mm"',aPixDistXY.Y);
end;
J'ai pas trop le temps de rechercher, mais à mon avis tout repose sur ces deux variables.
Mais ce serait intéressant que tous les intervenants disant si au Screen, c'est proche de la réalité ou non.
18 janv. 2010 à 15:56
- Pas à ma connaissance.
18 janv. 2010 à 15:26
Version 7
- ajouté Form2, sur conseil de jean pierre
- limité le déplacement Haut et bas par les touches "pgUp" et "-" à 0
- ajouté coordonnées du rectangle par rapport à l'écran,suite conseil de Caribensila
Le SetForegroundWindow(Self.Handle); préconisé par cincap est déja actif par le FormStyle := fsStayOnTop;
n'est ce pas suffisant ? (question)
Dans FormKeyDown, les limitation (-18-19 et -35-36) doivent surement être adaptées pour chaque version de delphi à cause de la taille des bordures
Le calcul des tailles en mm fonctionne sur mon PC j'ai mesuré 1000 pixels : 254 mm (d'ou la formule)
(en fait j'ai 100 pixel/pouce)
Question : comment faire pour les dimensions de la fenêtre (Form1) soit supérieure à la taille écran dans le cas ou le cadre est positionné à 0
(chez moi ça bloque dès que la form1 à la taille de l'écran : on doit surement pouvoir dépasser ) ?
18 janv. 2010 à 12:41
Les ALeft, ATop, ARight, ABottom sont les coordonnées du rectangle par rapport à l'écran. Cela peut être très utile dans certain cas (par exemple pour simuler un clic dans un zone donnée de l'écran).
18 janv. 2010 à 11:28
18 janv. 2010 à 10:52
Je confirme abscence de Regle1.dfm.
@ DEBIARS
"Une autre bricole : Form1.FormStyle à StayOnTop pour que la règle reste au premier plan."
De préférence ceci dans le oncreate:
SetForegroundWindow(Self.Handle);
@+,
Cincap
18 janv. 2010 à 10:52
18 janv. 2010 à 10:45
18 janv. 2010 à 08:42
est-ce normal?
16 janv. 2010 à 17:03
http://www.codyx.org/snippet_convertir-distance-sur-votre-ecran-pixels-millimetres_464.aspx
Restera cette histoire de pixels pas toujours carrés suivant le type d'écran !
Pour le hint = super !
16 janv. 2010 à 16:26
//------------------------------------------------------------------------------{Resize}
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
var p,a,e,z:string;
begin
Adapte;
e := TaillePixel(P1.Width,P1.height);
// p := TailleMM(P1.Width,P1.height);
p := NewTaille(P1.Width,P1.height);
a := Angle(P1.Width,P1.height);
z := e + '/' + p + '/' + a;
P1.Caption := z;
P1.Hint := z; ///////<- c'est la
Hint := z; ///////<- c'est la
Caption := Format('[ %d x %d pix / %s / %s ] - %s %s',
[P1.Width,P1.height,p,a,projet,version]);
end;
16 janv. 2010 à 16:14
16 janv. 2010 à 16:12
pour mon ecran de 365 mm (au triple décimètre) la règle (avec le sqrt) m'indique 350 mm
J'ai essayé par tatonnement et (chez moi) cette fonctions donne de bon résultats :
function NewTaille(w,h:integer):string;
function mesure(P:Double):Double;
//begin result := p * 25.4 / Form1.PixelsPerInch; end; // pas efficace
begin result := p * 25.4 / 100; end; // ça c'est bon pour mon écran
begin
result := FormatFloat(' ###.#',Mesure(w))
+ ' x '
+ FormatFloat('###.#" mm" ',Mesure(h));
end;
le coefficient "100" est à adapter à chaque machine à priori
Etonnant, la propriéte Form1.PixelsPerInch est par défaut à 96
j'ai essayé de mettre le coefficient à 96 et bien sur ce n'est pas bon
En fait il faut peut être avoir une mesure en x et Y indépendante avec le coeff qui va bien
Quen pensez vous ?
16 janv. 2010 à 15:41
Et en profiter pour changer le titre 'règle..." par "instrument de mesure..." ;)
16 janv. 2010 à 15:38
pour déplacer la fenêtre
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=33 then top := top - 1; // touche -
if key=34 then top := top + 1; // touche +
if key=109 then left := left - 1; // touche PgDn
if key=107 then left := left + 1; // touche PgUp
if key=37 then begin width := width - 1; adapte end;
if key=39 then begin width := width + 1; adapte end;
if key=38 then begin height := height - 1; adapte end;
if key=40 then begin height := height + 1; adapte end;
end;
16 janv. 2010 à 15:14
Sur un écran de presque 50 cm de large, j'ai dans les 32 cm de trouvés.
16 janv. 2010 à 15:02
C'est bien de pouvoir ajuster la longueur et la hauteur, mais ce qui est également bien, c'est de pouvoir, de même, positionner la règle en augmentant ou diminuant Top et Left.
La valse des versions n'est peut-être pas finie...
...alors A+
16 janv. 2010 à 15:02
Une autre idée serait tip-top : un hintage.
Ce cette façon ce serait plus pratique et non ponctuel. Pas besoin de double-cliquer, il suffirait d'attendre un court instant.
Ou encore mieux et plus simple : une Form secondaire très étroite disposée en Bottom. Cette Form ferait office de barre de notification, en recueillant les coordonnées. Ce serait le panard !
En tous les cas : bravo encore.
16 janv. 2010 à 14:55
J'ai tracé un triangle rectangle sur une feuille A4 que j'ai scanné.
Résltat : une image 2484x3496. Après quelques essais, en réduisant l'image à une largeur de 800 pixels j'ai obtenu l'angle ainsi qe les dimensions en mm exactes de mon dessin.
Il me reste maintenant à trouver le bon rapport pour mon imprimante.
16 janv. 2010 à 14:45
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=37 then begin width := width - 1; adapte end;
if key=39 then begin width := width + 1; adapte end;
if key=38 then begin height := height - 1; adapte end;
if key=40 then begin height := height + 1; adapte end;
end;
16 janv. 2010 à 14:11
avec une modif supplémentaire, car sur mon portable, la distance en mm n'était pas bonne avec la function mesurer d'origine (d'ou la bonne remarque de Caribensil sur l'importance des pixels carrés, contrairement à ce que j'avais répondu) :
//-------------------------------------
function Mesurer(PixDist:Double):Double;
//PixDist est une mesure en pixels.
var DC : HDC;
begin
DC := GetWindowDc(0);
//Obtenir contexte graphique de l'écran
Result := PixDist * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES)
end;
Je l'ai modifiée comme ceci :
//-------------------------------------
function Mesurer(PixDist:Double):Double;
var DC:HDC; d:double;
begin
DC := GetWindowDc(0);
d := PixDist * GetDeviceCaps(DC,HORZSIZE) / GetDeviceCaps(DC,HORZRES);
Result := d / sqrt(2);
end;
J'ai également rajouter un double clis qui donne le résultat lorsque la fenêtre est très petite
c'est plus conforme (chez moi) à mon double décimètre en bois !
Qu'en est-il chez vous ?
Faut-il laisser comme cela ?
Pour Jean Pierre :
le Qt est un résidu d'essai d'utilisation des fléches clavier pour affiner une mesure (j'ai abandonné car je ne sais pas quel code à mettre dans le if Key = , pour le faire marcher : j'ai essayé :
if Key = VK_LEFT then begin width := width-1; adapte end;
ça n'a pas marché : erreur : type incompatible
ce qui est normal puisque VK_LEFT est un Word alors que Key est un char)
16 janv. 2010 à 11:35
Moi je dis bravo et merci pour cette riche idée !
Je donne un 8/10.
J'aurais même mis 9 si l'indentation correcte à l'esprit Pascal, était présente.
PS : en uses "Qt" servait à quoi ? car j'avais une erreur à ce niveau et l'ai viré.
15 janv. 2010 à 19:08
Il te manque l'unité Windows dans les uses. La procédure marche impeccable et les pixels sont bien carrés. Pour mon écran 1280x1024, je trouve largeur du pixel 0,2633 mm et hauteur 0,2637 mm.
15 janv. 2010 à 17:41
Bonne remarque mais j'ai essayé cette procédure
et mon aide delphi ne trouve pas HDC,GetWindowDc(0) et GetDeviceCap donc je ne sais pas quelle unité il faut que j'ajoute dans les uses pour que cela marche !
si tu peux m'aider ?
Pour les pixels carrés ... cà ne doit pas jouer de façon réellement perceptible, non ?
Cordialement
15 janv. 2010 à 01:46
Et pourquoi pas une mesure en mm? ;)
http://www.codyx.org/snippet_convertir-distance-sur-votre-ecran-pixels-millimetres_464.aspx
PS: Et surtout, attention pour l'angle avec cette histoire de pixels rectangulaires !
13 janv. 2010 à 08:44
Affiche l'angle d'une diagonale , ce qui permet d'avoir un angle soit avec horizontale soit la verticale.
Salutations
12 janv. 2010 à 15:17
Caption := Format('%d / %d - %s %s',[P1.Width,P1.height,projet,version]);
on met les valeurs d'abord, la réclame après !
12 janv. 2010 à 15:07
la largeur se bloque toute seule à la bonne valeur (sur mon PC)
12 janv. 2010 à 14:55
par contre pour revenir au popup, (qui marche chez moi) après avoir fait "Top" qui décale la règle vers le haut, à la première modification de taille, la fenêtre redescend toute seule d'une dizaine de pixel ! ??
12 janv. 2010 à 14:09
Une autre bricole : Form1.FormStyle à StayOnTop pour que la règle reste au premier plan.
12 janv. 2010 à 10:14
C'est bizarre, chez moi ça marche
Je compile avec delphi 7.0 (Build 4.453)
12 janv. 2010 à 09:49
Autre bémol, le click droit ne popup rien du tout, quel que soit l'endroit où je l'exécute. Après essai, cela est dû à la transparence de la forme.
J'ai donc rajouté dans FormKeyPress le déclenchement du popup par l'appui sur la touche espace...
if Key = #32 then PopupMenu1.Popup(Left+50, Top+50);
jp :-)
11 janv. 2010 à 18:00
Merci pour le conseil (voir version 2)
Peut être devrais je garder les deux ans le cas ou on mesure tout en haut (utilisation du popup "Top" ?
11 janv. 2010 à 15:35
Petit ennui : les dimensions sont parfois difficiles à lire...mélange avec le fond...
j'ai donc remplacé dans FormCanResize, P1.Caption := par
Caption := Format(' %s %s > %d / %d <',[projet,version,P1.Width,P1.height]);
pour reporter l'affichage dans l'entête de Form1.
Cordialement