Newsgroup: it.comp.lang.delphi
Titolo: Stringgrid che taglia testo colonne

Ciao a tutti, 
ho modificato del codice dove ho una stringgrid con due colonne, con la scrollbar orizzontale impostata.
Quando vado ad inserire del testo in una colonna, questo viene visualizzato solo fino ad un certo punto, anche se io allargo quella colonna impostando un colwidth esagerato, la barra mi permette di scorrere un pò ma non arriva fino in fondo.
Mi pare strano ma forse c'è un limite massimo di caratteri visualizzabili per colonna?
Cos'altro potrebbe esserci che mi da questo problema? non riesco a capire.
Grazie anticipatamente a tutti.
 
-- 
mnoga


proverei a vedere se l'exe in un altro PC se fa lo stesso, Giorgio
 
-- 
 

 proverei a vedere se l'exe in un altro PC se fa lo stesso, Giorgio
 
ok non cambia nulla, comunque sono arrivato a questo:
ho una stringgrid con due colonne e un pulsante con questo codice:
 
  sg3.ColWidths[0] := 40;
  sg3.ColWidths[1] := 1100;
  sg3.Cells[0,0] := '1';
  sg3.Cells[1,0] := '123456890123456789000001234568901234567891111101234568901234567892222201234568901234567890!!!!';
  sg3.cols[0].endupdate;
 
nella stringgrid mi appare la scrollbar, ma se scorro tutto a sinistra non arriva alla fine della stringa!
(se metto uno splitter e allargo allora il testo esce tutto, cioè la colonna è visualizzata tutta, però la scrollbar non arriva alla fine).
 
se tolgo la prima colonna, la scrollbar funziona correttamente
 
-- 
mnoga


ho una reminescenza di una proprità che impostata a true mostrava il 
contenuto della cella come hint lasciando un attimo su di essa il 
puntatore del mouse...
 
 
-- 
Oggi c'e' una grande battaglia di idee,
ma alla fine non ci saranno ne vinti,
ne vincitori, ne idee! S. Benni da Elianto.

Eh si però a me non va bene, qui ho semplificato il problema all'estremo ma ho una form complessa e deve essere visualizzato tutto correttamente...
 
-- 
Mnoga

 
dovrai aggirare il problema allora visulizzando il contenuto
della cella in un memo che si apre cliccandoci sopra!


  un pò ma non arriva fino in fondo.
E' normale, in quanto la scroll bar e' della griglia e non della colonna.
Ovvero, la scroll bar ti permette di scorrere avanti/indietro per la 
larghezza totale della griglia; ed e' quello che fa.
Se la colonna ha una larghezza di 250, il testo in essa contenuto e' lungo 
500 e' ovvio che tu ne veda solo una parte.
Se la colonna1 e' larga 100, la 2 150 tu hai un'area larga 250
Ora se la larghezza della griglia e' (per esempio) 150 tu vedrai tutta la 
prima colonna per intero ed un pezzo della seconda con la scrollbar.
Spostando la scrollbar verso destra verai un pezzo della prima colonna e 
tutta la seconda, nella seconda vedrai il testo nella posizione in cui lo 
hai lasciato.
 
Se invece vuoi adattare la larghezza della colonna in modo dinamico dovrai 
fare una cosa simile a questa:
Nell'evento KeyUp metti questo codice (sg1 e' TStringGrid)
 
procedure TForm1.SG1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SG1.ColWidths[sg1.col]:=Length(SG1.cells[SG1.col,SG1.row]);
end;
 
quello che fa e' che ogni volta che alzi il tasto, prende la stringa della 
cella, controlla la lunghezza ed adatta la larghezza della colonna.
Pero' perdi il principio della stringa ....
Allora ho pensato a questa modifica
 
procedure TForm1.SG1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SG1.ColWidths[sg1.col]:=SG1.Canvas.TextWidth(SG1.cells[SG1.col,SG1.row]) + 
20;
end;
 
In questo modo, mentre la larghezza della colonna continua a crescere (o a 
decrescere se la cancelli) la stringa rimane sempre visibile fin tanto che 
la colonna rimane nella larghezza del controllo in cui e' introdotta la 
griglia.
Una volta arrivato al limite destro, la barra di scorrimento appare e la 
porzione visibile della stringa viene "adattata" alla vista, mentre la 
larghezza della colonna continua ad essere adattata.
 
Potresti mettere un bel TEdit sopra alla grid e quando digiti il testo nella 
cella, anziche' variare la colonna visualizzi il testo nell'edit.
Se lo fa excell lo puoi fare anche tu :-)))
 
procedure TForm1.SG1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SG1.ColWidths[sg1.col]:=SG1.Canvas.TextWidth(SG1.cells[SG1.col,SG1.row]) + 
20;
  TEdt1.Text:=sg1.Cells[sg1.Col,Sg1.row];
end;
 
Cosi' hai tutto ....
 
Spero ti sia utile.
 
Ciao
 
Daniele
 

 Daniele
 
grazie ciao 
 
-- 
mnoga

 tagliato il fine stringa.
 
In questi casi ci sono diverse strategie utilizzate.
Una di queste e', dopo aver caricato la griglia, chiamare una 
procedura/funzione che adatta in automatico la larghezza della colonna in 
base larghezza maggiore del testo trovato in tutte le celle.
 
Sebbene non sia una cosa esageratamente complessa, e' stato gia' tutto fatto 
per le diverse griglie in circolazione.
 
Segui questi link ed usa quello migliore al tuo caso
 
https://stackoverflow.com/questions/17509924/adjust-column-width-dbgrid
 
https://www.swissdelphicenter.ch/en/showcode.php?id=2041
 (prima di passare 
alle tms usavo questa procedura).
 
Ovviamente avrai delle situazioni "personalizzate" dipendenti 
dall'architettura della form, necessita' del cliente ecc... che, a volte,
Tutto quanto ti possa essere suggerito poi dev'essere "metabolizzato" nel 
tuo programma; Per esempio quando imposti automaticamente la larghezza delle 
colonne e quella piu' larga non e' l'ultima (e se hai diverse griglie nella 
form) proma di vedere la colonna successiva devi per forza scorrere tutta la 
colonna. Non che sia un problema, ma devi considerarlo.
 
Ciao
 
Daniele