PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Download image et affichage de celle-ci (IOS)
Download image et affichage de celle-ci (IOS)
Débuté par Isabelle Roselmac, 14 jan. 2014 10:33 - 6 réponses
Membre enregistré
28 messages
Posté le 14 janvier 2014 - 10:33
Bonjour à tous,

je désire effectuer la manipulation suivante :

1 - Récuperer une image depuis un sire Internet
2 - La copier en local dans mon appareil IOS
3 - Afficher cette image

Voici comment j'ai procédé :

Depuis une première page dans le code d'initialisation de celle-ci j'ai copié le code ci-dessous :

// Définition des variables
ResAppel est un booléen
IDFichier est un entier

// Ouverture du fichier "C:\MesImages\Images.GIF"
IDFichier = fOuvre("image.png", foCréation)
SI IDFichier <> -1 ALORS
// Récupération de l'image
ResAppel = HTTPRequête("http://www.monsite.fr/img/image.png")
SI ResAppel = Vrai ALORS
// Enregistrement de l'image récupérée dans le fichier
fEcrit(IDFichier, HTTPDonneRésultat(), Taille(HTTPDonneRésultat()))
Info("copie ok")
SINON
Info("erreur")
FIN
// Fermeture du fichier
fFerme(IDFichier)

SINON

Info("Erreur première boucle")
FIN


Cette opération semble fonctionner (...du moins via le simulateur Windev)

Pour tester l'affichage de l'image j'ai créé une seconde page dans laquelle j'ai intégré un objet image qui charge l'image préalablement vers le fichier que j'ai au préalable chargé.

Dans le simulateur Windev ça fonctionne, par contre depuis l'appareil IOS cela ne fonctionne pas, aucun image ne s'affiche.

Comment se passe la gestion des fichiers par rapport au système de "disque et fichiers" dans un appareil IOS ?

Avez vous des informations à me donner pour m'aider à regler ce soucis

par avance merci pour votre retour

Isabelle
Membre enregistré
28 messages
Posté le 14 janvier 2014 - 11:02
Bonjour,

Je me répond à moi même, en fait l'erreur que je faisais était d'afficher l'image en la selectionnant directement depuis la Description du champs image.

J'ai plutôt ajouté au code d'initialisation de l'image le code suivant :

CheminImage est une chaîne
CheminImage = fRepEnCours() + "\monimage.gif"
IMG_image = CheminImage


et ça semble fonctionner.

Si qqu peut me confirmer si ma methode est bonne ou non ou si il y a plus simple et propre je suis preneuse.

Merci

Isabelle
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 29 janvier 2014 - 11:02
Bonjour Isabelle,

Personnellement je passerai par un buffer et j'utiliserai la fonction fSauveBuffer qui permet de s'économiser quelques lignes de code :
SI PAS HTTPRequête("http://www.pcsoft.fr/img/visuels/19/puce-windev-mobile.png") ALORS
Erreur("Erreur survenue "+RC+ErreurInfo(errMessage))
SINON
//Chargement de l'image dans un buffer
bufImage est un Buffer = HTTPDonneRésultat()
//Affectation de l'image (binaire) au champ image de l'IHM
IMG_monimage = bufImage
//Enregistrement de l'image sur le périphérique mobile
fSauveBuffer(ComplèteRep(fRepExe())+"nom_image.png",bufImage)
FIN


Cela permet de ne pas refaire une lecteur de l'image sauvegardée mais il est clair que c'est de la mini-optimisation pas forcément efficace ni vraiment pertinente selon le projet.
Membre enregistré
28 messages
Posté le 29 janvier 2014 - 16:32
Bonjour Jérôme et merci pour ton commentaire,

je vais le tester car même de la mini optimisation est une bonne habitude à prendre.

