Newsgroup: it.comp.lang.delphi
Titolo: Aggiustare larghezza colonne

Un DbGrid collegato ad un datasource, una query che io eseguo.
Niente di speciale, ma mi nasce un problema:
le colonne della query però hanno larghezze avolte più del necessario, 
occupando più del necessario e nascondendo altre colonne.
Occorre ridimensionarle manualmente, cosa che vorrei evitare.
Domanda: esiste un metodo per ottenere un dimensionamento automatico???
Spero di essere stato chiaro

> le colonne della query però hanno larghezze avolte più del necessario,
le colonne della GRIGLIA...
dai un pulsante di destra del topo a designtime e magicamente si apre
l'editor delle colonne della dbgrid.
A.

le colonne della GRIGLIA...
dai un pulsante di destra del topo a designtime e magicamente si apre
l'editor delle colonne della dbgrid.
Questa magia già la conoscevo, Harry Potter me l'aveva già suggerita di 
persona
bando agli scherzi.
Il problema è però a run-time
Io eseguo una query su tabelle diverse, con campi diversi...
quindi a design-time non so su cosa andrò a operare.
Per cui una volta eseguita la query posso adattare in qualche maniera la 
larghezza delle colonne, invece di farle impostare da Delphi secondo una sua 
logica?? 

 quindi a design-time non so su cosa andrò a operare.
la butto li
1) a design time aggiungi una sola colonna invisibile
2) a runtime, fai in modo che dopo la apertura del dataset venga
eseguito un metodo che cicla sui campi e per ognuno di essi aggiunge la
colonna.
A.

Ti posto una che mi č venuta in mente un paio di giorni fa sul lavoro che
sto facendo....
procedure TForm1.RidimensionaColonne;
var X,Xr,Yc : Integer;
begin
(* Ridimensiona Colonna in base alla lunghezza dei campi immessi *)
for Yc := 0 to E_Griglia.ColCount-1 do
begin
X:=49; // Dimensione minima
for Xr := 1 to E_Griglia.RowCount-1 do
if (Yc mod 2)= 0 then begin
if X<9*length(E_Griglia.Cells[Yc,Xr])+12 then  
              X:=9*length(E_Griglia.Cells[Yc,Xr])+12; //12 qualcosina in piů
E_Griglia2.ColWidths[Yc]:=X;
end;
end;
end;
Io l'ho messa alla fine di un INPUT, eventualmente metti tutto in
OnDrawCell e lo fa in automatico sulla base dei campi.
--- posted by geoForum on 
http://www.delphiedintorni.it

end;
Io ho usato un font courier new 10 (courier new perchè i caratteri
occupano tutti la stessa larghezza), nel caso usi altre fonti considera
come massima larghezza il carattere W, cioè w maiuscolo.
Se l'utente può ridimensionare o cambiare il font l'algoritmo va raffinato....
Nota, inoltre io lo uso solo per le colonne pari come si vede in Yc mod 2,
perchè su quelle dispari ho delle immagini....
Spero di aver capito cosa ti serve 
Ciao


Ti ringrazio, sopratutto per il codice che andrò ad esaminare ( lo devo 
convertire in C++, io uso
infatti CBuider ).
Ti farò sapere, ciao e ancora grazie   gianmarco

Matteo, mi sa che a lui serviva qlc x tdbgrid..
A


Questo potrebbe essere un inizio:
uses math;
const
 intBordo = 5;
procedure AggiustaGriglia(Griglia: TDBGrid);
var
 NumColonne, LungMax, intCont : Integer;
begin
  For intCont := 0 to Griglia.Columns.Count - 1 do
  begin
   // torno all'inizio del Dataset
   LungMax := 0;
   Griglia.DataSource.DataSet.First;
   while not (Griglia.DataSource.DataSet.eof) do
    begin
     // calcolo il testo piu' lungo
     LungMax := Max(LungMax, 
Length(Griglia.Columns[intCont].Field.DisplayText));
     Griglia.DataSource.DataSet.Next;
    end; // while
    // imposto la colonna alla dimensione massima
    Griglia.Columns[intCont].Width := (LungMax * 
Griglia.Columns[intCont].DefaultFont.Size)  + intBordo;
  end; // For intCont
end;
procedure TForm1.Panel4Click(Sender: TObject);
begin
 AggiustaGriglia(DBGrid1)
end;
A te l'onere di sistemarla al meglio ...
Ciao
-- 
ACSH
[TurboDelphi]
Chi fa da se', fatica il doppio

infatti CBuider ).
ciao
sperando di aver capito il problema
- in una griglia le colonne partono da 0
-accedo alle colonne con una scrittura del tipo
       "DBGrid1->Columns->Items[i]"
-ci attacco le proprieta' che mi servono
per esempio
DBGrid1->Columns->Items[4]->ReadOnly=true;  //solo lettura, quinta colonna
DBGrid1->Columns->Items[4]->Color=TColor(0x00EAEAFF);  //colore colonna
DBGrid1->Columns->Items[4]->Width =43; //larghezza colonna
(in notazione cbuilder)
inserire in ciclo for alla bisogna
gio



Infatti è ls strada che sto tentando, il problema è inserire una WIdth 
accettabile,
penso di ottenerla da qualche funzione dei fonti, ad esempio quella che mi 
la larghezza
di un carattere moltiplicandola per l'occupazione (size del campo).
Ciao e grazie gianmarco