Gambas France BETA


Pas de compte ? Incription

Problème Affichage des images dans un controle listview

1
AuteurMessages
caracole#1 Posté le 4/1/2011 à 21:12:00
Bonjour et Bonne année !

J'ai une base de données qui contient les emplacements d'images sur mon disque.
je lis cette base et je veux afficher les photos sous forme de vignette et un texte associé.
ca fonctionne "parfaitement" a ceci près:
le formulaire s'affiche seulement quand la requete de la base de donnée est terminée.
que faire pour que le formulaire s'affiche et les la listview aussi sans attendre la fin ?
j'ai tout essayé: listView1.refresh() 'ne fonctionne pas, le ME.refresh() idem...

Je pense qu'il y a d'autre solutions mais je ne comprend pas l'utilisation des controles datasource, databro

merci de votre aide

Pierre
mon code.
dans MMain.class
1
PRIVATE hCon AS NEW ConnectionPUBLIC SUB Main() hCon.Type = "sqlite3" hCon.host = User.Home & "/Bureau" hCon.Name = "photo.db" hCon.OpenEND


FMain.form un controle listview

dans FMain.class

1
PUBLIC hResult AS ResultPUBLIC hphoto AS ImagePUBLIC cphoto AS imagePUBLIC filename AS StringPUBLIC ID AS StringPUBLIC Size AS integerPUBLIC SUB Form_Open() ME.center ListView1.Move(0, 0, ME.w, ME.h ) MMain.Main() 'ouverture de la base de donnéesENDPUBLIC SUB form_Resize() ListView1.resize(ME.w, ME.h ) ENDPUBLIC SUB showDB() hResult = DB.Exec("SELECT * FROM photos WHERE width < 1000 order by width asc") FOR EACH hResult filename = hResult!filename id =hResult!id hphoto = image.Load(filename) 'l'image originale cphoto = hphoto.Stretch(128, 96) 'réduction de l'image ListView1.Add(ID, Size & " " & filename, cphoto.Picture) ' listView1.refresh() 'ne fonctionne pas PRINT filename 'DebugNEXT END
linuxos#2 Posté le 4/1/2011 à 23:13:00
Un peu de sel, de poivre et la crevette sera... Bonsoir caracole,

En fait souvent il est nécessaire de redonner du temps au système pour qu'il puisse mettre a jour ou rafraichir
certaines parties graphiques.

Cela s'effectue par la commande suivante:

WAIT <valeur en secondes>

Ex: WAIT 0.001

est suffisant par exemple pour rafraichir un changement de curseur: Application.Busy = 1

Attention il ne faut pas utiliser a outrance la commande WAIT, car premièrement cela
ralenti un programme et d'autre part le fait de redonner du temps au système il peut arriver
que d'autre événement soient traités pendant ce temps la.

Remarque: la commande WAIT seule, sans valeur, permet prendre en compte de nouveau événement, timer, process, etc... mais pas des entrées de clavier et autres.
Se référer a la doc sur le Wiki pour le détail complet.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
caracole#3 Posté le 4/1/2011 à 23:23:00
Bonsoir caracole,

En fait souvent il est nécessaire de redonner du temps au système pour qu'il puisse mettre a jour ou rafraichir
certaines parties graphiques.

Cela s'effectue par la commande suivante:

WAIT <valeur en secondes>

Ex: WAIT 0.001

est suffisant par exemple pour rafraichir un changement de curseur: Application.Busy = 1

Attention il ne faut pas utiliser a outrance la commande WAIT, car premièrement cela
ralenti un programme et d'autre part le fait de redonner du temps au système il peut arriver
que d'autre événement soient traités pendant ce temps la.

Remarque: la commande WAIT seule, sans valeur, permet prendre en compte de nouveau événement, timer, process, etc... mais pas des entrées de clavier et autres.
Se référer a la doc sur le Wiki pour le détail complet.

Olivier



Bonsoir Olivier,

L'instruction Print que j'ai mis dans mon exemple fonctionne je la voie afficher rapidement, mais la listeview ne s'affiche seulement que lorsque la boucle est terminée.

