birdyz
Messages postés42Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 4 septembre 2006
-
11 mars 2003 à 12:23
dphil54
Messages postés6Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention20 février 2005
-
4 juin 2005 à 22:40
Je dois réaliser une édition dans mon appli. Mon soucis est que je doit imprimer le contenu d'un champ memo. Voici le morceau de code censé géré l'apercu de cette valeur.
P := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
LPages.Add(TMetafile.Create);
with TMetafile(LPages[1]) do
begin
Width := Printer.PageWidth;
Height := Printer.PageHeight;
end;
with TMetafileCanvas.Create(TMetafile(LPages[1]), 0) do
begin
Font.PixelsPerInch := P;
while not DataModuleBD.TableDocli.Eof do
begin
Font.Size := 10;
Font.Name := 'Arial';
Font.Style := [];
S := DataModuleBD.TableDocliCommentaire.AsVariant;
R := Rect(Millimetres2PixelsX(22), Millimetres2PixelsY(Position), Millimetres2PixelsX(105), Printer.PageHeight);
DrawText(Handle, PChar(S), length(S), R, DT_LEFT or DT_WORDBREAK);
end;
Free;
end;
Mon problème est de connaitre la hauteur du texte généré (qui est différente chaque fois à cause du DT_WORDBREAK) afin de connaitre la position de départ de la ligne suivante, et de gérer les saut de pages.
Si j'utilise Printer.Canvas.TextHeight(S), il me donne la même valeur, vu qu'il considère S comme étant une seule ligne de texte.
Si vous avez une solution, elle serais la bienvenue.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 11 mars 2003 à 16:10
Ouais... En fait, il faudrait que ta chaine contienne déjà les retour chariots... Et encore, ce n'est même pas sur que ça marcherait !
Tu pourrais peut-être faire une boucle, en essayant de connaitre la hauteur maximale de la police que tu utilises, et en connaissant la largeur maximale à prendre pour une ligne ?!
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 11 mars 2003 à 20:07
Si c'est pour imprimer simplement le contenu d'un memo, tu te compliques bien la vie. Un aperçu avant impression ? pour quoi faire puisque celà ne donnera rien de plus que le contrôle memo !
Voici un code hyper simple mais qui fonctionne parfaitement :
uses
printers;
procedure TForm1.FormDblClick(Sender: TObject);
var
F: TextFile;
i : integer;
begin
AssignPrn(F);
Rewrite(F);
for i:= 0 to Memo.Lines.Count - 1 do
Writeln(F, Memo.Lines[i]);
System.CloseFile(F);
end;
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 12 mars 2003 à 20:01
Désolé, mais ce n'était pas précisé...
Alors, effectivement, c'est un vrai casse-tête à réaliser et l'on finit toujours à revenir à un bon générateur d'états.
May Delphi be with you
dphil54
Messages postés6Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention20 février 2005 4 juin 2005 à 22:40
DrawText retourne un integer qui correspond à la hauteur du texte
Exemple:
//Ecrit en blanc sur blanc (le texte n'est dons pas affiché)
S := Memo1.Text;
R1.Top := VPx(Bord1 +15);
Printer.Canvas.Font.Color := clWhite;
X := DrawText(Printer.Canvas.Handle, PChar(S), length(S), R1, DT_LEFT or DT_WORDBREAK);
//recupere la hauteur du texte et redéfinit la premiere ligne d'impression
Printer.Canvas.Font.Color := clWindowText;
R1.Top := VPx(Bord1 +15) + 730 - (X div 2);
DrawText(Printer.Canvas.Handle, PChar(S), length(S), R1, DT_LEFT or DT_WORDBREAK);