Petite question... j'ai fait des tests en coupant le wifi pendant la copie d'une image pour simuler une perte de connexion et là ....ça bloque la machine pendant un certains (long) temps, ipad bloqué, appli dans les choux et ça ça va pas être possible pour mes utilisateurs car pas des pros de l'informatique.

Avant la copie j'effectue un test de disponibilité de cnx mais c'est pendant la copie que ça devient délicat

Y a t'il une méthode qui permette que si en cours de copie du fichier si une perte de connexion survienne que ça ne bloque pas la machine et que ça rende la main immédiatement ?

Par avance merci

Isabelle
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 30 janvier 2014 - 11:14
Oui, il faut mettre le traitement de récupération de l'image dans un thread.

Pour cela il faut créer une procédure "normale" avec le code de récupération :
Procedure chargement()
SI PAS HTTPRequête("http://www.pcsoft.fr/img/visuels/19/puce-windev-mobile.png") ALORS
Erreur("Erreur survenue "+RC+ErreurInfo(errMessage))
SINON
//Chargement de l'image dans un buffer
bufImage est un Buffer = HTTPDonneRésultat()
//Affectation de l'image (binaire) au champ image de l'IHM
FEN_test.IMG_monimage = bufImage
//Enregistrement de l'image sur le périphérique mobile
fSauveBuffer(ComplèteRep(fRepExe())+"nom_image.png",bufImage)
FIN


Ensuite dans le code du bouton et/ou du traitement qui déclenche ce téléchargement de l'image il faut lancer un thread comme ceci :

ThreadExecute("thread_chargement",threadContexteGlobal,chargement)


J'ai testé en ça fonctionne bien en iOS.

Par contre si on exécute à nouveau ce traitement avant que l'image ne soit chargée cela peut provoquer une erreur car on reéxécute un thread qui est toujours en cours.

2 solutions :
- Ne pas autoriser de recharger une image tant que le thread n'a pas terminé son traitement
- Donner un nom unique au thread à chaque appel
Posté le 30 janvier 2014 - 15:07
"Jérôme Calame-Rosset" a présenté l'énoncé suivant :
Oui, il faut mettre le traitement de récupération de l'image dans un thread.

Pour cela il faut créer une procédure "normale" avec le code de récupération
:
Procedure chargement()
SI PAS
HTTPRequête("http://www.pcsoft.fr/img/visuels/19/puce-windev-mobile.png")
ALORS
Erreur("Erreur survenue "+RC+ErreurInfo(errMessage))
SINON
//Chargement de l'image dans un buffer
bufImage est un Buffer = HTTPDonneRésultat()
//Affectation de l'image (binaire) au champ image de l'IHM
FEN_test.IMG_monimage = bufImage
//Enregistrement de l'image sur le périphérique mobile
fSauveBuffer(ComplèteRep(fRepExe())+"nom_image.png",bufImage)
FIN


Ensuite dans le code du bouton et/ou du traitement qui déclenche ce
téléchargement de l'image il faut lancer un thread comme ceci :

ThreadExecute("thread_chargement",threadContexteGlobal,chargement)


J'ai testé en ça fonctionne bien en iOS.

Par contre si on exécute à nouveau ce traitement avant que l'image ne soit
chargée cela peut provoquer une erreur car on reéxécute un thread qui est
toujours en cours.

2 solutions : - Ne pas autoriser de recharger une image tant que le thread
n'a pas terminé son traitement
- Donner un nom unique au thread à chaque appel


ou tester l'état du thread avant son exécution

--
Cordialement JeAn-PhI
Membre enregistré
42 messages
Posté le 05 mai 2014 - 06:28
Bonjour,

j'ai été confronter a un problème similaire et j'ai eu des soucis de lenteur pour charger les photos.
je suis passé par la solution du memo qui me permet de stocker directement la photo dans ma base HF et de la charger directement sans l'enregistrer dans l'appareil et je trouve que le gain de vitesse et quand meme important.

pourriez-vous me dire qu'elle solution est la meilleur.

Merci d'avance