Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262

    [DELPHI]Gestione delle stringhe

    Ho un problema che sembrebbe da deficienti..Mi sta facendo impazzire
    Attraverso l'uso di un bottone devo semplicemente aggiungere una stringa in un componente (non vuoto) RichEdit.
    Se uso:
    RicheEdit.Lines.Add('Stringa') oppure
    RicheEdit.Lines.Append('Stringa') oppure
    RicheEdit.Text:= RicheEdit.Text +'Stringa'

    ottengo si l'inserimento della stringa, ma è sempre in una nuvoa linea
    Esempio:
    se la stringa è 'mare' ed il componente RichEdit è così:
    codice:
    Paolo è a
    ottengo
    codice:
    Paolo è a
    mare
    e non
    codice:
    Paolo è a mare
    Credeteci ho cercato di tutto nella guida, ma c'è qualcosa che mi sfugge!!

  2. #2
    Prova ad aggiungere la stringa nell'ultima riga del TRichedit, cioè così:

    codice:
    red.Lines[red.Lines.Count-1] := red.Lines[red.Lines.Count-1] + ' mia stringa';
    (dove red è il RichEdit )

    Ciao!

  3. #3
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da matsoftware
    Prova ad aggiungere la stringa nell'ultima riga del TRichedit, cioè così:

    codice:
    red.Lines[red.Lines.Count-1] := red.Lines[red.Lines.Count-1] + ' mia stringa';
    (dove red è il RichEdit )

    Ciao!
    Non funziona. Secondo me si dovrebbe sbloccare qualche proprietà (TRUE OR FALSE), WantReturn e WordWrap in questo caso non interferiscono.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Per risolvere il problema, bisogna analizzare la natura della proprietà Lines dei controlli RichEdit e Memo: si tratta di un'istanza della classe TStringList.

    La classe TStringList, discendente da TStrings, è in grado di memorizzare al proprio interno una stringa di testo anche molto lunga (virtualmente 2GB...sono sufficienti?). La peculiarità della classe è data dal fatto che essa consente di intervenire sulla stringa con diversi metodi e proprietà di lettura e scrittura.

    Ad esempio, la classe è in grado di interpretare tutti i ritorni a capo come separatori di riga e fornire l'accesso alla singola riga tramite un indice (da qui il nome TStringList): sembra di accedere ad una lista di stringhe, ma in realtà la stringa viene memorizzata come un unico blocco e interpretata.

    I metodi Add e Append consentono di aggiungere nuove stringhe alla pseudolista, inserendo i ritorni a capo necessari; è per questo motivo che vedi sempre il testo inserito coi suddetti metodi andare a capo: la classe antepone un ritorno a capo per separare le stringhe.

    L'unico modo che hai per aggiungere testo affiancandolo a quello esistente è utilizzare la proprietà Text del RichEdit (e non di Lines): essa ti restituisce l'intera stringa memorizzata che comprende tutte le stringhe facenti parte della pseudolista spezzate da ritorni a capo, analogamente a quanto avviene con la proprietà Text della TStringList; se accodi nuovi caratteri alla proprietà Text, otterrai l'effetto desiderato.

    Il "gioco" non funziona con Lines poichè la classe TStringList inserisce sempre un ritorno a capo alla fine del testo che hai definito, tramite il metodo Add o impostando la proprietà Text direttamente.

    Dopo questa lunga spiegazione, il mio suggerimento è: inizializza il RichEdit eliminando il testo eventualmente contenuto e definito in fase di progettazione.
    codice:
      RichEdit1.Text := '';
    poi accoda le stringhe usando sempre quella proprietà
    codice:
      RichEdit1.Text := RichEdit1.Text + 'Prova';
    senza servirti di Lines.Text, la quale aggiunge sempre un ritorno a capo in coda al testo specificato (spezzandoti così le righe).

    Nota personale: mi sembra uno strano utilizzo per un controllo RichEdit (o Memo in generale): leggere + modificare + scrivere intere stringhe è un processo che diventa sempre più lento all'aumentare della lunghezza della stringa (poichè non è possibile usufruire dell'ottimizzazione del Memory Manager di Delphi)...tieni conto di questo aspetto.

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

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

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da gokan
    WantReturn e WordWrap in questo caso non interferiscono.
    Attenzione: WantReturn e WordWrap sono proprietà che regolano il comportamento del controllo e non influiscono effettivamente sul testo contenuto a livello di dati.

    Ti basta comunque leggere la Guida per risolvere i dubbi.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da alka
    Nota personale: mi sembra uno strano utilizzo per un controllo RichEdit (o Memo in generale): leggere + modificare + scrivere intere stringhe è un processo che diventa sempre più lento all'aumentare della lunghezza della stringa (poichè non è possibile usufruire dell'ottimizzazione del Memory Manager di Delphi)...tieni conto di questo aspetto.

    Ciao!
    Alla pressione di un bottone volevo che si aggiungesse del testo.Ti spiego. Costruisco un semplice editor con un toolbar che presenta dei bottoni. Uno di questi bottoni dovrebbe inserire '' alla prima pressione ed '' alla seconda pressione. In pratica questo editor dovrebbe fare consentirmi di poter aggiungere tag html. Pensavo fosse più semplice aggiungere una stringa senza bisogno di andare a capo.
    Significa che penserò ad un altro metodo per poter simulare un piccolo html editor.
    Ciao e grazie per le delucidazioni sempre utili.

  7. #7
    piccaweb
    Guest
    A mio avviso una possibile soluzione potrebbe essere questa:
    sfruttare il posizionamento del cursore per identificare la riga in cui si é situati e successivamente passare all'aggiunta della nuova stringa.

    Esempio:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      RichEdit1.Lines.Strings[RichEdit1.CaretPos.Y] := 
     concat (RichEdit1.Lines.Strings[RichEdit1.CaretPos.Y] , ' aggiunta ' );
    end;
    Prova.

    Ciao

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Usare un RichEdit per realizzare un'applicazione complessa come un editor HTML può essere limitativo e causarti qualche problemuccio.

    Ad ogni modo, prova anche la soluzione di Piccaweb, potrebbe risolvere il tuo problema.

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

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

  9. #9
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da piccaweb
    A mio avviso una possibile soluzione potrebbe essere questa:
    sfruttare il posizionamento del cursore per identificare la riga in cui si é situati e successivamente passare all'aggiunta della nuova stringa.

    Esempio:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      RichEdit1.Lines.Strings[RichEdit1.CaretPos.Y] := 
     concat (RichEdit1.Lines.Strings[RichEdit1.CaretPos.Y] , ' aggiunta ' );
    end;
    Prova.

    Ciao
    Funziona come dovrebbe adesso :gren:
    Ho imparato una cosa nuova. Grazie

    Per Alka
    Non è mia volontà costruire un editor html, mi interessava solo poter aggiungere 3-4 tag per potere scrivere dei messaggi di risposta nel forum anche quando sono non in linea, il tutto semplificandomi un pò le cose..
    Ciao

  10. #10
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Sembrerà un programmino stupido, a me è molto utile perchè capita spesso di scrivermi delle risposte per alcune discussioni oppure nuovi discussioni, il tutto quando non sono online, poi mi basta fare un copia e incolla ed è tutto pronto.
    Trovate il semplicissimo codice alla pagina http://it.geocities.com/mozzillone
    Ciao

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.