AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FastReport: RFT Länge ermitteln

Ein Thema von haentschman · begonnen am 9. Feb 2023 · letzter Beitrag vom 13. Feb 2023
Antwort Antwort
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
637 Beiträge
 
Delphi XE6 Enterprise
 
#1

AW: FastReport: RFT Länge ermitteln

  Alt 9. Feb 2023, 11:38
Nun habe ich aber RTF Felder in den Detaildaten...da kann ich mit der Variable nix anfangen.
Statt ner Reportvariablen ne Reportfunktion?

Code:
IsEmpty(<DataPosition."PositionRtf">)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#2

AW: FastReport: RFT Länge ermitteln

  Alt 9. Feb 2023, 12:24
IsEmpty kennt FR nicht. Selbst dann...im Datenfeld (leerer Text = 0 Zeichen) steht "{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{ \f0\fnil\fcharset0 Arial;}} {\*\generator Riched20 10.0.19041}\viewkind4\uc1 \pard\fs18\lang1031\par }" drin.
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: FastReport: RFT Länge ermitteln

  Alt 9. Feb 2023, 13:01
Hi,
diese Links sollten dir weiterhelfen:

RTF to plain text:
https://www.delphipraxis.net/767804-post12.html

Using Custom Functions in a Report:
https://www.fast-report.com/document..._to_report.htm

Alex
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#4

AW: FastReport: RFT Länge ermitteln

  Alt 9. Feb 2023, 16:09
Danke...

Das Erste kommt mir bekannt vor. So ähnlich habe ich das mit den Variablen gemacht. Custom Functions ... fürs nächste Mal.

Inzwischen habe ich eine FastReport Lösung:

Dummy TfrxRichView im Detail Band
Delphi-Quellcode:
procedure DetailDataOnBeforePrint(Sender: TfrxComponent);
begin
  Dummy.RichEdit.Lines.Clear;
  Dummy.RichEdit.Lines.Add(<DataPosition."TEILRtf">);
  // Achtung! Lines.Text funktioniert nicht! Da wird der RTF string in die Lines geschrieben. Mit Lines.Add wird der RTF Text als PlainText ausgegeben.
  Child.Visible := Length(Dummy.RichEdit.Lines.Text) > 2; // Offset für immer einen LineFeed ... warum auch immer.
end;
Fehlinformation

Geändert von haentschman (10. Feb 2023 um 07:42 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.597 Beiträge
 
Delphi 7 Professional
 
#5

AW: FastReport: RTF Länge ermitteln

  Alt 10. Feb 2023, 12:52
  Child.Visible := Length(Dummy.RichEdit.Lines.Text) > 2; // Offset für immer einen LineFeed ... warum auch immer.
Für die Ausgabe von Text werden bei TStrings-Nachfolgern die einzelnen Zeilen "zusammengedaddelt" und am Ende wird immer ein Zeilenumbruch drangepappt, deshalb ist die Länge von Lines.Text (unter Windows) immer mindestens = 2.

Alternative:   Child.Visible := Length(Trim(Dummy.RichEdit.Lines.Text)) = 0;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#6

AW: FastReport: RFT Länge ermitteln

  Alt 10. Feb 2023, 13:16
Danke...

Diese Varianten habe ich alle durch. Ich bin nie zu einem stabilen Ergebnis gekommen. Erst Recht nicht mit dem Bug in if/then.

TRIM hat bei mir alle Zeichen, auch die benötigten, entfernt -> Lenght = 0
Zitat:
Lines.Text (unter Windows) immer mindestens = 2
...nicht ganz. Wenn du imho auf ein NULL Feld triffst ist, Lines.Count = 0 und Länge = 0

Ich habe jetzt eine CustomerFunction eingebaut, die mir im Delphi Quelltext das Datenfeld in das Dummy RichEdit einliest und mir den Text ohne Steuerzeichen emittelt und einen Boolean zurückgibt. Damit funktioniert es stabil...
Delphi-Quellcode:
function TdmReport.frxReport1UserFunction(const MethodName: string; var Params: Variant): Variant;
begin
  if MethodName = 'CANSHOWCHILDthen
  begin
    Result := CanShowChild(Params[0], Params[1]);
  end;
end;
...
function TdmReport.CanShowChild(DataSetName, FieldName: string): Boolean;
var
  Data: TDataSet;
begin
  Result := False;

  if FCurrentPrint.ReportDictionaryDataSets.ContainsKey('frx' + DataSetName) then
  begin
    Data := FCurrentPrint.ReportDictionaryDataSets['frx' + DataSetName];
    if Assigned(Data) then
    begin
      Stream.Clear;
      TBlobField(Data.FieldByName(Fieldname)).SaveToStream(Stream);
      Stream.Position := 0;
      Rich.Lines.LoadFromStream(Stream);

      Result := (Trim(Rich.Lines.Text) > '');
    end;
  end;
end;
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
483 Beiträge
 
#7

AW: FastReport: RFT Länge ermitteln

  Alt 13. Feb 2023, 00:19
Ich habe jetzt eine CustomerFunction eingebaut, die mir im Delphi Quelltext das Datenfeld in das Dummy RichEdit einliest und mir den Text ohne Steuerzeichen emittelt und einen Boolean zurückgibt.
Wenn immer möglich, sollte eine Bericht-Funktion ohne interne Abhängigkeiten geschrieben werden. Das bietet die Möglichkeit, mit der Zeit eine eigene Sammlung nützlicher Helfer zu erstellen, die nur durch Einbindung einer Unit zur Verfügung gestellt werden. Im konkreten Fall könnte es zum Beispiel so aussehen:
Delphi-Quellcode:
unit u_ReportFunctions;

interface

uses
  Windows, Messages, SysUtils, Classes, Variants,
  fs_iinterpreter;

type
  TReportFunctions = class(TfsRTTIModule)
  private
    function CallMethod(pmInstance: TObject; pmClassType: TClass;
      const pmcMethodName: String; pmCaller: TfsMethodHelper): Variant;
  public
    constructor Create(pmScript: TfsScript); override;
  end;

implementation

uses
  frxClass, frxVariables, frxRichEdit;

const
  OWN_FUNCTIONS = 'Own functions';

function RTFTextCharCount(const pmcRTFText: String): Integer;
var
  richEdit: TRxRichEdit;
  loadStream: TStringStream;
begin
  Result := 0;
  if pmcRTFText = 'then Exit; //=>

  richEdit := TRxRichEdit.CreateParented(HWND(HWND_MESSAGE));
  try
    loadStream := TStringStream.Create(pmcRTFText);
    try
      richEdit.Lines.LoadFromStream(loadStream);
    finally
      loadStream.Free;
    end;

    Result := richEdit.GetTextLen;
    if Result > 0 then
      Result := Result - (richEdit.Perform(EM_GETLINECOUNT, 0, 0) - 1);
  finally
    richEdit.Free;
  end;
end;

function IsRTFTextEmpty(const pmcRTFText: String): Boolean;
begin
  if pmcRTFText <> 'then
    Result := (RTFTextCharCount(pmcRTFText) = 0)
  else
    Result := True;
end;

//=== TReportFunctions =========================================================

constructor TReportFunctions.Create(pmScript: TfsScript);
begin
  inherited Create(pmScript);
  pmScript.AddMethod('function IsRTFTextEmpty(const pmcRTFText: String): Boolean',
    CallMethod, OWN_FUNCTIONS, 'IsRTFTextEmpty() returns if chars are present');
  pmScript.AddMethod('function RTFTextCharCount(const pmcRTFText: String): Integer;',
    CallMethod, OWN_FUNCTIONS, 'RTFTextCharCount() returns the number of chars');
end;

function TReportFunctions.CallMethod(pmInstance: TObject; pmClassType: TClass;
  const pmcMethodName: String; pmCaller: TfsMethodHelper): Variant;
begin
  if SameText(pmcMethodName, 'IsRTFTextEmpty') then
    Result := IsRTFTextEmpty(pmCaller.Params[0])
  else if SameText(pmcMethodName, 'RTFTextCharCount') then
    Result := RTFTextCharCount(pmCaller.Params[0]);
end;

initialization
  fsRTTIModules.Add(TReportFunctions);

end.
Und so im Bericht eingesetzt werden:
Delphi-Quellcode:
procedure DetailDataOnBeforePrint(Sender: TfrxComponent);
begin
  Child.Visible := not IsRTFTextEmpty(<data."RTFData">);
end;
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz