Pb hauteur lors d'une édition

birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006 - 11 mars 2003 à 12:23
dphil54 Messages postés 6 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 20 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.

Merci d'avance

8 réponses

cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
11 mars 2003 à 13:45
Tu ne peux pas utiliser l'API TextHeight ??

Mais je ne sais pas si c'ets applicable pour un aperçu d'impression...

Bonne prog' !
[mailto:bestiol@cario.fr Bestiol.]
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
11 mars 2003 à 13:49
Ben j'ai essayé, mais il considère que je n'ai qu'un seule ligne, donc la valeur renvoyé est toujours la même.

Je l'ai utilisé comme ceci
Printer.Canvas.TextHeight(S)
En sachant que S est typé string.
0
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
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 ?!

Bonne prog' !
[mailto:bestiol@cario.fr Bestiol.]
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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;

May Delphi be with you
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
12 mars 2003 à 09:12
Effectivement, c'est très pratique, mais je n'ai pas que le contenu du mémo à imprimer
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 mars 2003 à 09:26
Je crois que c'est ce que je vais faire dans un premier temps, puis je me recasserais les dents dessus quand l'apply sera fini

Merci à tous pour votre aide.
0
dphil54 Messages postés 6 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 20 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);
0
Rejoignez-nous