Scénario: J'ai une application Delphi Intraweb qui a des composants d'édition et des boutons sur un écran. Dans TIWEdit.OnAsyncExit et TIWButton.OnClick, un indicateur est défini et un autre thread de l'application définit les propriétés activées des boutons en fonction des indicateurs et d'autres données d'application. Au moment où les propriétés TIWButton.Enabled sont définies, la requête est déjà terminée et l'interaction suivante est annulée car IW découvre que la représentation interne et la forme HTML ne sont pas synchronisées. Il resynchonise et vous devez cliquer à nouveau. Je voudrais rafraîchir l'écran en quelque sorte sur demande. Un temporisateur qui découvre si les deux sont synchronisés et émet un rafraîchissement a des inconvénients dans le trafic et le calendrier (je peux cliquer sur un bouton avant un minuteur). Les formulaires IntraWeb peuvent-ils être synchronisés à la demande?
Répondre
Je ne suis pas complètement sûr si votre question est la même que la mienne, pourtant je pense qu'il y a beaucoup en commun. Voir le projet de démonstration (v2) que j'ai posté sur le forum Intraweb. Sur la base de certains commentaires de Jackson Gomes, j'active un TIWTimer avant le démarrage d'un thread long et le désactive après la fin du thread. Voir: http://forums3.atozed.com/IntraWeb.aspx (atozedsoftware.intraweb.attachments), thread 'Mise à jour IWLabel via Thread', 15 octobre 2009.
L'événement de temporisateur OnASync est déclenché toutes les 500 ms et utilise une bande passante. Acceptable dans ma situation (intranet de l'entreprise).
Gert
Vous pouvez utiliser le module Web Interop à partir du pack de composants IWElite. Essentiellement, vous écrivez un peu de Javascript en utilisant l'objet XMLHTTPRequest (XHR) pour appeler dans l'action du module Web de votre application IW qui revient lorsque le traitement est terminé. Si vous avez besoin de votre application IW pour continuer à fonctionner normalement pendant que le processus est en cours, votre Javascript pourrait ouvrir une fenêtre de progression et faire l'appel XHR à partir de là.
IW Elite se trouve ici: http://code.google.com/p/iwelite/
demande Un XHR ressemblerait à quelque chose comme ceci:
function NewXHR() {
if (typeof XMLHttpRequest == "undefined") {
try { return new ActiveXObject('Msxml2.XMLHTTP.6.0');} catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP.3.0');} catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP');} catch(e) {}
try { return new ActiveXObject('Microsoft.XMLHTTP');} catch(e) {}
throw new Error('AJAX not supported in this browser.');
} else {
return = new XMLHttpRequest();
}
var xhr = NewXHR();
xhr.open("get", '/mywebaction', false);
xhr.send(null);
window.alert(xhr.responseText);
Le code ci-dessus bloquera et attendre la réponse. Si vous préférez avoir agir de manière asynchrone, vous pourriez plutôt faire ce qui suit:
var xhr = NewXHR();
xhr.open("get", '/mywebaction', true);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if ((xhr.status == 200) || (xhr.status == 304) || (xhr.status === 0)) {
window.alert('Success: '+xhr.responseText);
} else {
window.alert('Error: ('+xhr.status+') '+xhr.statusText;
}
}
};
xhr.send(null);
Désolé, cela ne va pas pour moi que je suis dans la nature avec un trafic important parfois. Mais merci pour la réponse. –