Delphi - Get et Set de barre de Défilement de la Position d'une ListView
Il pourrait sembler comme une bête & simple question, et pourtant, j'ai été incapable de trouver une réponse satisfaisante. En gros, j'ai un TListview (style = vsReport) avec des données. Parfois, j'ai du le mettre à jour, et donc, je dois effacer la liste et de le remplir à nouveau avec la mise à jour des données.
Cependant, quand je fais ça, la position de la barre de défilement est réinitialisé à 0. Je voudrais être en mesure d'obtenir la barre de défilement position avant que la compensation et le ramener à ce qu'il était avant. Si la mise à jour des données a exactement le même nombre de lignes que les anciennes données, j'ai besoin de la barre de défilement pour être exactement à la même position qu'avant; si non, j'ai juste besoin qu'il soit plus ou moins à la même place qu'avant.
Semble facile, droit? Pourtant, tout ce que j'ai trouvé sont des hacks ou des réglages avec TopItem et MakeVisible. Est-il approprié de la méthode pour le faire?
Merci!
Il me semblait plus logique, car la mise à jour des données peut avoir plus ou moins de lignes que d'anciennes données. Suis-je tort?
Que faire si le nombre d'éléments dans la liste augmente? Que faire si l'ancien élément est "hors service" (c'est à dire, n'apparaît pas dans la "mise à jour" de la liste)?
Votre question était: "Si la mise à jour des données a exactement le même nombre de lignes que les anciennes données". Si il y a moins de lignes, juste de mettre à jour ceux que vous avez besoin et de supprimer le reste (un par un). Si il y a des "déclassés" éléments, il suffit de remplacer le contenu actuel avec le nouveau contenu qui devrait être là, au lieu de cela maintenant. Compensation/recréer les éléments de la liste est une opération coûteuse.
Je n'ai jamais dit "supprimer des éléments à garder la barre de défilement à la même position" n'importe où dans ce que j'ai écrit. En fait, je lui ai conseillé le contraire (ne pas supprimer des éléments à tous, si vous n'avez pas à le faire). Veuillez lire ce que j'ai écrit de nouveau.
OriginalL'auteur Allain McCain | 2013-12-29
Vous devez vous connecter pour publier un commentaire.
Enregistrer le haut de l'élément avant de l'effacer,
Après la mise à jour, faites défiler la liste, de sorte que ceux qui sont sauvés haut point " y " position sera de 0 (+- tête hauteur):
En fait, depuis que vous êtes de remplir à nouveau la liste, vous devez concevoir un mécanisme permettant de trouver l'élément sur lequel vous voulez être en haut au lieu d'enregistrer une référence.
Si vous n'aimez pas la modification de la position de défilement grâce à la 'premier élément', étant donné que les fonctions comme
SetScrollInfo
,SetScrollPos
ne sera pas de mise à jour de l'espace client de la commande, vous pouvez utiliserGetScrollInfo
d'obtenir la "osbl" d'unTScrollInfo
avant la suppression de la liste, et puis de l'envoyer que de nombreuxWM_VSCROLL
messages avec " SB_LINEDOWN` après le remplissage.Enregistrer la position de défilement:
Après l'alimentation, de défilement (en supposant que la position de défilement est 0):
ou,
L'utilisation de 'commctrl'
Wow, comment bâclée. Je voudrais utiliser le
TopItem
, sauf dans mon cas, j'ai actualiser la liste parce que un utilisateur peut avoir utilisé (et donc supprimée) un élément de la liste - et le point haut est celui que l'utilisateur a choisi de supprimer, ça ne marcherait pas. Donc je suppose que je suis coincé avec la bâclée solution d'envoi de messages de défilement X nombre de fois, en espérant qu'il arrive à la position précise qu'il était avant.OriginalL'auteur Sertac Akyuz
OriginalL'auteur BRTH1