2017-06-30 1 views
2

Mit FastReport, wie ich Text und Numbers aus der Datenbank in den Feldern wie setzen kann:Put Text und Zahlen in den Feldern

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

So "Sami" es werden:

enter image description here

und die Das gleiche gilt auch für Zahlen, ich versuche es mit TfrxLineView zu tun, aber ich scheitere.

+1

Sie können [erstellen Sie eine benutzerdefinierte Steuerung] (https://www.fast-report.com/documentation/DevMan/index.html?custom_report_components_writing. htm) dafür. Oder erstellen Sie es dynamisch aus vorhandenen Steuerelementen (getrennt für jedes Zeichen oder jede Zahl). – Victoria

+0

@Victoria Was ist, wenn ich nicht weiß, wie ich es erstelle? Gibt es einen anderen Weg, es zu tun? – Sami

+0

Ich denke schon. Sie könnten z.B. Textobjekt, grösse es, schreibe einen einzelnen Buchstaben, zentriere den Text, richte seinen 'Frame' ein und schließe' ftTop' aus der Eigenschaft 'Frame.Typ' aus. Das sollte zu einer einzelnen Box führen, die Sie möchten. Und wenn Sie solche Boxen zur Laufzeit erstellen, indem Sie alle Zeichen in einer Zeichenkette durchlaufen, indem Sie sie an der vom Iterator verschobenen horizontalen Position platzieren, sind Sie fertig. – Victoria

Antwort

3

Nehmen Sie den einfachen Weg:

  • Drop 4 TfrxMemoView Komponente in Ihrem Bericht (oder, wie Sie benötigen) wie:

enter image description here

  • In OnPreview Ereignis des Berichts, stellen Sie Ihren Code zum Beispiel:

    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; 
    
  • Das Ergebnis wird sein:

enter image description here

Update:

Sie kann es auch programmgesteuert tun als:

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; 

Das Ergebnis ist:

enter image description here

+0

Sie können sie sogar zur Laufzeit erstellen, wenn Sie Ihren Code flexibler haben möchten. Mit Delphi oder FR-Code können Sie visuelle Berichtsobjekte erstellen. Die einzige etwas schwierige Aufgabe ist es, sie auf dem Bericht zu positionieren. – Victoria

+0

@Victoria Ja, ich weiß, deshalb wähle ich diese Lösung (zumindest für jetzt), weil ich versuche, sie zur Laufzeit zu erstellen und ein Problem in der Position zu stellen. – Sami

1

Es gibt kein vorgefertigtes Steuerelement zum Anzeigen von Zeichen in Boxen, wenn Sie danach fragen. Deshalb müssen Sie dies selbst auf der von Ihnen gewählten Leinwand malen.

Hier ist ein Beispiel dafür, wie es in einem TPaintBox zu tun, ist pbText hier ein String-Feld der Demo-Form, und hält den Text im Malkasten angezeigt werden:

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; 

Und, es zu benutzen

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

enter image description here

+1

In Berichten können auch Skalierungsfaktoren berücksichtigt werden. Aber es hängt von den endgültigen Bedürfnissen ab. Gut gemacht! – Victoria

+0

Hey Tom, was "WIIM" bedeutet? :) – Sami

+0

@Sami Nicht mehr sicher, aber wahrscheinlich habe ich gerade getestet, wie verschiedene Zeichen horizontal zentriert sind, für mich bedeuten diese Zeichen nichts. Haben Sie 3 Monate gebraucht, bis Sie gemerkt haben, dass ich Ihre Frage beantwortet habe? :) –

0

Sehr einfach und und ein wenig hässlich Methode, dies zu tun.

  1. In Fast-Report:

-ort ein Textobjekt wie folgt aus: [TEST_STR];

-set text style zu Unterstreichen;

2.In Delphi

-make Funktion einen String formatiert Zeichenfolge zu konvertieren. Zum Beispiel:

Eingang: SAMI

Ausgang: | S | A | M | I |

-in OnGetValue Veranstaltung von Fastreport diese Funktion aufrufen:

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

end; 

Das ist alles.

Das Ergebnis wie folgt aussehen:

enter image description here

Verwandte Themen