Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Nicola - Aprile 29, 2015, 07:02:52 pm

Titolo: StringGrid
Inserito da: Nicola - Aprile 29, 2015, 07:02:52 pm
Dovrei fare questa operazione se  inserisco un carattere in una LabelEdit
mi vengono proposte in una List Box affiancata tutti i dati che iniziano per quel carattere:
esempio se digito 's' ho tutti in nomi che iniziano per s (Stefano, Sandro ecc..), se digito
'sa' solo Sandro, Salvatore; tramite l'evento OnChange ogni volta che cambia quanto presente
nella LabelEdit1.Text cambia anche l'elenco della ListBox. Il problema è che se utilizzo una
StringGrid editabile, non ho l'evento (o non lo trovo) on change; ho provato con "KeyPressed",
ma se assegno ad una variabile
Codice: [Seleziona]
text1:=StringGrid1.Cells[cl,rg];
il valore di text1 è sempre vuoto.
Grazie per l'aiuto
Titolo: Re:StringGrid
Inserito da: Legolas - Aprile 29, 2015, 10:23:42 pm
Prova a dare un'occhiata all'evento setedittext. Tramite aRow e aCol individui la cella che viene modificata, mentre quello che digiti nella cella lo ritrovi in value. Tieni presente che l'evento viene "sparato" alla pressione di qualsiasi tasto.
Titolo: Re:StringGrid
Inserito da: Nicola - Aprile 30, 2015, 11:14:06 am
Perfetto, ciò che mi serviva, grazie
Titolo: Re:StringGrid
Inserito da: Nicola - Aprile 30, 2015, 11:33:20 am
Altra domanda: è possibile avere solo alcune colonne editabili? ad esempio su una StringGrid
4*4 la colonna 2 e 4?
Titolo: Re:StringGrid
Inserito da: Legolas - Aprile 30, 2015, 03:48:37 pm
Sì, sfruttando l'evento onSelectCell

Codice: [Seleziona]
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin
  if aCol in [2, 4] then
    StringGrid1.Options := StringGrid1.Options + [goEditing]
  else
    StringGrid1.Options := StringGrid1.Options - [goEditing];
end;
Titolo: Re:StringGrid
Inserito da: Nicola - Aprile 30, 2015, 03:50:45 pm
Quindi la StringGrid nell'ispettore oggetti deve rimanere Options/GoEditing=false, giusto?
Titolo: Re:StringGrid
Inserito da: Legolas - Aprile 30, 2015, 03:52:57 pm
Sì, oppure lasciarlo a true e invertire la logica nell'evento on SelectCell ;)
Titolo: Re:StringGrid
Inserito da: Nicola - Aprile 30, 2015, 10:21:18 pm
Perfetto, va benissimo. Avrei un altro quesito  :-[
sempre nella StringGrid con 4 colonne, se sono ad esempio sulla prima colonna della prima riga
,premo il tasto enter, si sposta sulla 2 colonna prima riga, ecc; quando sono sull'ultima colonna
della prima riga, vorrei che andasse "a capo" cioè prima colonna seconda riga, ma il cursore rimane
sulla colonna 4 prima riga, a meno che non cliki col mouse; c'è un modo per spostarlo forzatamente?
Titolo: Re:StringGrid
Inserito da: Legolas - Maggio 01, 2015, 09:24:10 pm
Se ho capito bene quello che intendi, imposta la proprietà AutoAdvance della stringgrid su aaRightDown.
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 04, 2015, 01:51:40 pm
Hai capito perfettamente, grazie.
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 06, 2015, 07:19:26 pm
Altro problema:
ho una StringGrid1, al doppio click in una riga si apre una seconda StringGrid2;
il focus va sulla Cella [1,1]; inserisco i dati e torno sulla StringGrid1;
ripeto il doppio click su un'altra riga della StringGrid1, questa volta il focus mi va
sulla StringGrid2, ma non sulla Cella[1,1], ma sulla cella successiva, e cosi' via;
c'è un modo perchè il focus al click della StringGrid1 mi vada si sulla StringGrid2,
ma esattamente sulla Cella[1,1]; io ho usato il comando StringGrid2.SetFocus
ma non è sufficiente.
Grazie
Titolo: Re:StringGrid
Inserito da: Legolas - Maggio 06, 2015, 09:40:38 pm
Prova a selezionare la cella prima di passare il focus:

Codice: [Seleziona]
stringgrid2.col := 1;
stringgrid2.row := 1;
stringgrid2.setfocus;
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 07, 2015, 11:47:12 am
Ottimo, grazie. :D
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 08, 2015, 12:11:44 pm
Ancora una domanda sempre su StringGrid editabile; inserisco dei dati ad esempio nella
cella 2,2 e in automatico in base a quanto inserito mi viene compilata la cella 3,2;
proseguo su altre celle, e se torno sulla cella 2,2 e cambio il valore la cella 3,2 non viene
aggiornata con il nuovo valore; avevo intercettato l'output con "OnEditingDone"; in sostanza
al primo inserimento parte l'evento, ma al secondo no; infatti ho provato a fare un debug inserendo
un punto di stop, e al primo si ferma sul codice, mentre la seconda volta viene ignorato.
Da cosa potrebbe dipendere?
Titolo: Re:StringGrid
Inserito da: Legolas - Maggio 08, 2015, 08:54:56 pm
Uhm... ho provato a fare una cosa del genere:
Codice: [Seleziona]
procedure TForm1.StringGrid1EditingDone(Sender: TObject);
begin
  StringGrid1.Cells[3,2] := '';
  StringGrid1.Cells[3,2] := StringGrid1.Cells[2,2] + ' - editato';
end;
e funziona come dovrebbe. Riesci a fare un esempio minimo con il bug che hai riscontrato e postarlo qui?
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 11, 2015, 09:47:06 am
A dire il vero non capisco dove sia la differenza: ho fatto una prova con una procedura
di prova e funziona (!!)
Codice: [Seleziona]
procedure TForm1.StringGrid1EditingDone(Sender: TObject);
var
    cl,rg:integer;
    a,b:integer;
begin
cl:=StringGrid1.Col;rg:=StringGrid1.Row;
case cl of
     1: begin
        a:=strtoint(StringGrid1.Cells[cl,rg]);
        a:=a*3;
        StringGrid1.Cells[4,rg]:=inttostr(a);
        end;
     2:begin
       b:=strtoint(StringGrid1.Cells[cl,rg]);
       b:=b*10;
       StringGrid1.Cells[3,rg]:=inttostr(b); ;
       end;

     end;
Titolo: Re:StringGrid
Inserito da: Nicola - Maggio 11, 2015, 09:55:40 am
Scusa Legolas, la povera StringGrid non c'entra nulla, avevo dimenticato una regola
base: inizializzare le variabili  :-[ :-[; ora va alla perfezione!
Titolo: Re:StringGrid
Inserito da: Legolas - Maggio 11, 2015, 04:09:36 pm
Perfetto!  :D