IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Problème de traitement


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 67
    Points : 46
    Points
    46
    Par défaut Problème de traitement
    Bonjour a tous,

    J’ai un problème pour effectuer un traitement, Ce traitement ce fait lorsque je coche un bouton check box.
    Voici le traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
    a:integer;
    begin
      if ALTACheckBox1.Checked = false then
      begin
        ALTAGrid1.InsertRow(0);
        for a:= 0 to colonne   do
        begin
          ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
          ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
        end;
      end
      else
      begin
        for a:= 0 to colonne  do
        begin
          ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
        end;
        ALTAGrid1.DeleteRow(0);
      end;
    end;
    Le souci c’est que si je clic rapidement sur le bouton check box mon traitement s’effectue très mal car les deux traitements se mélange.
    Avez-vous une solution pour que les traitements s’effectuent correctement ?

    Merci a Vous !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Désactive le CheckBox pendant le traitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
    a:integer;
    begin
      try
        ALTACheckBox1.Enabled := FALSE;
     
        if ALTACheckBox1.Checked = false then
        begin
          ALTAGrid1.InsertRow(0);
          for a:= 0 to colonne   do
          begin
            ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
            ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
          end;
        end
        else
        begin
          for a:= 0 to colonne  do
          begin
            ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
          end;
          ALTAGrid1.DeleteRow(0);
        end;
      finally
        ALTACheckBox1.Enabled := TRUE;
      end;
    end;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Je vien d'essayé sa ne fonctionne pas

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par trikker Voir le message
    Le souci c’est que si je clic rapidement sur le bouton check box mon traitement s’effectue très mal car les deux traitements se mélange.
    Avec la désactivation du Checkbox comme le propose Andnotor tu ne peux plus avoir 2 appels simultanés du traitement.
    Donc le problème est ailleurs.

    Citation Envoyé par trikker Voir le message
    Je vien d'essayé sa ne fonctionne pas
    Mais encore ?
    un message d'erreur ? Un résultat inattendu ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Après apres avoir déactivé le chacke box essayer Un application.ProcessMessages par sécurité.

    En principe c'est inutile, mais enfin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTACheckBox1.Enabled := FALSE;
    application.ProcesssMessages;

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    as tu pensez a utiliser les messages windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Const
      WM_INSERTROW = WM_USER +1;
      WM_DELETEROW = WM_USER +2;
     
     
    TForm1 = Class(TForm)
    ...
      Protected
        procedure WMINSERTROW (var Message: TMessage); message WM_INSERTROW;
     procedure WMDELETEROW (var Message: TMessage); message WM_DELETEROW;
    ...
    end;
     
    procedure TForm1.WMDELETEROW (var Message: TMessage); 
    var
      a:integer;
    begin
       for a:= 0 to colonne  do
         ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
       ALTAGrid1.DeleteRow(0);
    end;
     
    procedure TForm1.WMINSERTROW (var Message: TMessage);
    var
      a:integer;
    begin
       ALTAGrid1.InsertRow(0);
       for a:= 0 to colonne   do
       begin
          ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
          ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
       end;
    end;
     
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    begin
      try
        ALTACheckBox1.Enabled := FALSE;
        if ALTACheckBox1.Checked = false then
           PostMessage (handle,WM_INSERTROW,0,0)
        else
           PostMessage (handle,WM_DELETEROW,0,0);
      finally
         ALTACheckBox1.Enabled := TRUE;
         application.ProcesssMessages;
      end;
    end;
    @+ Phil

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par trikker Voir le message
    Le souci c’est que si je clic rapidement sur le bouton check box mon traitement s’effectue très mal car les deux traitements se mélange.
    Avez-vous une solution pour que les traitements s’effectuent correctement ?
    Ceci est typique d'un Application.ProcessMessages qui traine ...
    Tardiff Jean-François, dit "En principe c'est inutile, mais enfin", je dirais même "C'est la cause du problème", je m'explique, tu clique une fois, en fait là, tous les clics suivant sont mis en fil d'attente par windows, si tu lance un application.ProcessMessages, eh bien, delphi va trouver un message Click et du coup va lancer de nouveau le gestionnaire, alors que le 1er n'est pas fini (on peut voire cela presque comme une récursivité ...)

    As-tu des Evènement dans la Grid qui appèle application.ProcessMessages

    Pourquoi le Enabled ne fonctionne pas, c'est tout simplement que windows à mis en attente les clic avant même que le Enabled soit mis à False, du coup, il reste tout de même des events qui surgisse après ...

    Solution Alternative

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
      a:integer;
    begin
      ALTACheckBox1.OnClick := nil; 
      try 
        if ALTACheckBox1.Checked = false then
        begin
          ALTAGrid1.InsertRow(0);
          for a:= 0 to colonne   do
          begin
            ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
            ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
          end;
        end
        else
        begin
          for a:= 0 to colonne  do
          begin
            ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
          end;
          ALTAGrid1.DeleteRow(0);
        end;
      finally
        ALTACheckBox1.OnClick := ALTACheckBox1Click;
      end;
    end;
    Il serait bien aussi d'utiliser Sender à la place de ALTACheckBox1 ...

    Ensuite, ALTAGrid1, c'est quoi comme classe ? un mélange de TStringGrid et TValueListEditor ? Sous quelle version de delphi ?

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    Je dis peut être une connerie mais j'ai l'impression que vous vous compliquez la vie pour rien.

    A mon sens il suffirait d'initialiser une variable booléenne globale nommée "Active" par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
    a:integer;
    begin
    if not(Active) then
    begin  
        Active := True;
        if ALTACheckBox1.Checked = false then
        begin
          ALTAGrid1.InsertRow(0);
          for a:= 0 to colonne   do
          begin
            ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
            ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
          end;
        end
        else
        begin
          for a:= 0 to colonne  do
          begin
            ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
          end;
          ALTAGrid1.DeleteRow(0);
        end;
      Active := False;
     end;
    end;
    Comme ça sur le deuxième clic si le traitement n'est pas terminé active est toujours à true et la suite ne se lance pas

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    le problème dans ton code popo, c'est que l'on peut quand meme rentrer dans le onclick donc on vas quand meme checker ou dechecker
    la solution de shelltroll est bien car elle désactive la possibilité du click
    tans que l'opération ne s'est pas terminé

    @+ Phil

  10. #10
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      uLaps:integer=0;
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
      a:integer;
    begin
     if (GetTickCount()-uLaps)< 500 then Exit;
        uLaps := GetTickCount();
    ...

  11. #11
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Bonjour!

    en revenant à la source, je proposerais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TForm1.ALTACheckBox1Click(Sender: TObject);
    var
    a, s:integer;
    begin
      if ALTACheckBox1.Checked then s := 1 else s := 0;
      case s of 
      0 : 
      begin
        ALTAGrid1.InsertRow(0);
        for a:= 0 to colonne   do
        begin
          ALTAGrid1.Cells[a,0] :=  ALTAGrid1.Columns.Items[a].Title ;
          ALTAGrid1.Columns.Items[a].Title := 'Champ ' + inttostr(a+1)  ;
        end;
      end;
      1 : 
      begin
        for a:= 0 to colonne  do
        begin
          ALTAGrid1.Columns.Items[a].Title := ALTAGrid1.Cells[a,0]  ;
        end;
        ALTAGrid1.DeleteRow(0);
      end;
    end;
    end;

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Je ne sais pas si vous avez remarqué que Trikker n'est pas revenu depuis qu'il poste son sujet, ... je suis persuadé que son problème vient de cette ALTAGrid qui ne semble pas être un composant standard qui doit lancer des ProcessMessages à tord et travers ...

Discussions similaires

  1. [MT] Threads : problème tps traitement tache
    Par Javatator dans le forum C++
    Réponses: 3
    Dernier message: 16/07/2007, 20h06
  2. [DOM] Problème de traitement récursif, nombre de noeuds fils
    Par erivoil dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 13/12/2006, 12h39
  3. Problème de traitement d'image tiff
    Par Galkir dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/06/2006, 09h05
  4. Problème de traitement de file
    Par Bouguennec dans le forum Langage
    Réponses: 3
    Dernier message: 09/05/2006, 17h57
  5. Problème avec traitement de chaînes
    Par cortex007 dans le forum Langage
    Réponses: 6
    Dernier message: 25/04/2006, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo