Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247

    Testo formato rich text (RTF) in Memo

    Nel mio programmino in Delphi, sto preparando il form per l'accettazione della licenza.

    La licenza sarà in formato RTF. Solo che non riesco a trovare un modo per caricare un documento RTF "esterno" all'interno di un TRichEdit.

    Più nel dettaglio, vorrei che al momento della compilazione, il compiler prenda il contenuto del documento .rtf e lo inserisca nel TRichEdit. Quindi, all'avvio del programma, anche se il documento .rtf non esiste più, si ritrova già "integrato" nell'eseguibile.

    Forse mi sono spiegato un po' male... Ma spero di essermi fatto capire.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Per caricare un testo da un file RTF esterno, occorre usare il metodo LoadFromFile della proprietà Lines.

    L'inclusione di risorse all'interno dell'eseguibile è un discorso un po' più complesso: prova a leggere questo articolo.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Originariamente inviato da alka
    Per caricare un testo da un file RTF esterno, occorre usare il metodo LoadFromFile della proprietà Lines.
    Dunque viene caricato in runtime. Bene, è già un ottimo inizio.


    Originariamente inviato da alka
    L'inclusione di risorse all'interno dell'eseguibile è un discorso un po' più complesso: prova a leggere questo articolo.
    Sarà fatto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Dunque, ho creato il documento .rtf con Microsoft Word, fin qui tutto OK. Il programma lo carica in runtime dentro il RichEdit. Ci sono due piccoli problemi:

    1) La giustificazione del testo si trasforma in "allinea a sinistra" (Microsoft non rispetta gli standard, o è colpa di Borland?)
    2) Il testo è aderentissimo al bordo del RichEdit. Come si fa ad inserire un po' di "padding" (spaziatura interna)? C'è un parametro, credo si chiami BorderWidth, ma allontana anche la barra di scorrimento dal bordo... decisamente brutto a vedersi.
    3) Come faccio a nascondere il cursore di testo (caret)? Ho provato con un tutorial per nascondere il caret nei TMemo ma sembrerebbe non funzionare con i TRichEdit.

    Ancora grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Originariamente inviato da firefox88
    3) Come faccio a nascondere il cursore di testo (caret)? Ho provato con un tutorial per nascondere il caret nei TMemo ma sembrerebbe non funzionare con i TRichEdit.
    Mi sono industriato un pochetto e sono riuscito, bene o male, a trovare un modo per nascondere (anche se non completamente) il cursore.
    Ho messo nel form un TApplicationEvents e nella funzione OnMessage ho scritto HideCaret(MemoRTF.Handle);.

    Lì per lì funziona, ma quando l'utente scorre con la rotellina di scorrimento il TRichEdit, ecco che il "caret" riappare, lampeggiando febbrilmente. Dopo mezzo secondo scompare di nuovo.

    C'è un metodo "più pulito". Ho trovato anche una classe derivata, eccola qui:

    codice:
    type
      THCRichEdit = class(TRichEdit)
      private
        fHiddenCaret: Boolean;
        procedure SetHiddenCaret(Value: Boolean);
        procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
        procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
        procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
      protected
        { Protected declarations }
      public
      published
        property HiddenCaret: Boolean read fHiddenCaret write SetHiddenCaret default TRUE;
      end;
    
    procedure Register;
    
    implementation
    
    {$R HCRichEditRes.dcr}
    
    procedure THCRichEdit.SetHiddenCaret(Value: Boolean);
    begin
      fHiddenCaret := Value;
    end;
    
    procedure THCRichEdit.WMPaint;
    begin
      inherited;
      if fHiddenCaret then
        HideCaret(Handle);
    end;
    
    procedure THCRichEdit.WMSetFocus;
    begin
      inherited;
      if fHiddenCaret then
        HideCaret(Handle);
    end;
    
    procedure THCRichEdit.WMNCHitTest;
    begin
      inherited;
      if fHiddenCaret then
        HideCaret(Handle);
    end;
    ...ma non funziona affatto, neanche impostando la proprietà HiddenCaret su True.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da firefox88
    ...ma non funziona affatto, neanche impostando la proprietà HiddenCaret su True.
    C'è un errore nel codice: il valore della proprietà HiddenCaret, definito dal campo fHiddenCaret, non viene inizializzato a True.

    E' necessario aggiungere un costruttore nella classe e aggiungere questa impostazione:

    codice:
    constructor THCRichEdit.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      fHiddenCaret := True;
    end;
    Fatto questo, il controllo funziona (l'ho testato).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Originariamente inviato da alka
    L'inclusione di risorse all'interno dell'eseguibile è un discorso un po' più complesso: prova a leggere questo articolo.
    Dunque, mi sono letto quell'articolo e gli articoli correlati. Ho cercato di adattare il tutto al mio programma.

    Questo è il risultato:

    codice:
    procedure TFormLicenza.FormShow(Sender: TObject);
    var
     rStream: TResourceStream;
     fStream: TFileStream;
     fname: string;
    begin
    
     fname := ExtractFileDir(Paramstr(0))+'/licenza.rtf';
     rStream := TResourceStream.Create(hInstance, 'licenza', RT_RCDATA);
     try
      fStream := TFileStream.Create(fname, fmCreate);
      try
       fStream.CopyFrom(rStream, 0);
      finally
       fStream.Free;
      end;
     finally
      rStream.Free;
     end;
    
     MemoRTF.Lines.LoadFromFile(fname);
    end;
    Il problema è che il file RTF viene estratto dall'eseguibile e non rimane nella memoria, ma si "materializza" nella stessa cartella dell'eseguibile.

    Non c'è un metodo più "pulito"?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Ho pensato di far estrarre il documento RTF nella cartella dei file temporanei. Già è qualcosa

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    up...

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da firefox88
    up...
    Up cosa? Qual è il problema ora?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.