Je me souviens du temps où je programmai en VB6, il existait la méthode refresh qui justement evitait ce genre de PB.

j'ai essayé le wait .avec ce parametre 0.001. c'est parfait j'ai donc appris quelque-chose.

ceci dit, je ne sais pas comment récuperer de la listeview par exemple un doubleclick sur un item, la clé ou le filename ou l'image...

tu peux m'aider ?

Merci

Pierre

linuxos#4 Posté le 4/1/2011 à 23:43:00
Un peu de sel, de poivre et la crevette sera... Pour cela il faut utiliser l'evenement suivant du ListView

1
PUBLIC SUB ListView1_DblClick() ' Evenement lorsque l'on double click dans le ListView1 IF ListView1.Item.Selected = TRUE THEN ListView1.MoveTo(ListView1.key) print "La clé est: " & ListView1.key End IfEnd


Voila
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
caracole#5 Posté le 4/1/2011 à 23:49:00
Pour cela il faut utiliser l'evenement suivant du ListView

1
PUBLIC SUB ListView1_DblClick() ' Evenement lorsque l'on double click dans le ListView1 IF ListView1.Item.Selected = TRUE THEN ListView1.MoveTo(ListView1.key) print "La clé est: " & ListView1.key End IfEnd


Voila


Cela ne fonctionne pas ListView1.Item.Selected revoie toujours FALSE
par contre la valeur de Listview1.Key correspond bien à la clé que j'ai mis dans la liste.
caracole#6 Posté le 4/1/2011 à 23:59:00
Il y a une chose que je ne comprends pas c'est la classe virtuelle .listviewItem

comment la déclare-t-on ?

dim litem as ListviewItem ca donne une erreur!

spheris#7 Posté le 5/1/2011 à 20:00:00
Caracole,
DIM , c'est pour une variable.
PUBLIC ou PRIVATE, c'est pour une classe.
d'où :
PRIVATE Mylistitem as Listitem
;) ;)
Prokopy#8 Posté le 6/1/2011 à 18:37:00
Kinder PinguiNon Spheris,

On peut très bien utiliser Dim pour instancier des classes. Exemple :

1
PUBLIC SUB _new()DIM monBouton AS NEW Button(ME)monBouton.Text = "Salut !"monBouton.H = 20monBouton.W = 60monBouton.Y = 30monBouton.X = 60End


Si tu mets ça dans le code source d'un formulaire, ton bouton sera bien affiché. Public et Private sont utilisés pour créer des variables globales à ta classe (tu les déclares tout en haut). Avec Dim tu crées une variable locale à ta fonction : elle ne pourra être utilisée ailleurs. Si on utilise tout le temps Public ou Private avec des contrôles c'est parce que on a besoin d'y accéder partout dans le formulaire, à part peut-être pour des variables temporaires pour les For Each ou trucs du genre. ;)

Par exemple, ceci est valide :
1
PRIVATE mesEnfants AS IntegerPublic Sub _new()DIM enfant AS ControlFor EACH enfant IN ME.Children PRINT enfant.NameNext mesEnfants = ME.Children.Count PRINT Subst("J'ai &1 enfants ! Si ! Si !", mesEnfants)END


Pour revenir au problème de caracole, si tu ne peux pas déclarer d'objet .ListViewItem c'est justement parce que c'est une classe virtuelle (d'où l'erreur). Le principe de ces classes est justement de ne pas avoir à les déclarer ni à les manipuler. Par exemple, si tu veux accéder au texte de l'Item courant de MaListView, il te faut juste faire MaListViwe.Current.Text. C'est en fait une manière d'organiser sa classe.

Tu peux jeter un œil ici pour des infos plus poussées (mais attention c'est du hard ! :study: ) : http://gambasdoc.org/help/def/virtual?fr
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
spheris#9 Posté le 7/1/2011 à 21:53:00
Prokopy,
c'était un piège pour savoir si tu suivais
:tongue: :tongue: :tongue:

Merci ,j'ai appris quelque chose.
Tourner 7 fois la langues dans sa bouche av.....
;) ;)
1