Newsgroup: it.comp.lang.delphi
Titolo: Stile e posizione di parole in una stringa

Salve, sto avendo problemi con una piccola applicazione; vorrei
realizzare una funzione o una procedura che riconosca alcune parole o
comandi scritti in un RichEdit, modificandone lo stile e mettendo
queste parole in grassetto. Il riconoscimento dei singoli comandi l'ho
realizzato, ma quando vado a modificare lo stile alla stringa rilevata
non modifica alcunchè e rimane invariato il tutto senza metterlo in
grassetto. Avete una soluzione?
Volevo realizzare anche una indentazione automatica quando viene
premuto il tasto invio sempre nel RichEdit. Per riconoscere la chiave
dell'"Invio" non ho avuto problemi; non riesco però a leggere la
posizione della prima lettera della riga precedente.
Il risultato della identazione, per intenderci, dovrebbe essere sempre
rispetto alla riga precedente; esempio :
  1Sono la prima riga
  2  La seconda la idento io
  3  La terza viene indentata automaticamente sulla 2
  4    La quarta la idento io
E via dicendo.
Vi ringrazio per l'aiuto.
Saluti

 posizione della prima lettera della riga precedente.
Consiglio: se hai bisogno di una indentazione seria, valuta l'uso
di un componente che gia' prevede questa possibilita' (SynEdit, p.e).
In ogni caso, la via piu' semplice IMHO e' quella di salvare in una
variabile temporanea la posizione dell'ultima indentazione fatta
e aumentare questo valore ogni volta che esegui la tua procedura.
Esempio:
intValoreIndentazione := 8;
// inserisci la stringa indentata
inc(intValoreIndentazione, 8);
// inserisci una nuova stringa indentata
inc(intValoreIndentazione, 8);
e cosi' via, senza complicarti la vita con calcoli assurdi. Se sei
invece masochista, vedi nell'help i messaggi EM_LINEINDEX e
EM_LINEFROMCHAR.
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio

 in grassetto" sbagli qualcosa?
Allora dato che non ci sono riuscito nemmeno con il tuo aiuto ti
riposto direttamente la funzione che attualmente ho e poi spiego meglio
:
procedure TForm1.CheckCmd(s : String;ind : integer);
var i : Integer;
    str,cmd : String;
begin
  for i := 0 to TreeView1.Items.Count-1 do
    begin
      cmd := TreeView1.Items[i].Text;
      str := copy(s,pos(cmd,s),length(cmd));
      if( str = cmd )
        then begin
        end;
    end;
end;
La procedura ha come ingresso una stringa e un intero, che rappresenta
l'indice della stringa passata. Con la for controllo se all'interno del
RichEdit sono presenti i comandi, memorizzati all'interno di un
TreeView. Quando nella stringa è trovato il comando dovrebbe
ricomporre la stringa con il comando il grassetto e la restante parte
del testo. Con la funzione precedentemente postata non riesco
ugualmente a mettere in grassetto la singola parola; mi mette in
grassetto tutto il RichEdit.Un'altra soluzione ?

 grassetto tutto il RichEdit.Un'altra soluzione ?
La procedura che ti ho postato va modificata per impostare
la parola in grassetto: l'hai fatto?
Io farei cosi':
procedure EvidenziaStringaInGrassetto (tempRichEdit: TRichEdit;
                            const StringaDaEvidenziare: string);
var
  Indice, LungTestoSorgente,
  LungTestoDaSostituire: Integer;
begin
  LungTestoSorgente := tempRichEdit.GetTextLen;
  LungTestoDaSostituire := Length(StringaDaEvidenziare);
  Indice := 0;
  repeat
    Indice := tempRichEdit.FindText
      (StringaDaEvidenziare, Indice, LungTestoSorgente, []);
    if Indice >= 0 then
    begin
      tempRichEdit.Perform
        (EM_SETSEL, Indice, Indice + LungTestoDaSostituire);
      tempRichEdit.SelAttributes.Style := [fsBold];
      Inc(Indice, LungTestoDaSostituire);
    end;
  until Indice < 0;
  // Sposta il cursore all'inizio del testo
  tempRichEdit.SelStart := 0;
end;
// questa la devi sistemare secondo il tuo programma
procedure TForm1.CheckCmd(s : String;ind : integer);
var i : Integer;
    str,cmd : String;
begin
  for i := 0 to TreeView1.Items.Count-1 do
    begin
      cmd := TreeView1.Items[i].Text;
      str := copy(s,pos(cmd,s),length(cmd));
      if( str = cmd )
        then  EvidenziaStringaInGrassetto(TuoRichedit, cmd);
   end;
end;
Testato in cinque minuti.
P.S.: consiglio non richiesto, ma te lo do ugualmente:
abituati a dare alle variabili ed agli oggetti dei nomi piu'
descrittivi. L'IDE non e' un telefonino ed il codice sorgente
non e' un SMS.


 grassetto tutto il RichEdit.Un'altra soluzione ?
La procedura che ti ho postato va modificata per impostare
la parola in grassetto: l'hai fatto?
Io farei cosi':
procedure EvidenziaStringaInGrassetto (tempRichEdit: TRichEdit;
                            const StringaDaEvidenziare: string);
var
  Indice, LungTestoSorgente,
  LungTestoDaSostituire: Integer;
begin
  LungTestoSorgente := tempRichEdit.GetTextLen;
  LungTestoDaSostituire := Length(StringaDaEvidenziare);
  Indice := 0;
  repeat
    Indice := tempRichEdit.FindText
      (StringaDaEvidenziare, Indice, LungTestoSorgente, []);
    if Indice >= 0 then
    begin
      tempRichEdit.Perform
        (EM_SETSEL, Indice, Indice + LungTestoDaSostituire);
      tempRichEdit.SelAttributes.Style := [fsBold];
      Inc(Indice, LungTestoDaSostituire);
    end;
  until Indice < 0;
  // Sposta il cursore all'inizio del testo
  tempRichEdit.SelStart := 0;
end;
// questa la devi sistemare secondo il tuo programma
procedure TForm1.CheckCmd(s : String;ind : integer);
var i : Integer;
    str,cmd : String;
begin
  for i := 0 to TreeView1.Items.Count-1 do
    begin
      cmd := TreeView1.Items[i].Text;
      str := copy(s,pos(cmd,s),length(cmd));
      if( str = cmd )
        then  EvidenziaStringaInGrassetto(TuoRichedit, cmd);
   end;
end;
Testato in cinque minuti.
P.S.: consiglio non richiesto, ma te lo do ugualmente:
abituati a dare alle variabili ed agli oggetti dei nomi piu'
descrittivi. L'IDE non e' un telefonino ed il codice sorgente
non e' un SMS.
Ciao
