2009-10-23 6 views
1

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?

  • Une méthode qui pourrait pousser les données serait grande.
  • Peut-être que IW a la possibilité de faire une synchronisation non-sauvegarde sans annuler l'action que je viens de commettre. Comme mes écrans sont construits avec un modèle (je ne peux pas prédire quels composants seront à l'écran et quelles sont les interdépendances entre les composants, c'est dans la logique métier), je ne peux pas ajouter de JavaScript pour activer ou désactiver un bouton en fonction des actions de l'utilisateur.

  • Répondre

    0

    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

    +0

    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. –

    0

    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); 
    
    Questions connexes