Bonjour...
mon problème est le suivant :
j'ai une une boucle qui modifie les valeurs d'une treeview... donc le but, c'est que durant cette modification, un message d'attente apparaisse...
problème : j'ai beau mettre tout le code que je veux avant la boucle, celui ci ne veut rien faire... ou plutôt attend la fin de la boucle pour appliquer les modifs(exemple : la fenêtre d'attente ne s'affichera qu'une fois la boucle terminée... super...
) du coup la fenêtre freeze durant la modif de la treeview(boucle fort oblige)
que ce soit un timer ou un thread, c'est du pareil au même.
voici le code de modification:
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 //Modifie les valeurs de la treeview procedure TConfigExportCSVFrm._modifTreeView; var i, j : Integer; usert : TUserRight; changed : boolean; begin Self._beginAttente('Chargement des droits...', -1); pas := 1; lblLibelle.Caption := IntToStr(pas); //monThread := TPersoThread.Create(true, self); //monThread.Resume; for i := 0 to lstUser.Count - 1 do begin if tvUserDroits.Items[i].Count = 0 then begin tvUserDroits.checked[tvUserDroits.Items[i]] := lstUser.Items[i].bVisible; end; end; inWork := False; //monThread.Suspend; //FreeAndNil(monThread); Self._endAttente; end;
le code rendant la fenêtre inaccessible et démarant le timer (pour la fenêtre d'attente :
le code se trouvant dans le timer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //initialise la fenêtre d'attente procedure TConfigExportCSVFrm._beginAttente(attMess : string; attMax : integer); begin self._figerInterface; inWork := true; waitMsg := attMess; max := attMax; tmrWait.Enabled := True; end;
et enfin le code affichant la fenêtre d'attente
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 procedure TConfigExportCSVFrm.tmrWaitTimer(Sender: TObject); var pas : Integer; begin if not inWork then begin self.OnProgess(-1, -1, waitMsg); tmrWait.Enabled := false; end else begin if max > 0 then begin pas := Trunc((100 * iprogress)/max); self.OnProgess(pas, 100, waitMsg); if pas >= 100 then iprogress := 0 else Inc(iprogress); end; if max = -1 then begin self.OnProgess(iprogress, 100, waitMsg); if iprogress >= 100 then iprogress := 0 else Inc(iprogress); end; end; end;
pourriez vous m'aidez s'il vous plait je suis à la limite de me tirer une balle dans la tête
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 //fenetre d'attente procedure TConfigExportCSVFrm.OnProgess(aPos, aMax: Integer; aText: String); begin if (aPos = -1) and ( aMax = -1) then begin FrmWaiting.Close; Exit; end; if not FrmWaiting.Visible then begin FrmWaiting.Maximum := aMax div 100; FrmWaiting.Maximum2 := 100; FrmWaiting.QProgressBar1.Visible := false; FrmWaiting.QProgressBar2.Visible := true; FrmWaiting.Show; Application.ProcessMessages; end; FrmWaiting.QProgressBar1.position := aPos div 100; FrmWaiting.QProgressBar2.position := aPos mod 100; FrmWaiting.Texte := aText; end;![]()
Partager