Newsgroup: it.comp.lang.delphi
Titolo: FastReport e TRitchView

Ciao a tutti,
sapete se è possibile stampare un oggetto di tipo TRitchView con 
FastReport? Ho cercato in giro (forum compresi) ma non ho trovato granche'
Grazie,
David

Ho trovato la soluzione, che posto per chi interessa....
- Stampa di un RTF senza interruzioni di pagina: -
Report:
-------
    Inserire una band con le proprietà AllowSplit e Stretched impostate 
a True e numero di dati impostati ad 1
    Inserire nella band un oggetto di tipo tfrxRichView con la proprietà 
StretchMode impostata a smActualHeight
Codice:
-------
procedure TForm1.MyRitchViewGetValue(const VarName: string;
   var Value: Variant);
Var
   Lista  : TStringList;
   Stream : TMemoryStream;
Begin
   .....
   If AnsiSameText(S, 'Reportsenzainterruzioni')) Then
      Begin
         Lista  := TStringList.Create;
   	Stream := TMemoryStream.Create;
   	Stream.Position := 0;
   	MyRitchView.SaveRTFToStream(Stream, False);
   	Stream.Position := 0;
   	Lista.LoadFromStream(Stream);
   	Value := Lista.Text;
   	Lista.Free;
   	Stream.Free;
      End;
   .....
End;
- Stampa di un RTF CON interruzioni di pagina: -
Report:
-------
    Inserire una band con le proprietà AllowSplit e Stretched impostate 
a True e con conteggio dei record impostato ad un oggetto di tipo 
TfrxUserDataSet
    Inserire nella band un oggetto di tipo tfrxRichView con la proprietà 
StretchMode impostata a smActualHeight
Codice:
-------
Nella procedura di inizio stampa (bottone, evento, timer..) contare il 
numero di interruzioni di pagina + 1 con una cosa tipo
Interruzioni := 1; // +1 perchè ci vuole
For I := 0 To MyRitchView.ItemCount -1 Do
     If (MyRitchView.GetItem(I) Is TRVBreakItemInfo)
     Then
       inc(Interruzioni);
ed assegnare questo valore all'oggetto tfrxUserDataSet con
  StrData.RangeEnd      := reCount;
  StrData.RangeEndCount := Interruzioni;
poi chiamare la funzione ShowReport.
Ora nella GetValue bisogna prelevare la parte di rtf che ci serve a 
seconda del conteggio delle interruzioni di pagina e salvarla nello 
stream usato per la stampa (personalmente mi trovo bene con gli stream) 
con una funzione simile a questa:
Function SalvaRTF(Stream : TMemoryStream; Contatore : Integer) : Boolean;
Var
   I     : Integer;
   Start : Integer;
   Stop  : Integer;
   Conta : Integer;
   Ok    : Boolean;
Begin
   // --------------------------------------------------
   // Nessun dato -> Uscita
   // --------------------------------------------------
   If MyRitchView.ItemCount < 1 Then
      Begin
        Result := False;
        Exit;
      End;
   // --------------------------------------------------
   // Ricerca interruzione di pagina ennesima
   // --------------------------------------------------
   Start  := 0;
   Stop   := 0;
   Conta  := 0;
   Ok     := False;
   I      := 0;
   While (I < MyRitchView.ItemCount) And (Not Ok) Do
         Begin
           If (MyRitchView.GetItem(I) Is TRVBreakItemInfo) Then
              Begin
                Stop := I;
                Inc(Conta);
                Ok := (Conta = Contatore);
                If Not Ok Then
                   Begin
                     Start := I+2;
                     Inc(I);
                   End;
              End;
           Inc(I);
         End;
   // --------------------------------------------------
   // Controllo per stampa parte finale
   // --------------------------------------------------
   If Not Ok Then
      Begin
        Stop := MyRitchView.ItemCount-1;
        Inc(Conta);
        Ok := (Conta = Contatore);
      End;
   // --------------------------------------------------
   // Se trovato preparazione file di uscita
   // --------------------------------------------------
   If Ok Then
      Begin
        MyRitchView.SetSelectionBounds(Start, 0, Stop, MyRitchView.Width);
        Stream.Position := 0;
        MyRitchView.SaveRTFToStream(Stream, True);
      End;
   // --------------------------------------------------
   // Settaggio uscita
   // --------------------------------------------------
   Result := Ok;
End;
Qusta funzione va usata in un pezzo di codice simile a quello usato per 
la stampa di un rtf standard:
procedure TForm1.MyRitchViewGetValue(const VarName: string;
   var Value: Variant);
Var
   Lista  : TStringList;
   Stream : TMemoryStream;
Begin
   .....
   If AnsiSameText(S, 'ReportConInterruzioni')) Then
      Begin
        Stream := TMemoryStream.Create;
        If SalvaRTF(Stream, StrData.RecNo+1) Then
           Begin
             Lista := TStringList.Create;
             Stream.Position := 0;
             Lista.LoadFromStream(Stream);
             Value := Lista.Text;
             Lista.Free;
             Stream.Clear;
           End;
        Stream.Free;
      End;
   .....
End;
Questo è tutto. Spero di farvi cosa gradita.
Mi sono "sbattuto" abbastanza per gli RTF con interruzioni di pagina ma 
alla fine ce l'ho fatta (e che vince lui?)
Bye, bye bella gente