PDA

Visualizza la versione completa : [DELPHI]: Testo formato RichText (RTF) in Memo


firefox88
20-05-2006, 20:10
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.

alka
20-05-2006, 21:56
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 (http://delphi.about.com/od/objectpascalide/l/aa113099a.htm).

Ciao! :ciauz:

firefox88
21-05-2006, 00:11
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 (http://delphi.about.com/od/objectpascalide/l/aa113099a.htm).
Sarà fatto.

firefox88
21-05-2006, 10:06
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 :ciauz:

firefox88
21-05-2006, 12:55
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:


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.

alka
22-05-2006, 17:40
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:



constructor THCRichEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fHiddenCaret := True;
end;


Fatto questo, il controllo funziona (l'ho testato).

Ciao! :ciauz:

firefox88
02-06-2006, 16:53
Originariamente inviato da alka
L'inclusione di risorse all'interno dell'eseguibile è un discorso un po' più complesso: prova a leggere questo articolo (http://delphi.about.com/od/objectpascalide/l/aa113099a.htm).

Dunque, mi sono letto quell'articolo e gli articoli correlati. Ho cercato di adattare il tutto al mio programma.

Questo è il risultato:



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"?

firefox88
02-06-2006, 17:54
Ho pensato di far estrarre il documento RTF nella cartella dei file temporanei. Già è qualcosa :)

firefox88
04-06-2006, 10:14
up...

alka
04-06-2006, 17:26
Originariamente inviato da firefox88
up...
Up cosa? Qual è il problema ora?

Loading