Pour afficher un montant dans un imprimé
Comme ce qui est montré dans l'image
Comment puis-je faire
j'ai utilisé delphi7 et absolute database
Pour afficher un montant dans un imprimé
Comme ce qui est montré dans l'image
Comment puis-je faire
j'ai utilisé delphi7 et absolute database
Il n'y a rien de tout prêt pour remplir les cases d'un formulaire pré-imprimé
Dans ton outil de rapport, cherche si tu as options d'espace des caractères dans un libellé et un alignement à droite
Sinon, il y a aussi TabbedTextOut ou encore ExtTextOut
Séparer les chiffres du montant un par un et les placer par tâtonnement jusqu'à la bonne position !
Convertir le montant en chaine de caractère et utiliser la fonction copy qui permet d'extraire les caractères un à un.
Voir l'aide de Delphi.
J'ai travaillé (autrefois avec dBase 3+ : il y a avait une fonction qui permettait d'extraire un ou plusieurs caractères d'une chaine. Je l'ai réécrite en Delphi et elle me sert bien. Si ça peut t'aider
xZone est la chaine que tu traites (ton montant que tu auras converti en string)
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 Function SUBSTR(xZone : String; xDebut, xLongueur : integer) : string; var xTemp : string; xLen, xTotal : integer; begin xTotal := Length(xZone); xLen := Length(xZone)+1-xDebut; if xDebut>xTotal then begin Result := ''; exit end; xTemp := RightStr(xZone,xLen); xLen := Strlen(Pchar(xTemp)); if xLongueur>xLen then Result:=xTemp else Result := LeftStr(xTemp,xLongueur); end;
xDebut est la position du premier caractère à extraire : chez toi cela ira de 1 à la longueur de ton nombre
xLongueur est le nombre de caractères à extraire : chez toi toujours 1
la fonction renvoie le (toujours chez toi) ou les caractères extraits
Ensuite, comme il t'est suggéré, tu mets des espaces entre les chiffres que tu as extraits et là, en effet, il va y avoir du tâtonnement
Bon courage
Bonjour
S'il vous plaît corriger la mauvaise
Ceci est une tentative, mais je ne savais pas que c'était vrai ou pas
OBS
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 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; Function SUBSTR(xZone : String; xDebut, xLongueur : integer) : string; var Form1: TForm1; implementation {$R *.dfm} Function SUBSTR(xZone : String; xDebut, xLongueur : integer) : string; var xTemp : string; xLen, xTotal : integer; begin xTotal := Length(xZone); xLen := Length(xZone)+1-xDebut; if xDebut>xTotal then begin Result := ''; exit end; xTemp := RightStr(xZone,xLen); xLen := Strlen(Pchar(xTemp)); if xLongueur>xLen then Result:=xTemp else Result := LeftStr(xTemp,xLongueur); end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption:=SUBSTR(Edit1.Text); Label2.Caption:=SUBSTR(Edit1.Text); Label3.Caption:=SUBSTR(Edit1.Text); Label4.Caption:=SUBSTR(Edit1.Text); end; end.
Edit1 = 2346
SUBSTR n'est-ce pas la même que la routine intrinsèque de Delphi Copy qui doit exister au moins depuis D4 (en D3, c'est moins sûr, les tableaux dynamiques n'existaient pas, donc probablement pas Copy)
Sinon, tu n'as toujours pas indiquer l'outil de rapport ? QuickReport ? RaveReport ? ReportBuilder ? CrystalReport ?
OBS ???
medreg, merci de faire un peu plus d'effort !
Tu nous fait quelle tentative ??? SUBSTR nécessite trois paramètres, tu n'en passes qu'un, cela ne compile même pas !
Oubli SUBSTR, ce n'est pas la solution, l'utilisation de [] permet de récupérer un par un chaque caractère d'une chaine !
Ce sujet évoquait le Padding par la droite par des espaces :
Chaine de caractères avec des espaces
On peut rapidement adapter l'utilisation StringOfChar pour un bourrage par la gauche !
J'ignore si des fonctions de Pad (comme PadLeft) plus simple que Format existe ou pas en XE2 mais en D7, on peut écrire :
Une fois que l'on a la taille nécessaire, on peut donc facilement écrire ceci (code théorique dépendant de l'outil de rapport, là, je le fais avec une table contenant 12 champ)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := Format('%-12s',[Edit1.Text]); // Avant Label2.Caption := Format('%12s', [Edit1.Text]); // Après end;
mais on pouvait AUSSI le faire SANS le Pad
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TForm1.Button2Click(Sender: TObject); var i: Integer; begin for i := 1 to 12 do ReportDataSet.FieldByName('ChiffreNombre'+IntToStr(i)).AsString := Label1.Caption[i]; end;
Il suffit sur le Rapport de poser 12 DBText à l'emplacement voulu, d'affecter à chacun les champ ChiffreNombre1 à ChiffreNombre12
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.Button3Click(Sender: TObject); var i: Integer; begin for i := 1 to 12 - Length(Edit1.Text) do ReportDataSet.FieldByName('ChiffreNombre'+IntToStr(i)).Clear(); for i := 12 to 12 - Length(Edit1.Text) + 1 do ReportDataSet.FieldByName('ChiffreNombre'+IntToStr(i)).AsString := Edit1.Text[i]; end;
Si pas d'outil de Rapport mais une impression via le Canvas du TPrinter,
la fonction ExtTextOut permet de gérer les espacement en pixel
la fonction TabbedTextOut nécessite d'avoir des Tabulations et sera donc plus complexe d'utilisation
Tu peux le tester dans un TImage.Picture.Bitmap.Canvas au lieu de Printer.Canvascomme ceci en C++Builder (je n'ai pas Delphi)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SetTextAlign(Printer.Canvas.Handle, TA_RIGHT); SetTextCharacterExtra(Printer.Canvas.Handle, 10); ZoneImprime := Rect(0, 0, 200, Printer.Canvas.TextHeight(Edit1.Text)); ExtTextOut(Printer.Canvas.Handle, 50, 50, ETO_CLIPPED, @ZoneImprime, PChar(Edit1.Text), Length(Edit1.Text));
qui doit donner en Delphi (traduction théorique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Image1->Picture->Bitmap->Canvas->Brush->Style = bsClear; Image1->Picture->Bitmap->Canvas->Font->Color = clRed; Image1->Picture->Bitmap->Canvas->Font->Size = 20; Image1->Picture->Bitmap->Canvas->Font->Name = "Comic Sans MS"; Image1->Picture->Bitmap->Canvas->Font->Style = TFontStyles() << fsBold << fsUnderline; Image1->Picture->Bitmap->Canvas->TextOut(100, 100, "Texte Normal"); SetTextCharacterExtra(Image1->Picture->Bitmap->Canvas->Handle, 10); Image1->Picture->Bitmap->Canvas->TextOut(100, 150, "Texte Espacé");
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 with Image1.Picture.Bitmap.Canvas do begin Brush.Style = bsClear; Font.Color = clRed; Font.Size = 20; Font.Name = 'Comic Sans MS'; Font.Style = [fsBold, fsUnderline]; TextOut(100, 100, 'Texte Normal'); SetTextCharacterExtra(Handle, 10); TextOut(100, 100, 'Texte Espacé'); end;
Copy existait déjà en d3 (je l'utilise a fond en ce moment même ) , de toute façon Medreg indiquait D7 (sans pour autant préciser son outil de reporting , Quickreport je pense)Envoyé par ShaileTroll
@Medreg On a vraiment l'impression que tu ne fais aucun effort
bonjour Mr
Merci pour votre aide
Mais je ne comprenais rien de ce que j'ai présenté
J'espère me mettre un exemple
J'ai des dirigeants de données avec un champ de type real
Et un champ de type texte
Je veux mettre le contenu de chaque champ dans le composant par le nombre de lettres par la vigueur
C'est l'annexe de la loi modifiée
N'ayant pas Delphi ni QuickReport (enfin nous avons l'information), je ne peux que spéculer !
Déjà mélanger DBEdit et QuickRep, je n'avais jamais osé !
Je ne vois pas ce que tu poses problèmes, utilises donc 12 TQRLabel (j'ai pris QRLabel11 à QRLabel22) dans chacun tu mets une lettre de Montant, suffit juste de les mettre les un à coté des autres, avec des TQRShape tu fais les traits ...
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 procedure TForm1.Button3Click(Sender: TObject); var i: Integer; MontantText: string; cpt: TComponent; lbl: TQRLabel; begin MontantText := DataSource1.DataSet.FieldByName('Montant').AsString; for i := 1 to 12 - Length(MontantText) do begin cpt := Self.FindComponent('QRLabel' + IntToStr(i + 10)); if cpt is TQRLabel then TQRLabel(cpt).Caption := 'X'; // tu mettras ''; end; for i := 12 downto 12 - Length(MontantText) + 1 do begin cpt := Self.FindComponent('QRLabel' + IntToStr(i + 10)); if cpt is TQRLabel then TQRLabel(cpt).Caption := MontantText[i]; end; end;
Tu peux aussi un TClientDataSet intermédiaire entre Table1 et TQuickRep (et ses TQRDBLabel au lieu de TQRLabel simple) et reprendre mes autres exemples
Tu ne comprends pas ce que tu fais ??? Moi je ne comprends pas ce que tu écrits !
Les QRLabel.Caption semblent être la solution la plus facile , maintenant attention à la virgule !
La virgule sera gérée comme les autres chiffres du montant !
Vu que le nombre de chiffres à placer n'est pas aussi important que ça, on peut se passer de la boucle, s'il la juge compliquée !
On peut informer les QRLabels manuellement !
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 MontantText := PadLeft(MontantText, ' ', 15); //ou MontantText := PadLeft(MontantText, '0', 15); QRLabel1.Caption := MontantText[1]; QRLabel2.Caption := MontantText[2]; QRLabel3.Caption := MontantText[3]; QRLabel4.Caption := MontantText[4]; QRLabel5.Caption := MontantText[5]; QRLabel6.Caption := MontantText[6]; QRLabel7.Caption := MontantText[7]; QRLabel8.Caption := MontantText[8]; QRLabel9.Caption := MontantText[9]; QRLabel10.Caption := MontantText[10]; QRLabel11.Caption := MontantText[11]; QRLabel12.Caption := MontantText[12]; QRLabel13.Caption := MontantText[13]; QRLabel14.Caption := MontantText[14]; QRLabel15.Caption := MontantText[15];
merçi pour aide mais le code ne marche pas
voila le code
mais il me donnee un message d'erreur
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 var MontantText: string; begin MontantText := DataSource1.DataSet.FieldByName('Montant').AsString; MontantText := PadLeft(MontantText, ' ', 15); //ou MontantText := PadLeft(MontantText, '0', 15); bLabel1.Caption := MontantText[1]; bLabel2.Caption := MontantText[2]; bLabel3.Caption := MontantText[3]; bLabel4.Caption := MontantText[4]; bLabel5.Caption := MontantText[5]; bLabel6.Caption := MontantText[6]; bLabel7.Caption := MontantText[7]; bLabel8.Caption := MontantText[8]; bLabel9.Caption := MontantText[9]; bLabel10.Caption := MontantText[10]; bLabel11.Caption := MontantText[11]; bLabel12.Caption := MontantText[12]; bLabel13.Caption := MontantText[13]; bLabel14.Caption := MontantText[14]; bLabel15.Caption := MontantText[15]; end;
([Erreur] Unit1.pas(243): Identificateur non déclaré : 'PadLeft'
[Erreur] Unit1.pas(260): Identificateur non déclaré : 'bLabel13'
[Erreur] Unit1.pas(261): Identificateur non déclaré : 'bLabel14'
[Erreur] Unit1.pas(262): Identificateur non déclaré : 'bLabel15'
[Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'
Il faudrait peut être faire attention a ce que TU fais
1- si la fonction Padleft n'existe pas , voir le post de Shailetroll
ou rechercher dans quelle unité elle se trouvemais on pouvait AUSSI le faire SANS le Pad
il y a aussi la fonction Format qui peut aider
2- si tu n'as pas les QRlabel 13..15 tu ne t'en prends qu'a toi même// montant sur 15 caractères
// 12 chiffres+virgule+2décimales
MontantText:=Format('%12.2f',[DataSource1.DataSet.FieldByName('Montant').asFloat]);
essayes au moins de ne pas faire des copier/coller bêtes et méchants mais plutôt de comprendre les réponses données
La réponse est claire ! Tes QRLabels ne sont pas déclarés. Vérifies la propriété Name de tes QRLabels.
Comme a dit SergioMaster :
Pour la fonction PadLeft, voici un code si tu as des soucis avec.essayes au moins de ne pas faire des copier/coller bêtes et méchants mais plutôt de comprendre les réponses données
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function TaForme.PadLeft(s, sChar: string; Len : SmallInt): string; var i : SmallInt; begin len := Len - length(s); For i := 1 to len do s := sChar + s; PadLeft := S; end;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager