Prob avec DbGrid [Résolu]

solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 27 janv. 2013 à 23:11 - Dernière réponse : LouarnBZH 1 Messages postés jeudi 12 décembre 2013Date d'inscription 12 décembre 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 29 janv. 2013 à 20:57
3
Merci
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

Merci solilog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de solilog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 28 janv. 2013 à 16:04
0
Merci
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
Commenter la réponse de cs_cantador
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 28 janv. 2013 à 19:53
0
Merci
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
Commenter la réponse de solilog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 28 janv. 2013 à 22:35
0
Merci
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 29 janv. 2013 à 10:35
0
Merci
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 30 janv. 2013 à 14:01
0
Merci
de rien solilog et content que
tu ais pu finalement t'en sortir.

cantador
Commenter la réponse de cs_cantador
LouarnBZH 1 Messages postés jeudi 12 décembre 2013Date d'inscription 12 décembre 2013 Dernière intervention - 12 déc. 2013 à 10:49
0
Merci
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.
Commenter la réponse de LouarnBZH

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.