Ciao,
quella che ti sto per descrivere, è una soluzione che avevo trovato anni fa, non ricordo i motivi, e può anche essere che nel frattempo le cose siano cambiate, ma oramai mi sono abituato così :)
Questo il codice che uso a programma per nascondere le colonne, in pratica imposto la loro larghezza a 0:
WrkStringGrid.ColWidths[NumCol]:=0;
dove WrkStringGrid è il nome della tua StringGrid, e NumCol è il numero della colonna che vuoi nascondere. Occhio che la prima colonna è la colonna 0, e così via.
Il difetto di questa soluzione, è che se uno sa che c'è questa cosa, potrebbe "allargare" la colonna col mouse, come si fa normalmente in "Esplora risorse" o simili
Ciao, Mario
Ciao @petrusic.
Dal punto di vista generale, tendenzialmente non si usa una "stringgrid" per contenere dati (formule o altro) come fosse un foglio Excel.
Accennava @CompilaQuindiVa che quei dati possono essere raccolti altrove (ad esempio in un array a due dimensioni che simula riga e colonna per i dati eccedenti).
E in effetti questa potrebbe essere sicuramente la soluzione più semplice. Poi ovviamente è necessario vedere il tuo contesto, ad esempio se quei dati necessitano di svariate modifiche e quindi è necessario presentarli comunque in modalità grafica.
Ti ricordo che, come hai fatto nel passato nel personalizzare il riempimento della StringGrid, puoi sempre non "disegnare" quelle colonne lasciando a vuoto il valore in caso ad esempio di uso utente, e di visualizzarne il contenuto in caso di "progettazione". In questo caso l'uso di un semplice array esterno ti facilita le cose.
Complessità delle operazioni, a cui giustamente tu accenni: prova a fare un pensiero a delle procedure (o funzioni) che facciano il lavoro "sporco", non sei tu a codice che riempi 1, 2 tabelle o n array, è la tua procedura che lo fà in fase di riempimento o lettura della stringgrid senza doverti preoccupare di dover fare queste operazioni da tutti i "punti" in cui inserisci i dati.
Esempio:
type
TStringGrid1 = Class(TStringGrid)
....
....
public
procedure RiempiGriglia(.........);
end;
var StringGrid1: TStrinGrid;
stringarray: array of array of string; //Devi dimensionare da qualche parte l'array prima di usarlo
USOPROGETTAZIONE: boolean = False; /SE messo a TRUE indica che i dati devono essere visualizzati in griglia
...........
...........
procedure TStringGrid1.RiempiGriglia(.........);
begin
//Qui non faccio i controlli di coerenza .... devi farli tu in base ai tuoi dati.
//Il tutto può ovviamente evolversi.
.......
.......
//Col e Row indicano la cella che devi riempire
//ColDaNascodere indica il numero massimo di colonne da visualizzare
if (not USOPROGETTAZIONE) and (Col >= ColDaNascondere) then
begin
//Inseriamo i dati nell'array invece che nella griglia
stringarray[Col-ColDaNascondere][Row] := DATO_DA_INSERIRE;
end
esle
begin
//Inseriamo i dati nella griglia
StringGrid1.Cells[Col, Row] := DATO_DA_INSERIRE;
end;
end;
Oltre a questo, c'è la gestione come accennato del ridimensionamento dell'array a runtime (sia in costruzione / modifica / distruzione), del suo svuotamento preliminare quando carichi una griglia nuova, e della operazione opposta ossia della lettura dei dati per la loro memorizzazione dall'array o dalla griglia in base all'uso utente o progettazione.