2017-06-30 4 views
2

Utilisation FastReport, comment puis-je mettre Text et Numbers la base de données dans des boîtes comme:texte Put et chiffres dans les zones

|_|_|_|_|_|_|_|_|_|_| 

Alors "Sami" il devient:

enter image description here

et la même pour les nombres aussi, j'essaye de le faire avec TfrxLineView mais j'échoue.

+1

Vous pouvez [créer un contrôle personnalisé] (https://www.fast-report.com/documentation/DevMan/index.html?custom_report_components_writing. htm) pour cela. Ou construisez-le dynamiquement à partir de contrôles existants (séparément pour chaque caractère ou numéro). – Victoria

+0

@Victoria Et si je ne sais pas comment le créer? Y a-t-il un autre moyen de le faire? – Sami

+0

Je suppose que oui. Vous pourriez prendre par exemple objet texte, le redimensionner, écrire une seule lettre, centrer le texte, configurer son 'Frame' et exclure l'indicateur' ftTop' de la propriété 'Frame.Typ'. Cela devrait aboutir à une seule boîte que vous voulez. Et si vous créez de telles boîtes à l'exécution en itérant tous les caractères d'une chaîne en les plaçant à la position horizontale décalée par l'itérateur, vous avez terminé. – Victoria

Répondre

3

prendre la voie facile:

  • Goutte 4 TfrxMemoView composant dans votre rapport (ou que vous avez besoin) comme:

enter image description here

  • En OnPreview cas de votre rapport, définissez votre code par exemple:

    procedure TForm1.frxReport1Preview(Sender: TObject); 
    var Str : WideString; I : Integer; Mem : TfrxMemoView; 
    begin 
        Str := 'Sami'; // Or get it from query/table (database) 
    
        // Find the TFrxMemoView Component and set in it the String you want 
        for I := 1 to 4 do 
        begin 
         Mem := frxReport1.FindObject('M'+IntToStr(I)) as TfrxMemoView; 
         Mem.Text := Str[I]; 
        end; 
        end; 
    
  • Le résultat sera:

enter image description here

Mise à jour:

Vous peut également le faire par programme en tant que:

var RT : TfrxBand; 
    Mem : array [1..100] of TfrxMemoView ; 
    i : Byte; 
    Name : WideString; 
begin 
    // Find the band 
    RT := frxReport1.FindObject('RT') as TfrxBand; 
    // Set the String 
    Name := 'DELPHI FAST REPORT'; 
    for I := 1 to Length(Name) do 
    begin 
     Mem[i] := TfrxMemoView.Create(RT); 
     Mem[i].Text := Name[i]; 
     Mem[i].Font.Style := [fsBold]; 
     Mem[i].Frame.Width := 2; 
     Mem[i].Height := 20; 
     Mem[i].AutoWidth := False; 
     Mem[i].HAlign := haCenter; 
     Mem[i].Frame.Typ := [ftLeft , ftBottom , ftRight]; 
     Mem[i].Width := 20; 
     if i =1 then 
     Mem[i].Left := 0 
      else 
      Mem[i].Left := Mem[i-1].Left + 5 + 15; 
    end; 
    frxReport1.ShowReport(); 
end; 

Le résultat est:

enter image description here

+0

Vous pouvez même les créer à l'exécution si vous voulez avoir votre code plus flexible. À partir de Delphi ou du code FR, vous pouvez créer des objets visuels de rapport. La seule préoccupation un peu difficile est de savoir comment les positionner sur le rapport. – Victoria

+0

@Victoria Oui, je sais, c'est pourquoi j'ai choisi cette solution (au moins pour l'instant) car j'essaie de les créer à l'exécution et de faire face à un problème de position. – Sami

1

Il n'y a aucun contrôle prêt à l'emploi pour afficher les caractères dans les boîtes comme vous le demandez. Par conséquent, vous devez peindre vous-même sur la toile que vous choisissez.

Voici un exemple de la façon de le faire dans un TPaintBox, pbText est ici un champ de chaîne de la forme de démonstration, et contient le texte à afficher dans la boîte de peinture:

procedure TForm17.PaintBox1Paint(Sender: TObject);var 
    i, n, x, y: integer; 
    siz: TSize; 
    pb: TPaintBox; 
begin 
    n := 10; // character cells 
    pb := Sender as TPaintBox; 
    siz := pb.Canvas.TextExtent('Wp'); 

    // draw character cells 
    x := 4; y := siz.cy+2; 
    for i := 0 to n do 
    begin 
    pb.Canvas.MoveTo(i * siz.cx + x, 0); 
    pb.Canvas.LineTo(i * siz.cx + x, y); 
    end; 
    pb.Canvas.MoveTo(x, y); 
    pb.Canvas.LineTo(n * siz.cx + 4, y); 

    // draw characters horizontally in center of box 
    for i := 1 to Length(pbText) do 
    begin 
    x := (4 + (i-1)*siz.cx + (siz.cx - pb.Canvas.TextWidth(pbText[i])) div 2); 
    y := 0; 
    pb.Canvas.TextOut(x, y, UpperCase(pbText[i])); // force upcase 
// pb.Canvas.TextOut(x, y, pbText[i]);   // or don't 
    end; 
end; 

Et pour l'utiliser

procedure TForm17.Button1Click(Sender: TObject); 
begin 
    pbText := 'Sami Wiim'; 
    PaintBox1.Invalidate; 
end; 

enter image description here

+1

Dans les rapports, des facteurs d'échelle peuvent également être pris en compte. Mais cela dépend des besoins finaux. Bien joué! – Victoria

+0

Hey Tom, btw ce que «WIIM» signifie? :) – Sami

+0

@Sami Je ne sais plus, mais j'ai probablement testé comment les différents personnages sont centrés horizontalement, pour moi ces caractères ne veulent rien dire. Cela vous a-t-il pris 3 mois avant que vous ne remarquiez que j'ai répondu à votre question? :) –

0

Très simple et et un peu laid méthode pour le faire.

  1. Dans le rapport rapide:

-place un objet texte comme celui-ci: [TEST_STR];

-set style de texte à Souligné;

2.In fonction Delphi

-faire pour convertir une chaîne en chaîne formatée. Par exemple:

entrée

: SAMI

sortie: | S | A | M | I |

-En cas OnGetValue de FastReport appeler cette fonction:

procedure TMainForm.frxReport1GetValue(const VarName: string; 
    var Value: Variant); 
begin 
    if VarName = 'TEST_STR' then Value := MyFunctionToFormatStr('SAMI'); 

end; 

C'est tout.

Le regard de résultat comme:

enter image description here