Newsgroup: it.comp.lang.delphi
Titolo: RichEdit e Scrollbars

Salve, ho un piccolo problema...
Ho una richedit in cui vengoo copiate delle stringhe,
purtroppo però, se non ha il focus, il testo non scorre ossia vengono
attivate le scrollbars, ma il testo rimane fisso, come fare??


wrote:

eheheh, sì è un bel casino, io ho risolto alla scazzo, prima di
scrivere dagli il focus, dopo lo ridai all'oggetto che eventualmente
lo aveva.
Se la cosa non fosse molto truce e non me ne vergognassi pure, ti
scriverei qui di seguito la procedura usata che comunque fa bene il
suo dovere.
---------------------------------------------
Io queste cose tecnologiche non le capisco...

 eheheh, sě č un bel casino, io ho risolto alla scazzo, prima di


"Peloquin" ha scritto nel messaggio
| Ho una richedit in cui vengoo copiate delle stringhe,
| purtroppo però, se non ha il focus, il testo non scorre ossia vengono
| attivate le scrollbars, ma il testo rimane fisso, come fare??
|
Usa questa procedura che mantiene sincronizzato il Richedit sempre
sulle ultime righe inserite:
Procedure VisualizzaUltimeRighe( tempRichEdit: TRichedit;
                                 NumeroRighe: integer);
Begin
  With tempRichedit Do
  Begin
    LockWindowUpdate(Handle);
    Try
      // torno all'inizio del richedit
      SendMessage(Handle, EM_LINESCROLL, 0, -Lines.count);
      // mi sposto alla fine del richedit
      SendMessage
        (Handle, EM_LINESCROLL, 0, Lines.Count - NumeroRighe);
    Finally
      LockWindowUpdate(0);
    End; // finally
  End; // with
End;
Usala cosi':
  // inserisco una riga e visualizzo le ultime 15 righe del richedit;
  richedit1.Lines.Add(StringaDiTesto);
  VisualizzaUltimeRighe(RichEdit1, 15);
--
Ciao.
ACSH
[D4]
---------------------------
Chi fa da se'
fatica il doppio

  VisualizzaUltimeRighe(RichEdit1, 15);
Mi pare che io avessi provato ad usarla e mi pare pure che funzionasse
bene ma, scusa la mia ignoranza:
Il numero di righe visualizzate non dipende sia dalla dimensione del
font che dalla dimensione della finestra stessa?
Se cambi font o ridimensioni come fai poi a calcolarle??? E se usi più
font contemporaneamente nel richedit? E se ...
Ma diosanto, non esiste un nil di messagio che ti fa andare la
scrollbar e tutto il testo alla fine, mi chiedo!?? E se no, esiste un
componente alternativo che si possa usare senza 'sti problemi?
E' in queste occasioni che me viene l'impulso e il malsano istinto di
fare un buon:
Start/Esegui ... > C:\PROGRAMMI\HIEW\HIEW.EXE
Ciao


Funge benissimo per le scrollbar in verticale, ma per quelle orizzontali,
come fare??
"Montella panchinaro" <nos...@grazie.ccc> ha scritto nel messaggio
news:6eg4vtc88tbd0ojlr...@4ax.com...


come fare??
Oddio, non ho capito la domanda! Eh? Ma tu il richedit lo fai scorrere
in orizzontale? Bohhhhhhh ....
Io continuerò ad usare il mio sistema ancestrale fino a quando
qualcuno non mi spiegherà come simulare il click del mouse in un certo
punto dello schermo e allora, con calcoli + o meno macchinosi sulla
grafica andrò a premere proprio LI'!
Che liberazione!


Lo faccio scorrere in tutte e due i sensi...
Giustamente se scrivi una frase lunga, di conseguenza si attiva la scrollbar
orizzontale...
"Montella panchinaro" <nos...@grazie.ccc> ha scritto nel messaggio
news:cfk5vt8spg12kuc34...@4ax.com...


orizzontale...
Questa è una grande verità; ma sai, col metodo truce di questi
problemi io non ne ho ,WantReturns o meno. Anzi te dirò di più: non
essendo possibile dare il focus quando il richedit non è visibile,
faccio in modo che se viene inserita una riga in questa situazione,
quando riappare di nuovo gli aggiungo e tolgo una riga e lo faccio
pure scrollà di 1 indietro. Tanto non credo che i miei prog finiranno
mai dalle parti di  san Peter Norton. Se qualcun altro si lamenta, ma
chissenfrega ... io programmo (parola grossa) per diletto.


