bonjour,

voila mon code, je l'explique

je parcoure une base de donné ( sous c++builder 6.0), je lis les données
et je crée un cadre ( genre carte de visite ), avec titre etc...
il ya des ecriture en verticale , des lignes horizontale et verticale pour la decoupe du cadre.

l'exemple

il ya deux cadre par ligne, sur n'importe quelle imprimante Hp sa fontionne tres bien, car j'ai programme les coordonnée dessus "xa,xb,ya,yb". mais pourquoi sur une autre imprimante les impressions ne sont plus les memes ?

je dois faire des coordonnée pour chaque imprimante ou faire un module de test d'impression.
Le passage a une autre page d'impression (page n°2) est automatique du a la taille des cadre que j'ai calculé. ici sous hp sur une page il ya 14 cadres , 2 par ligne


voici le code :
je peux le compresser mais c'est pour y voire plus claire.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void __fastcall TForm1::printClick(TObject *Sender)
{
   int xa,xb,ya,yb,x,y,z;
   xb=20; yb=480; xa=200; ya=1070;
 
   AnsiString data;
 
   TPrinter *Canvas = Printer();
   Canvas->BeginDoc();
   Canvas->Title="CADRE";
 
   TRect TheRect,TheRect2;
   Canvas->Canvas->Brush->Style = bsSolid;
   Canvas->Canvas->Font->Size = 11;
   Canvas->Canvas->Font->Style = TFontStyles()<< fsBold;
 
   DBNavigator->BtnClick(nbFirst);   // debut de la bd
   int tot = Table->RecordCount;     //  nbr d'enregistrement
   tot = (tot / 2) + fmod(tot,2);       //  pair ou impaire , 2 cadre / ligne
   z=1;                                         
 
   for(y=1; y<=tot; y++ ,x=0)
  {
   for(x=1; x<=2 && z<=Table->RecordCount; x++)
   {
     Canvas->Canvas->Brush->Color = clWhite;
     TheRect = Rect(xa,xb,ya,yb);
     Canvas->Canvas->Font->Color = clBlue;
     Canvas->Canvas->TextRect(TheRect, xa+30, xb+30, "CADRE");
     Canvas->Canvas->Font->Color = clGreen;
     Canvas->Canvas->MoveTo ( xa, xb+90);  
     Canvas->Canvas->LineTo(ya,xb+90);
     Canvas->Canvas->Font->Color = clBlack;
 
     data = DBGrid->Fields[0]->Text;
     Canvas->Canvas->TextOut( xa+30, xb+120, "Login : " + data);
     data = DBGrid->Fields[1]->Text;
     Canvas->Canvas->TextOut( xa+30, xb+180, "Code  : " + data);
     data = DBGrid->Fields[3]->Text;
     Canvas->Canvas->TextOut( xa+30, xb+240, "Mode  : " + data);
 
    Canvas->Canvas->Brush->Color = clRed;
    Canvas->Canvas->FrameRect(TheRect);
 
    TheRect2 = Rect(xa-100,xb-10,ya+100,yb+10);
    Canvas->Canvas->Brush->Color = clBlue;
    Canvas->Canvas->FrameRect(TheRect2);
    Canvas->Canvas->Brush->Color = clWhite;
 
    LOGFONT lgfont;
 GetObject( Canvas->Canvas->Font->Handle, sizeof(LOGFONT),&lgfont);
    //Angle *10
    lgfont.lfEscapement = 900; lgfont.lfOrientation = 900;  
    lgfont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
    Canvas->Canvas->Font->Handle = CreateFontIndirect(&lgfont);
    SetGraphicsMode(Canvas->Canvas->Handle, GM_ADVANCED);  
    data = z;
    Canvas->Canvas->TextOut( xa-75, xb+360, "Ticket Nr " + data);
    Canvas->Canvas->TextOut( ya+10, yb, DateTimeToStr(Now()));
 
  GetObject( Canvas->Canvas->Font->Handle, sizeof(LOGFONT), &lgfont);
    lgfont.lfEscapement = 0;  lgfont.lfOrientation = 0;
    lgfont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
    Canvas->Canvas->Font->Handle = CreateFontIndirect(&lgfont);
    SetGraphicsMode(Canvas->Canvas->Handle, GM_ADVANCED);
 
    xa =  (x * ya) + 200;
    ya =  (x +  1) * ya;
    DBNavigator->BtnClick(nbNext);
    z++;
   }
 
    xb=20; yb=480; xa=200; ya=1070;
    xb =  (y * yb) + xb;
    yb =  (y +  1) * yb;
  }
 
 Canvas->EndDoc();
}
en resumé :

comment imprimer un canvas ou un rectangle d'une certaine taille xa,xb,ya,yb ; et que lors d'une impression cette taille est respecté par l'imprimante sous n'importe quelle marque imprimante.

merci d'avance
@++