Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Nicola - Luglio 19, 2016, 09:31:16 am

Titolo: Focus sulle celle StringGrid (risolto)
Inserito da: Nicola - Luglio 19, 2016, 09:31:16 am
Ho provato a guardare in giro ma non riesco proprio a risolvere il problema: in una StrinGrid editabile quando inserisco dei valori ad esempio nella cella 1,1 il testo viene
assegnato ad una variabile e premendo "enter" (o invio) invece di passare alla cella
successiva, vorrei che il focus si spostasse nella cella +2; ecco il codice di esempio:
Codice: [Seleziona]
procedure TForm1.StringGrid1EditingDone(Sender: TObject);
var cl,rg:integer;
    a:string;
begin
cl:=StringGrid1.Col;rg:=StringGrid1.row;
if cl=1 then begin
        a:=StringGrid1.Cells[cl,rg];
        cl:=3;
        Stringgrid1.Col:=cl;StringGrid1.Row:=rg;
        StringGrid1.SetFocus;
        end;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Stringgrid1.col:=1;Stringgrid1.row:=1;
  stringgrid1.setfocus;
end;

per prima cosa all'apertura della Form il focus mi va nella colonna 3 (anzichè in 1); poi quando edito la cella 1,1 mi va sulla 2,1 anzichè 3,1;
proprio non riesco a comprendere  :-[
grazie a chi mi vorrà illuminare, sarà anche una banalità ma non ne esco.
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 19, 2016, 03:35:05 pm
Hai provato così, segue esempio:

Codice: [Seleziona]
StringGrid1.Row:=20;
StringGrid1.Col:=5;
StringGrid1SelectCell(self,20,5,cansel);
StringGrid1.SetFocus;
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 19, 2016, 03:51:01 pm
Mi riporta questi errori:
"unit1.pas(37,5) Note: Local variable "a" is assigned but never used
unit1.pas(60,48) Error: Identifier not found "cansel"
unit1.pas(74) Fatal: There were 1 errors compiling module, stopping"
Codice: [Seleziona]
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
var cl,rg:integer;
    a:string;
begin
cl:=StringGrid1.Col;rg:=StringGrid1.row;
if cl=1 then begin
        a:=StringGrid1.Cells[cl,rg];
        cl:=3;
        Stringgrid1.Col:=cl;StringGrid1.Row:=rg;
        StringGrid1SelectCell(self,cl,rg,cansel);
        StringGrid1.SetFocus;
        end;

end;


avevo già provato perchè facendo una ricerca sul forum veniva suggerito di utilizzare
questa funzione (SelectCell);
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 19, 2016, 03:54:33 pm
metti CanSelect al posto di cansel
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 19, 2016, 04:03:27 pm
Mi da errore, che francamente non ho le conoscenze per comprendere  :-[
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 19, 2016, 04:10:36 pm
riesci a darmi un sorgente che replica il problema? io questa sera quando torno a casa lo provo e ti dico
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 19, 2016, 04:12:51 pm
Ecco qua, grazie in anticipo !
Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids;

type

  { TForm1 }

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure StringGrid1EditingDone(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
      var CanSelect: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.StringGrid1EditingDone(Sender: TObject);
var cl,rg:integer;
    a:string;
begin
cl:=StringGrid1.Col;rg:=StringGrid1.row;
if cl=1 then begin
        a:=StringGrid1.Cells[cl,rg];
        cl:=3;
        Stringgrid1.Col:=cl;StringGrid1.Row:=rg;

        StringGrid1.SetFocus;
        end;

end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
var cl,rg:integer;
    a:string;
begin
cl:=StringGrid1.Col;rg:=StringGrid1.row;
if cl=1 then begin
        a:=StringGrid1.Cells[cl,rg];
        cl:=3;
        Stringgrid1.Col:=cl;StringGrid1.Row:=rg;
        StringGrid1SelectCell(self,cl,rg,canselect);
        StringGrid1.SetFocus;
        end;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
   Stringgrid1.col:=1;Stringgrid1.row:=1;
  stringgrid1.setfocus;
end;

end.
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 19, 2016, 11:42:40 pm
Guarda ti ho fatto un esempio dal nuovo, premi il pulsante e vedrai che ti imposta il focus della cella.

Buona serata e buon lavoro
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 20, 2016, 09:33:36 am
ti ringrazio, il tuo funziona (ovviamente), io ho apportato alcune modifiche che
servivano per il tipo di lavoro che devo fare e purtroppo non mi da il risultato
sperato :'(
Se inserisco un testo alla cella 1,1 mi deve dare un testo + una stringa (che prelevo da un dbase) nella cella 2,1 saltare quella maledetta cella ed andare direttamente alla cella 3,1, invece niente mi resta sulla 2,1.
Ti allego anche il sorgente se hai tempo e voglia di dare un'occhiata, altrimenti
grazie comunque sei sempre gentile
Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure StringGrid1EditingDone(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
      var CanSelect: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
  Stringgrid1.col:=1;
  Stringgrid1.row:=1;
  StringGrid1.SetFocus;
end;

procedure TForm1.StringGrid1EditingDone(Sender: TObject);
var cl,rg:integer;
    a:string;
    variabile: boolean;

begin
cl:=StringGrid1.Col;rg:=StringGrid1.row;
if cl=1 then begin
        a:=StringGrid1.Cells[cl,rg];
        a:=a+'prova';inc(cl);
        StringGrid1.Cells[cl,rg]:=a;inc(cl);
        StringGrid1.Col:=cl;StringGrid1.Row:=rg;
        Stringgrid1.OnSelectCell(self, cl, rg, variabile);
        Stringgrid1.SetFocus;
        end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   variabile: boolean;
begin

end;

end.
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 20, 2016, 09:37:41 am
Ho compilato la tua versione e a me funziona, va ad inserire il testo con un'aggiunta nella cella immediatamente successiva a destra e senza che io modificassi nulla. Una domanda: che versione di lazarus usi?
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 20, 2016, 09:40:30 am
1.6
Fpc 3.0.0
Revisione SVN 51630
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 20, 2016, 09:42:02 am
Aspetta, anche a me aggiorna la cella 2,1 nel modo che desidero, il problema è che
il cursore rimane sulla 2,1 invece la dovrebbe saltare e passare alla casella 3,1
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 20, 2016, 10:03:34 am
E' vero anche per me stesso problema. Probabilmente perchè l'editing di default si sposta sul campo successivo. Io però ho usato un truschino con l'ausilio di un timer.

Guarda l'esempio allegato.
Titolo: Re:Focus sulle celle StringGrid
Inserito da: Nicola - Luglio 20, 2016, 12:02:57 pm
Si funziona anche qua, non ho capito perchè ma tanto mi basta, ora provo
ad implementarlo sul progetto originale.
Ancora grazie.
Nicola
Titolo: Re:Focus sulle celle StringGrid
Inserito da: xinyiman - Luglio 20, 2016, 12:09:44 pm
Figurati, metti solo risolto al 3d