"Peloquin" ha scritto nel messaggio
| Funge benissimo per le scrollbar in verticale, ma per quelle orizzontali,
| come fare??
|
Modifica alla procedura (non l'ho testata molto ma dovrebbe funzionare):
Procedure VisualizzaUltimeRighe(tempRichEdit: TRichedit;
  NumeroRighe: integer);
Begin
  With tempRichedit Do
  Begin
    LockWindowUpdate(Handle);
    Try
      // torno all'inizio del richedit
      SendMessage(Handle, EM_LINESCROLL, 0, -Lines.count);
      // mi sposto alla fine del richedit e
      // sull'ultimo carattere della riga
      SendMessage( Handle, 0, Lines.Count - NumeroRighe);
      // avverto il richedit che il 'cursore' si e' spostato
      tempRichedit.Perform(EM_SCROLLCARET, 0, 0)
    Finally
      LockWindowUpdate(0);
    End; // finally
  End; // with
End;
P.S.: quota un po' meglio.


Scusa, ma nn funge e poi ti sei dimenticato di inserire il parametro
EM_LINESCROLL nel secondo SendMessage...
"ACSH" <cat...@XXXinfinito.it> ha scritto nel messaggio
news:MaWI7.16037$5l.3...@news1.tin.it...


"Peloquin" ha scritto nel messaggio
| Scusa, ma nn funge e poi ti sei dimenticato di inserire il parametro
| EM_LINESCROLL nel secondo SendMessage...
La procedura che ho postato scrolla il testo del richedit in modo
da visualizzare sempre le ultime X righe inserite e spostare
la scrollbar orizzontale in corrispondenza dell'ultimo carattere
dell'ultima riga del testo.
Io lo provata in questo modo:
 richedit1.Lines.Add('RRRRRRRRRR  RRRRRRRRRR');
 VisualizzaUltimeRighe(RICHEDIT1, 5);
A te cosa serve, invece? Cosa non funziona?


...sia per lo scroll orizzontale che verticale...
"ACSH" <cat...@XXXinfinito.it> ha scritto nel messaggio
news:caPJ7.4354$_h6.1...@news1.tin.it...


"Peloquin" ha scritto nel messaggio
| ...sia per lo scroll orizzontale che verticale...
Mi spiace, ma finche' non ti spieghi meglio io non
ti posso aiutare di piu'.


Allora, innanzitutto grazie, poi ricapitoliamo...
Ho un programma che riporta su un  richedit, il testo preso da un altro
richedit...
Il problema e' legato allo scorrimento del testo, infatti per la scrollbar
verticale,
e' stato risolto grazie al tuo codice, mentre quando il testo 'scorre' per
orizzontale
, ossia quando viene scritta una stringa più lunga della lunghezza del
richedit, ciò non avviene
, rimane coperta ...
Spero di essere stato chiaro...
"ACSH" <cat...@XXXinfinito.it> ha scritto nel messaggio
news:fldK7.2322$263....@news1.tin.it...


, rimane coperta ...
boh, io adesso concordo con ACSH nel non capirti ma...
richedit1.wordwrap:=true;
????
richedit1.scrollbars:=ssboth;
????


Il wordwrap deve essere false, altrimenti la scrollbar orizzontale non si
attiva...
"Montella panchinaro" <nos...@grazie.ccc> ha scritto nel messaggio
news:jr8kvt86sr0t75eet...@4ax.com...


"Peloquin" ha scritto nel messaggio
| Ho un programma che riporta su un  richedit, il testo preso da un altro
| richedit...
| Il problema e' legato allo scorrimento del testo, infatti per la
scrollbar
| verticale,
| e' stato risolto grazie al tuo codice, mentre quando il testo 'scorre'
per
| orizzontale
| , ossia quando viene scritta una stringa più lunga della lunghezza del
| richedit, ciò non avviene
| , rimane coperta ...
|
| Spero di essere stato chiaro...
Ultimo tentativo.
Procedure VisualizzaFineRigaInserita(tempRichEdit: TRichedit;
  PosizioneRiga: integer);
Begin
  With tempRichedit Do
  Begin
    LockWindowUpdate(Handle);
    Try
      // mi sposto sull'ultimo carattere della riga inserita
      SendMessage
        (Handle, EM_LINESCROLL, Length(Lines[PosizioneRiga]), 0);
      // avverto il richedit che il 'cursore' si e' spostato
      tempRichedit.Perform(EM_SCROLLCARET, 0, 0)
    Finally
      LockWindowUpdate(0);
    End; // finally
  End; // with
End;
Usata in questo maniera (i due richedit hanno entrambi
la proprieta' wordwrap a false):
var
 PosizioneNelRichedit : integer;
begin
 PosizioneNelRichEdit := 23;
 // copio la sesta riga del secondo richedit
 // sulla 23ma riga dei primo richedit
 re1.Lines[i] := re2.Lines[6];
 // sposto il cursore del primo richedit
 // dopo l'ultimo carattere della riga appena
 // inserita
 VisualizzaFineRigaInserita(re1, i);
end;


una sola parola...GRAZIE
"ACSH" <cat...@XXXinfinito.it> ha scritto nel messaggio
news:2sTK7.3978$BA4.1...@news1.tin.it...
