IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

TDBGrid et positionnement sur une ligne


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Par défaut TDBGrid et positionnement sur une ligne
    Bonjour,
    Pour faciliter la navigation dans une looongue liste (affichée dans un DBGrid donc) j'ai mis en place un accès rapide : un clic sur une lettre, un Locate dans le Dataset et il se positionne sur le 1er enregistrement commençant par la lettre choisie.
    Ce que je voudrais maintenant c'est afficher cet enregistrement en haut de la liste (et ainsi voir les suivants), car par défaut il se positionne tout en bas.
    J'ai essayé un peu à base de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DataSet.Locate(myField, LetterToLocate, [loCaseInsensitive, loPartialKey]) then      
      myDBGrid.Perform(WM_SYSCOMMAND, SC_VSCROLL, 0);
    ..mais ça provoque une violation d'accès "dans le module uxtheme.dll".

    L'idéal serait de faire un scroll en connaissant le nombre de lignes affichées et la hauteur de chacune, mais sans aller jusque là un scroll sur un nombre de lignes arbitraire serait déjà très bien !
    Des pistes svp ?

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    A la place du Locate (qui n'est pas fiable à 100%), peut-être que les BookMark pouraient servir à ça.
    A creuser ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Locate pas fiable ???
    ça c'est uniquement lors d'une combinaison Locate + Filter où il arrivait que l'on sorte du Filter en cours, sur une position totalement fausse !

    Le Problème n'est pas le positionnement logique mais le positionnement visuel sur lequel on a pas le contrôle ! Il est vrai que Locate se positionne sur l'enregistrement demandé, le DBGrid lui ne se charge que de l'afficher mais pas forcément à l'endroit voulu !

    j'aurais plutôt écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDBGrid.Perform(WM_VSCROLL, SB_BOTTOM, 0);
    Jouer avec SB_BOTTOM ou SB_TOP

    Sinon (en pseudo code, je le laisse voir avec BookMark, BookMarkStr, GetBookMark, GotoBookMark et FreeBookMark )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if DataSet.Locate(myField, LetterToLocate, [loCaseInsensitive, loPartialKey]) then      
    begin
      tmpBookMark := DataSet.BookMark;
      myDBGrid.Perform(WM_KEYDOWN, VK_NEXT, 0);
      myDBGrid.Perform(WM_KEYUP, VK_NEXT, 0);
      DataSet.BookMark:= tmpBookMark ;
    end;
    Avec un peu de chance, comme il est obligé de remonter d'une ligne après le Page Down, il l'a mettra en haut !

    tu peux jouer avec LeftCol avec le Hack des Private d'une TCustomGrid !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éclairé
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Le Problème n'est pas le positionnement logique mais le positionnement visuel sur lequel on a pas le contrôle ! Il est vrai que Locate se positionne sur l'enregistrement demandé, le DBGrid lui ne se charge que de l'afficher mais pas forcément à l'endroit voulu !
    Tout à fait, le Locate fonctionne très bien il s'agit juste de positionnement dans la grille.
    Citation Envoyé par ShaiLeTroll Voir le message
    j'aurais plutôt écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDBGrid.Perform(WM_VSCROLL, SB_BOTTOM, 0);
    Ha oui bien vu je vais en effet essayer avec WM_VSCROLL plutôt que WM_SYSCOMMAND ! Ces messages Windows je m'y perds toujours

  5. #5
    Membre éclairé
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Par défaut
    Bon cela fonctionne avec les 2 méthodes (WM_VSCROLL ou WM_KEYDOWN/UP avec un VK_NEXT).

    Par contre il y a un comportement que je ne comprends pas ; si j'utilise par exemple le WM_VSCROLL avec ou sans les 2 lignes de bookmark ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ABookmark := DM.DataSet.Bookmark;
     
    myDBGrid.Perform(WM_VSCROLL, SB_PAGEDOWN, 0); 
    myDBGrid.Perform(WM_VSCROLL, SB_PAGEUP, 0);
     
    DM.DataSet.Bookmark := ABookmark
    Tout d'abord sans le bookmark, si je recherche :
    la lettre "N" > le 1er enregistrement commençant par "N" est en 1ère ligne de la grille (très bien) ET est sélectionné (très bien aussi). Là où ça foire c'est pour un Locate sur les dernières lettres.
    la lettre "Z" > bon j'ai 1 seul enregistrement en "Z", il est forcément en dernière ligne mais l'enregistrement sélectionné est toujours celui de la 1ère ligne de la grille (pas bien mais normal ; d'où le bookmark).

    Maintenant avec le bookmark, l'enregistrement sélectionné est toujours le bon (cad le 1er commençant par la lettre ...) mais il se trouve localisé en plein milieu de la grille !! (dans la mesure du possible évidemment, pas le Z). Et ça je ne comprends pas, pourquoi une affectation de bookmark scrolle pile poil d'une 1/2 grille ?

    (c'est juste par curiosité alors je mets "résolu", merci à vous)

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Je pense que la différence vient du fait que dans un cas on descend alors que dans l'autre on remonte !

    Je t'avoue que je n'ai jamais trop cherché à modifier le comportement, déjà il trouve l'enregistrement, c'est déjà pas mal, après les utilisateurs s'habituent (ou ne savent même pas que c'est possible )

    Le plus souvent, par défaut, dans mes précédents projets, les grilles sont vides, il y a un outil de recherche qui te fourni de quoi filtrer les enregistrements (tu en récupère un centaine sur un bon million)

    Si le volume de données n'est pas prévu pour être trop grand et que l'execution reste locale, j'affiche la grille au complet mais au lieu d'un locate, j'utilise un WHERE sans le SELECT pour limiter le nombre de ligne affichée, c'est souvent plus facile à comprendre pour un utilisateur !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Locate pas fiable ???
    Apparement, je ne suis pas le seul.
    On en parlait ici : http://www.developpez.net/forums/d10...d/#post5647633
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Lung Voir le message
    Apparement, je ne suis pas le seul.
    On en parlait ici : http://www.developpez.net/forums/d10...d/#post5647633
    Sauf que celui qui a dit que le locate n'était pas fiable c'était toi
    redoran ne faisait que te citer

    http://www.developpez.net/forums/d10...d/#post5636596
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Sauf que celui qui a dit que le locate n'était pas fiable c'était toi
    redoran ne faisait que te citer

    http://www.developpez.net/forums/d10...d/#post5636596
    Oui, mais Redoran dit qu'il a rencontré le même problème.
    Après, si personne d'autre ne rencontre le même problème, tant mieux.
    Je ne faisais que remonter mon retour d'expérience.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Positionnement sur une ligne
    Par pandu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 15/01/2012, 11h11
  2. Réponses: 3
    Dernier message: 23/07/2009, 13h11
  3. Positionner sur une ligne d'un formulaire
    Par devdev dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/03/2009, 18h28
  4. Positionnement sur une ligne d un DataGridVoew
    Par Cedric33 dans le forum C#
    Réponses: 2
    Dernier message: 24/10/2008, 14h44
  5. comment se positionner sur une ligne de table mysql ?
    Par pas30 dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/01/2007, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo