Bonjour
Je viens faire avec un essai tout en essayant d'appeler le ShowModal de ma fiche.
Voici le Code du main :
Dans le FormActivate de ma jauge de progression, je fais Appel à la création de mon Thread , je crée mon gestionnaire de message pour intercepter le message WM_USER+1 (ModalResult := mrOk)
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 unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uProgressForm, uThreadProgress; type TMainForm = class(TForm) btnCallThreadProgress: TButton; procedure btnCallThreadProgressClick(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.btnCallThreadProgressClick(Sender: TObject); Var ProgressForm: TProgressForm; begin TThread.NameThreadForDebugging('Principal'); ProgressForm := TProgressForm.Create(Self); Try ProgressForm.ProgressBar.Properties.Min := 0; ProgressForm.ProgressBar.Properties.Max := 1000; ProgressForm.ProgressBar.Update; ProgressForm.ShowModal; Finally // End; end; end.
Et dans le TThread le code n'a rien de spécial : juste une boucle qui simule un 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 unit uProgressForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxContainer, cxEdit, dxSkinsCore, dxSkinBlack, dxSkinBlue, dxSkinBlueprint, dxSkinCaramel, dxSkinCoffee, dxSkinDarkRoom, dxSkinDarkSide, dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinFoggy, dxSkinGlassOceans, dxSkinHighContrast, dxSkiniMaginary, dxSkinLilian, dxSkinLiquidSky, dxSkinLondonLiquidSky, dxSkinMcSkin, dxSkinMetropolis, dxSkinMetropolisDark, dxSkinMoneyTwins, dxSkinOffice2007Black, dxSkinOffice2007Blue, dxSkinOffice2007Green, dxSkinOffice2007Pink, dxSkinOffice2007Silver, dxSkinOffice2010Black, dxSkinOffice2010Blue, dxSkinOffice2010Silver, dxSkinOffice2013DarkGray, dxSkinOffice2013LightGray, dxSkinOffice2013White, dxSkinPumpkin, dxSkinSeven, dxSkinSevenClassic, dxSkinSharp, dxSkinSharpPlus, dxSkinSilver, dxSkinSpringTime, dxSkinStardust, dxSkinSummer2008, dxSkinTheAsphaltWorld, dxSkinsDefaultPainters, dxSkinValentine, dxSkinVS2010, dxSkinWhiteprint, dxSkinXmas2008Blue, cxProgressBar; type TProgressForm = class(TForm) ProgressBar: TcxProgressBar; procedure FormActivate(Sender: TObject); private { Déclarations privées } public procedure HandleModalResult(var Msg : TMessage); message WM_USER + 1; end; var ProgressForm: TProgressForm; implementation {$R *.dfm} { TProgressForm } Uses uThreadProgress; procedure TProgressForm.FormActivate(Sender: TObject); Var ThreadProgress: TThreadProgress; begin ThreadProgress := TThreadProgress.Create(Self); end; procedure TProgressForm.HandleModalResult(var Msg: TMessage); begin ModalResult := mrOk; end; end.
Cet exemple fonctionne très bien : la fiche de la jauge est créée dans le thread princiapl, elle est passée dans le Thread secondaire dans son Execute. A la fin du traitement, je fais le post du message WM_USER+1, la fiche de progression se ferme ainsi. Un terminate et mon Thread est libéré et je reviens à mon Thread principal de VCL.
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
49
50
51
52
53
54
55
56 unit uThreadProgress; interface uses Classes, cxProgressBar, Windows, Messages, uProgressForm; type TThreadProgress = class(TThread) private FGaugeProgress: TProgressForm; procedure UpdateGaugeProgress(); protected procedure Execute; override; public constructor Create(AGaugeProgress: TProgressForm); end; implementation { TThreadProgress } constructor TThreadProgress.Create(AGaugeProgress: TProgressForm); begin Inherited Create(False); FGaugeProgress := AGaugeProgress; FreeOnTerminate := True; end; procedure TThreadProgress.Execute; begin while not Terminated do UpdateGaugeProgress(); PostMessage(FGaugeProgress.Handle, WM_USER+1, 0, 0); end; procedure TThreadProgress.UpdateGaugeProgress; Var i: Integer; begin TThread.NameThreadForDebugging('Secondaire'); For i:=0 to 100000 do Begin Synchronize(procedure Begin FGaugeProgress.ProgressBar.Position := FGaugeProgress.ProgressBar.Position + 1; FGaugeProgress.ProgressBar.Update; end ); //Sleep(500); End; Terminate; end; end.
Objectif atteint
Merci tout le monde pour vote aide
Partager