Aide - Recherche - Membres - Calendrier
Version complète : Problème de liste (moi aussi...)
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
Guy-Lux
J'ai un souci avec une liste.
Démonstration :

A l'ouverture de mon pgm, j'ai la liste suivante :



Noter au bas de la liste un espace vide qui n'est pas assez grand pour afficher une ligne. Cet espace est le résultat de l'extension automatiquement calculée par la librairie Collapse de gestion de la DIA. Ma liste est à l'origine décrite sous PilRC pour contenir 10 lignes sur un écran "carré".
Je clique sur la flèche de defilement en bas de la liste et j'obtiens ca :



Jusque-là tout va bien, le bas de la liste est toujours propre.
Je clique sur la flèche de défilement en haut de la liste et là, patatra :



Un bout de ligne s'affiche au bas de la liste. Cette ligne n'est pas sélectionnable.
Si je clique de nouveau sur la flèche de défilement en bas de la liste, ca ne s'arrange pas :



Le bout le ligne précédent est toujours là, et la "vraie" ligne contenant le même texte est aussi dans la liste.

Si maintenant je sort puis rentre la ZVG, tout rentre dans l'ordre, la ligne 'intruse' disparait.

Si quelqu'un a une idée...
Patrice
Le fonctionnement est "normal" en tous cas : lorsque tu fais défiler la liste, l'OS optimise le tracé en faisant une copie "bitmap" de ce qui reste affiché dans la zone disponible...

Le fond du problème, c'est que la taille de la liste doit être ajustée précisément au nombres de lignes à afficher (ce que fait PilRC tout seul par exemple).

La taille ajustée automatiquement ne peut pas vraiment tomber pil-poil... C'est un problème de la librairie que tu utilises (un de ceux qui font que je ne l'utilise pas anim_wink.gif ) : à tout vouloir faire automatiquement, on atteint facilement les limites.

Solution ? Il vaut mieux ajuster toi-même la taille de la liste lorsque la DIA est affichée/masquée. Tu dois pouvoir faire une petite "verrue" dans le code de la librairie pour gérer ce cas. Il doit manquer un traitement spécifique pour les listes.

Les controles doivent être ajustés par un FrmSetObjectBounds() or pour une liste, il faut utiliser LstSetHeight(). Dans la librairie, il faudrait faire un cas particulier pour les listes où cette fonction est appelée à la place de l'autre. La hauteur passée à cette fonction est le nombre de lignes, donc si "height" est la hauteur passée à FrmSetObjectBounds(), tu passeras "height / FntLineHeight()" à LstSetHeight().

Mon explication doit être un peu compliquée, je vais essayer de ressortir la librairie pour faire plus clair... anim_wink.gif
Guy-Lux
Merci Patrice, je pense avoir compris (l'avenir le dira...).
Je vais (tenter de) créer une fonction de resize spécifique pour les listes.
Patrice
Bon, la librairie est un peu plus sommaire que ce je dont me souvenais... Alors, tu dois appeler cette fonction pour redimensionner ta liste :

CODE
void CollapseMoveResizeFormObject(FormType* frmP, UInt16 objectID, Int16 moveOffsetCoordsX, Int16 moveOffsetCoordsY, Int16 resizeOffsetCoordsX, Int16 resizeOffsetCoordsY)

{

    RectangleType objectRect;



    FrmGetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);

    

    objectRect.topLeft.x += moveOffsetCoordsX;

    objectRect.topLeft.y += moveOffsetCoordsY;

    objectRect.extent.x += resizeOffsetCoordsX;

    objectRect.extent.y += resizeOffsetCoordsY;    

    

    FrmSetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);

}


Je te propose d'en définir une un peu différente pour les listes (là, je fais un peux quick & dirty, tu arranges comme tu veux après anim_wink.gif ) :

CODE
void CollapseMoveResizeFormList(FormType* frmP, UInt16 objectID, Int16 moveOffsetCoordsX, Int16 moveOffsetCoordsY, Int16 resizeOffsetCoordsX, Int16 resizeOffsetCoordsY)

{

    RectangleType objectRect;



    FrmGetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);

    

    objectRect.topLeft.x += moveOffsetCoordsX;

    objectRect.topLeft.y += moveOffsetCoordsY;

    objectRect.extent.x += resizeOffsetCoordsX;

    objectRect.extent.y += resizeOffsetCoordsY;    

    

    FrmSetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);

    LstSetHeight(frmP, FrmGetObjectIndex(frmP, objectID), objectRect.extent.y / FntLineHeight();

}


A noter que l'utilisation de FntLineHeight() n'est correcte que si la même police utilisée pour la liste est active lorsque tu appelles cette fonction...
Guy-Lux
Ouaaaa... alors là, c'est caviar.
Dans mes bras copain ! icon_biggrin.gif
Guy-Lux
J'ai bricolé ca à partir de tes indications et cela semble fonctionner :
CITATION
RectangleType objectRect;

FrmGetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);
 
objectRect.topLeft.x += moveOffsetCoordsX;
objectRect.topLeft.y += moveOffsetCoordsY;
objectRect.extent.x += resizeOffsetCoordsX;
objectRect.extent.y += resizeOffsetCoordsY;  
 
FrmSetObjectBounds(frmP, FrmGetObjectIndex(frmP, objectID), &objectRect);
if ((objectRect.extent.y / FntLineHeight()) < 10)
 LstSetHeight(GetObjectPtr(objectID), 10);  
else
 LstSetHeight(GetObjectPtr(objectID), (objectRect.extent.y / FntLineHeight()));  

J'ai été obligé d'ajouter le test sur les 10 lignes car sinon, en raison des arrondis successifs, une ligne disparait de la liste à chaque "entrée/sortie" de la DIA.
Patrice
CITATION(Guy-Lux)
J'ai été obligé d'ajouter le test sur les 10 lignes car sinon, en raison des arrondis successifs, une ligne disparait de la liste à chaque "entrée/sortie" de la DIA.

Amusant ça... C'est peut-être du au fait que selon la fonction utilisée la "taille" de la liste inclut les 2 pixels de bordures ou pas (moi j'appelerais ça un bug de l'OS... mais on ne va pas se fâcher pour ça anim_wink.gif )

Ceci dit, si tu n'utilises la fonction que pour réduire ou agrandir la liste, tu peux virer le SetObjectBounds (qui permet juste de la déplacer en même temps) et calculer la taille de la liste directement et de manière "propre".
pch4x4
moi je fait varier le nb d"éléments dans la liste (et sa taille) selon l'orientation de l'écran (paysage/portrait) avec
function LstSetHeight(ListP:ListPtr;intemNum:Int16):Int16; inline(SYSTRAP,$A1B6);
et ca va tout seul !
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.