PBToolboxAI v1 ← Site

7. FAQ et dépannage #

← Fonctions transverses · Sommaire · Licence →


Installation et démarrage #

Le composant reste gris ou vide #

CauseComment la reconnaîtreSolution
Runtime WebView2 absentL'event ue_runtime_missing est levé, of_is_created() renvoie falseInstaller le runtime — voir Installation
DLL introuvableErreur PowerBuilder d'external function dès le premier appelpbtoolboxai.dll (exemplaire x86 ou x64) à côté de l'exécutable — et à côté de pbXXX.exe pour l'exécution depuis l'IDE
Mauvaise architectureIdem, seulement en 32 ou seulement en 64 bitsLa DLL doit correspondre au bitness de PowerBuilder
Thread UI bloquéLe composant se peint dès que votre traitement se termineVoir ci-dessous

« Thread UI bloqué » : le piège le plus courant #

L'initialisation du webview est asynchrone : elle a besoin que la boucle de messages Windows tourne. Une longue boucle PowerScript exécutée dans l'open de la fenêtre, avant de rendre la main, empêche le composant de terminer son chargement.

// A EVITER : le composant reste gris pendant tout le traitement
uo_grid.of_add_column("nom", "Nom", 200)
of_charger_50000_lignes()      // 8 secondes sans rendre la main

// PREFERER : laisser la fenetre s'afficher, PUIS charger
this.PostEvent("ue_charger")

Le composant se dé-thème / redevient clair après un moment #

Vous avez probablement réutilisé une instance sans la remettre à zéro, ou posé un thème local qui n'a pas été annulé. Appelez of_reset() avant de réafficher un autre contenu, et posez le thème global via PBT_SetDefaultTheme plutôt que composant par composant (Thèmes).


Comportement à l'exécution #

Mes propriétés posées dans le constructor semblent ignorées #

Elles ne le sont pas : les commandes émises avant ue_ready sont mises en file et rejouées dans l'ordre. Si l'affichage ne correspond pas, c'est presque toujours qu'une commande ultérieure écrase la première — ou que le composant n'a jamais été remis à zéro entre deux usages.

Un « reste » de l'affichage précédent persiste #

Cause n°1 des anomalies visuelles : of_reset() n'a pas été appelé. Réutiliser une instance pour afficher autre chose conserve tout ce qui a été posé (couleurs, mode, hauteur automatique, items). Vérifiez que of_reset() est bien appelé avant de conclure qu'il est défaillant.

Relire une propriété ne reflète pas ce que fait l'utilisateur #

Vérifiez d'abord qu'un event annonce ce changement : quand il en existe un, il rafraîchit la propriété au passage et la relecture donne l'état réel (is_address suit le lien que l'utilisateur clique, is_text suit sa frappe). Sinon, la lecture renvoie la dernière valeur posée depuis PowerBuilder (cache PB) — et c'est alors l'event, avec sa valeur en paramètre, qui reste le seul canal (Socle commun).

Un event ne se déclenche jamais #

Un menu ou une info-bulle reste affiché #

Les menus et info-bulles sont de vraies fenêtres système : ils se ferment au clic ailleurs, sur Échap, sur perte du premier plan, et l'info-bulle s'efface au plus tard au bout de 10 secondes. Un cas résiduel : détruire le composant pendant qu'un de ses menus est ouvert — fermez d'abord.

Aucune info-bulle ne s'affiche #

Volontaire : les info-bulles ne se déclenchent pas si votre application n'a pas le focus. Cliquez d'abord dans la fenêtre.


Images et icônes #

Une image ne s'affiche pas #

Une icône mono: apparaît vide ou déformée #

Une icône mono: est un masque : elle n'a pas de taille naturelle. Si le composant ne la dimensionne pas (cas rare, hors des composants standard), donnez-lui explicitement une taille — par exemple [picture=mono:img\ok.svg,16,16] en texte riche.

J'ai remplacé une image sur disque, l'ancienne s'affiche toujours #

Les images sont mises en cache 5 minutes pour éviter le scintillement au re-rendu. Pour une image modifiée à chaud, ajoutez un suffixe variable au chemin (img\logo.png?v=2).


Performance #

Le premier composant est lent à s'afficher #

C'est le démarrage du processus Edge, payé une seule fois. Appelez PBT_Warmup() au démarrage de l'application : le coût est absorbé pendant le chargement du reste (Installation).

L'affichage scintille pendant que je construis mon contenu #

Encadrez la construction :

uo_grid.of_set_redraw(false)
… ajouts et affectations …
uo_grid.of_set_redraw(true)

Alimenter un composant depuis un DataStore est lent #

Le transfert lui-même est linéaire et rapide. Le coût dominant est en amont : votre Retrieve() ou votre génération de données en PowerScript. Sur de gros volumes générés en code, alimentez le DataStore par blocs — la concaténation d'une chaîne de plusieurs mégaoctets est quadratique en PowerScript.


Cohabitation avec PowerBuilder #

Un contrôle PowerBuilder hébergé passe au-dessus de tout #

C'est le comportement attendu : un contrôle hébergé (page d'onglet, panneau dockable) est une fenêtre native, dessinée au-dessus de la couche web. En contrepartie, vos DataWindows restent nettes et rapides. Aucun effet web ne peut passer par-dessus.

Le composant devient blanc quand je suis à l'arrêt dans le débogueur #

Comportement structurel de WebView2 : le thread UI est gelé par le débogueur, le webview ne peut plus se présenter. L'application compilée n'est pas concernée. Reprenez l'exécution, l'affichage revient.

Y a-t-il des processus msedgewebview2 qui fuient ? #

Non : chaque composant libère son webview à sa destruction, prise en charge par le destructor de l'userobject dans le flux normal de fermeture de fenêtre.

Les accents s'affichent mal #

Passez vos libellés en clair depuis PowerBuilder (chaînes PB standard). Pour les caractères hors clavier, utilisez Char() — par exemple Char(8364) pour le symbole euro — plutôt qu'un octet de page de code.


Divers #

Un export de fichier échoue #

L'event de retour (ue_file_saved, ue_xlsx_saved…) porte ab_ok = false et un message. Causes fréquentes : dossier non inscriptible (Program Files), fichier déjà ouvert dans une autre application. Écrivez dans un dossier utilisateur (%TEMP%, %LOCALAPPDATA%).

Le badge « DEMO » apparaît #

La licence n'est pas active dans ce contexte — voir Licence et mode démo.

Codes de retour des méthodes of_* #

RetourSignification
≥ 0OK (appliqué, ou mis en file)
-2Composant non créé (runtime absent, hôte invalide) — vérifiez of_is_created()
-4Opération échouée (capture, écriture de fichier…)
-5Argument invalide (identifiant vide, valeur hors bornes)

Détail du dernier échec : of_get_last_error().


Demander de l'aide #

Joignez à votre demande :


← Fonctions transverses · Sommaire · Licence →