Comment interdire la saisie dans certaines cellules d'un TStringGrid? [Résolu]

Signaler
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008
-
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
bonjour,
j'utilise un TStringGrid (nommé TabContexteBainDecapage) qui devient editable lorsque je clique sur un bouton :
if ModificationLigne = true then
TabContexteBainDecapage.Options := TabContexteBainDecapage.Options + [goEditing]
else
TabContexteBainDecapage.Options := TabContexteBainDecapage.Options - [goEditing];

Seules les x premières lignes sont éditables (Arow > nbBacs : non éditable) et a priori cela marche parfaitement.

Néammoins, si, étant en mode non éditable, je clique sur une cellule > nbBacs, le focus vient sur la cellule et rien ne se passe, ce qui est le fonctionnement attendu.
Si je clique ensuite sur le bouton pour rendre éditable le TStringGrid et que je reclique sur la cellule ayant le focus, elle est éditable.

Comment faire pour qu'une cellule ayant le focus ne soit pas éditable?

Ci-joint les événements codés:

KeyPress :
procedure TParametrageSIMBAD.TabContexteBainDecapageKeyPress(Sender: TObject;
var Key: Char);
begin
if not (Key in #13, '.', '0'..'9') then
key : = #9;
end;

SelectCell :

procedure TParametrageSIMBAD.TabContexteBainDecapageSelectCell(Sender: TObject;
ACol, ARow: Integer; var CanSelect: Boolean);
begin
if (Arow > nbBacs) then
begin
ParametrageSIMBAD.TabContexteBainDecapage.Options := ParametrageSIMBAD.TabContexteBainDecapage.Options - [goEditing];
end
else
begin
if ModificationLigne = true then
ParametrageSIMBAD.TabContexteBainDecapage.Options := ParametrageSIMBAD.TabContexteBainDecapage.Options + [goEditing]
else
ParametrageSIMBAD.TabContexteBainDecapage.Options := ParametrageSIMBAD.TabContexteBainDecapage.Options - [goEditing];
end;
end;

A l'initialisation le tableau est :

procedure initTableauLigneParametrageBain();
begin
{on fixe le nb de lignes et colonnes fixes}
ParametrageSIMBAD.TabContexteBainDecapage.FixedCols := 1;
ParametrageSIMBAD.TabContexteBainDecapage.FixedRows := 1;


{on définit la largeur des colonnes}
ParametrageSIMBAD.TabContexteBainDecapage.ColWidths[0] := 40;
ParametrageSIMBAD.TabContexteBainDecapage.ColWidths[1] := 70;
ParametrageSIMBAD.TabContexteBainDecapage.ColWidths[2] := 80;
ParametrageSIMBAD.TabContexteBainDecapage.ColWidths[3] := 95;
ParametrageSIMBAD.TabContexteBainDecapage.ColWidths[4] := 100;


{On définit les titres de la premiére colonne }
ParametrageSIMBAD.TabContexteBainDecapage.Cells[0, 0] := IHM_parametrage_NumeroBac;
ParametrageSIMBAD.TabContexteBainDecapage.Cells[1, 0] := IHM_parametrage_LongueurBac;
ParametrageSIMBAD.TabContexteBainDecapage.Cells[2, 0] := IHM_parametrage_volumeBac;
ParametrageSIMBAD.TabContexteBainDecapage.Cells[3, 0] := IHM_parametrage_vitesseEntrainementBac;
ParametrageSIMBAD.TabContexteBainDecapage.Cells[4, 0] := IHM_parametrage_DebitEvaporationBac;


ParametrageSIMBAD.TabContexteBainDecapage.Enabled := true;
ParametrageSIMBAD.TabContexteBainDecapage.refresh;
end;

merci
emmanuel

1 réponse

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,

Essaye déjà avec ça:

procedure TParametrageSIMBAD.TabContexteBainDecapageSelectCell(Sender: TObject;
ACol, ARow: Integer; var CanSelect: Boolean);
begin
if (Arow > nbBacs) then CanSelect := False;
End ;

et dans la même procédure :
ParametrageSIMBAD.TabContexteBainDecapage.Options : = ParametrageSIMBAD.TabContexteBainDecapage.Options - [goEditing];

Peut s'écrire comme ceci :
TabContexteBainDecapage.Options := TabContexteBainDecapage.Options - [goEditing];
pas besoin de donner le nom de la Form ici comme dans toutes les Procédures et Fonctions qui commence par le nom de la Form

@+
Cirec