Prob avec DbGrid

Résolu
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 27 janv. 2013 à 23:11
LouarnBZH Messages postés 1 Date d'inscription jeudi 12 décembre 2013 Statut Membre Dernière intervention 12 décembre 2013 - 12 déc. 2013 à 10:49
Bonsoir,
Besoin d'aide avec dbGrid. Vais essayer d'être court et clair.
Je veux selon une valeur d'un champ locker la saisie ET sauter au dessus si on TAB / Shft TAB.
Ca marche si on met en mode concept la valeur du tColums[x].reanonly à true/false.
- le TAB / Shft TAB le saute bien
- la saisie est lockee même si on click sur le champ
mais en mettant un truc genre
dbgrid1.columns[x].readonly := ( tb1.FieldValues('Status')='X')
dans un evenement comme
AfterScroll du dataset, ou onColumEnter / Exit du dbgrid
- la saisie est bien lockee
- mais le TAB ne - saute / saute pas - selon la valeur du champ.
Il change bien la valeur du columns[x].readonly selon le record (debug / ou meme coller un checkbox pour voir changer la valeur en scrollant) mais le TAB ne réagit pas comme en concept. En fait il fait ce qui était à la conception, càd
si columns[x].readonly était true, les TABs saute bien le champ
si était false, le TAB s'arrete sur le champ.
Question (enfin):
dans quel evenement (ou comment) puis-je mettre
dbgrid1.columns[x].readonly := ( tb1.FieldValues('Status')='X')
ET QUI PREND EN COMPTE le TAB / Shft TAB selon la valeur du champ

Ah j'oubliais: D5
Merci à vous.

solilog

7 réponses

solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
29 janv. 2013 à 20:57
Bonsoir,
là ça va mieux:

procedure TForm1.ds1DataChange(Sender: TObject; Field: TField);
begin
if sender = nil then exit;
gr1.columns[3].readonly := not (trim(tb1.Fields[2].asstring)='');
end;

procedure TForm1.gr1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var idx: integer;
begin
if (key=9) then // TAB détécté
begin
idx := gr1.SelectedIndex; // selected colomn
// saut avant
if (idx<gr1.Columns.count-2) // pas la derniere colonne
and (gr1.Columns[idx+1].readonly)
and not (ssShift in Shift)
then
gr1.SelectedIndex := idx+1
// saut arriere
else if (idx>1) // pas la premiere colonne
and (gr1.Columns[idx-1].readonly)
and (ssShift in Shift)
then
gr1.SelectedIndex := idx-1
end;
end;
On peut faire mieux dans les if mais c'est bon.
Pffff! Tout çà pour çà. Juste pour corriger une mauvaise gestion du readonly des col d'une dbgrid. Ciao et merci.

solilog
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 janv. 2013 à 16:04
Salut solilog,

ça devrait marcher sur le OnDataChange du TDatasource

PROCEDURE TForm1.DSMonQuery(Sender: TObject; Field: TField);
BEGIN
  IF Sender = NIL THEN exit;

// ton code

END;


en testant le sender à nil, cela permet de déclencher cet évènement chaque fois qu'il y a changement d'enregistrement et d'exécuter le code placé après.

cantador
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
28 janv. 2013 à 19:53
Bonsoir cantador,
Merci mais c'est pas mieux. L'évènement marche bien mais les TAB / Shft TAB réagissent toujours mal. C'est le premier record qui décide de l'effet des TABs.

procedure TForm1.ds1DataChange(Sender: TObject; Field: TField);
begin
if sender = nil then exit;
gr1.columns[3].readonly := ( trim(tb1.fields[2].asstring)='');
// checkbox pour voir les records avec col3 readonly.
ck1.checked := gr1.columns[3].readonly;
end;
C'est la valeur de field2: si (field2='') on lock col3 et doit la sauter par au-dessus si TAB. Si le record dessous est <>'' on doit pouvoir saisir et TAB doit s'arrêter sur col3.
Pour locker c'est bon, col3 est bien lockée pour les records ='', mais le TAB réagit selon l'état du 1er record de la grille. Si 1er record field='' le TAB sautera toujours col3, sinon il s'arrêtera toujours.

Merci pour l'évenement (c'est mieux que OnScroll qui ne marche pas pendant les edit/insert, là c'est bon. Mais pas le P..... de TAB.
Bonne soirée.

solilog
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 janv. 2013 à 22:35
c'est un bon début..
je regarderai demain mais avec notre dbgrid ancestral ça va être dur..
pour info, je me sers du TcxGrid qui prévoit ce type d'évènement.


cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 janv. 2013 à 10:35
voilà une piste sérieuse en combinant deux évènements :

J'ai fait le test avec la table Orders de la démo de delphi..


procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if sender = nil then exit;
  Dbgrid1.columns[2].readonly := Query1.Fields[1].Value = 1356;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
  i: integer;
begin
  if HiWord(GetKeyState(VK_TAB)) <> 0 then
  begin
    with (Sender as TDBGrid) do
    begin
      for i := 0 to DbGrid1.Columns.Count - 1 do
        if Dbgrid1.columns[i].readonly then
          Query1.Fields[i + 1].FocusControl;
    end;
  end;
end;



Le saut se fait bien, mais il reste encore un souci d'affichage
qui peut être réglé avec un refresh quelque part..

on est plus très loin de la solution finale restant toutefois
un peu tarabiscotée..


cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 janv. 2013 à 14:01
de rien solilog et content que
tu ais pu finalement t'en sortir.

cantador
0
LouarnBZH Messages postés 1 Date d'inscription jeudi 12 décembre 2013 Statut Membre Dernière intervention 12 décembre 2013
12 déc. 2013 à 10:49
Bonjour,

La seule solution que j'ai trouvé est d'appeler la méthode SetColumnAttributes sur le datachange de la grille.
Cette methode mets a jour un tableau, indiquant si les colonnes sont dans la tabulation ou pas.
Pour appeler cette méthode qui est protégée, il faut passer par un objet perso qui la publie.
0
Rejoignez-nous