Problèmes avec ShowForm

Discussion de programmation pour éviter d'empiéter dans les autres forums

Modérateurs : Modérateurs, Développeurs

Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Problèmes avec ShowForm

Message par Benjamin »

Bonjour,

Je viens de me rendre compte d'un petit problème avec la fonction ShowForm de l'API...

Avec Arithmetique si l'on utilise la touche Tab dans la zone d'édition de l'expression, la touche Tabulation n'a aucun effet mais le plus grave c'est que l'utilisation de cette touche bloque également par la suite les touches directionnelles du curseur!

Je pensais que cela venait de mon controle mais cela provoque le même problème avec un TMemo standard!

Le problème n'a pas lieu si l'on utilise l'instruction ShowModal normale mais qui ne permet pas du coup d'utiliser la pipette... :cry:

Je me demande si les problème que rencontre pf ne sont pas également du à cela (les problème de controles désactivés qui recoivent les messages)

Je poste ici car j'ai l'impression que ca va pas être simple à résoudre...
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

J'avais déjà remarqué le pb avec la touche Tab mais j'ai laissé tomber car je ne voyais pas d'ou ça venait. Je vais regarder ça de plus près car ça peut être bloquant.

Je ne gère pas les événements clavier à ce niveau, donc je pense que ça vient de Delphi par contre je pense pas que les pb de PF soient identiques. En général, pour désactiver un controle, j'utilise l'API EnableWindow quand la propriété Delphi ne fonctionne pas
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Apparement c'est un message qui n'est pas appelé quand j'utilise ShowForm :

WM_GETDLGCODE

Ceci explique que les touches de directions ne fonctionnent plus dans mon contrôle... Apparement le message est traité par quelqu'un d'autre... PhotoFiltre??? et du coup le résultat du message fait que Windows considére par la suite que mon contrôle ne souhaite pas gérer ni les tabulation ni les touches directionnelles...
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

Le code est super simple :

Code : Tout sélectionner

DlgForm.Show;    
while DlgForm.Visible do Application.ProcessMessages;
Je pense que le pb est au niveau de ProcessMessages ?

Tu peux essayer de gérer ta propre boucle d'attente au niveau de la fonction Execute :

DlgForm.Show
PrepareDialog(DlgForm.Handle, dmColorPicker, True, False);
...
boucle d'attente tant que le form est visible
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Je vais essayer ca! Par contre j'ai regarder le code de la fonction ShowModal... Je pense que tu devrais t'en inspirer :D

A première vue ils utilisent Application.HandleMessage au lieu de Application.ProcessMessage
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

J'y arrive pas quand j'appelle PrepareDialog(DlgForm.Handle, dmColorPicker, True, False);

Ma boucle d'attente ne fonctionne pas...

Apparament ce n'est pas HandleMessage la solution en tout cas car quand je fais Show suivi d'une boucle d'attente cela marche...

Par contre une question.... Est-ce que tu fais le ProcessMessage sur l'Application de la dll?
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

non, c'est sur Application principale (PhotoFiltre) mais je sais pas comment Delphi gère ça, j'ai pas regardé en détails
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

A mon avis il faudrait essayer de le faire également sur celui de la dll (dans le cas ou l'on a défini RegisterApplication)
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

mais c'est pas compatible avec les plugins C et ASM donc faut une solution globale
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

ben faudrait déjà voir si le symptome à lieu pour les plugins en C ou ASM!

De toute façon la fonction ShowForm n'est utilisable que pour les plugins en Delphi...

Bon le symptome est le même avec le plugins que j'ai fait en C++Builder mais bon ca utilise aussi la VCL faudrait tester avec un plugin fait sans VCL
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

Je pense avoir corrigé le bug, dans Application.OnShortCut je rajoute le code suivant (tous les événements clavier passent d'abord par là) :

Code : Tout sélectionner

if PluginLoaded and (Msg.CharCode = VK_TAB) then
begin
  SendMessage(CurrentPluginHandle, CM_DIALOGKEY, VK_TAB, 0);
  Handled := True;
end
Mais ça sera seulement dans la prochaine mise à jour...
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

C'est cool :D
pf
Développeur(se)|Développeur|Développeuse
Développeur(se)|Développeur|Développeuse
Messages : 974
Inscription : 28 avr. 2004 8:45
Version de PhotoFiltre : 6
Système d'exploitation : xp seven
Localisation : 78

Message par pf »

SAlut,
Dsl, j'étais pas la..... et j'ai loupé quelque chose d'interressant.. :wink:
Ce probleme de touche "tab" et des 4 fleches .....
Tab est visiblement traité a un niveau prioritaire par le noyaux. Il donne le focus d'entrée clavier à un ctrl ou un groupe de ctrl (meme caché).

Je n'ai pas bien pigé la fin :oops: mais je pense que le pb viens de la boucle d'attente PF, le plugin repasse la main et le focus d'entrée peut changer.
En assembleur et en C, le plugin ne rend la main à PF qu'à la fin, donc le focus d'entrée reste dans le plugin.
.....Sauf en fonction pipette ou zoom, (focus a PF), mais pour reprendre le plugin, on est obligé de cliquer dessus... donc reprise du focus :roll:

=> Comme benjamin l'a dit, ShowForm n'est pas utilisée en C et Asm donc pas de probleme pour de futures modifs (normalement lol).
Je pense que tu parlais de Lentille ( :( j'ai toujours pas de soluce)... et un "truc" du genre n'est pas impossible (merci du tuyau :wink: )

dsl de ne pas pouvoir aider plus mais j'ai du mal avec votre "charabia" Delphi :lol: :oops:
Bonne soirée A+
A+
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

Voici la fonction que j'utilise pour désactiver/activer un GroupBox par exemple :

Code : Tout sélectionner

procedure EnableWinControl(WC: TWinControl; Value: Boolean);
var
  I: Integer;
begin
  for I := WC.ControlCount - 1 downto 0 do
    WC.Controls[I].Enabled := Value;
  WC.Enabled := Value;
end;
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Apparement la boucle :

Code : Tout sélectionner

while DlgForm.Visible do Application.ProcessMessages;
Fait chauffer énormément le CPU!!! (Je passe de 40° à 50°)

Il serait souhaitable je pense d'ajouter une instruction Sleep pour soulager un peu le processeur :D ou plutôt de remplacer ProcessMessages par HandleMessage ce qui donne d'excellent résultat!

C'est ce qu'il y a dans ShowModal...