Le Thread dans un Form

notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - 13 août 2009 à 14:29
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - 23 août 2009 à 22:18
Salut
j'ai utiliser le thread dans le form. au lancement lorsque il exécuter "FormActivate(Sender: TObject)", il termine et affiche un message d'interruption . Aidez*mois svp. Voici la source

unit w_JrnalEntrer;
TBoucle=Class(TThread)
private
procedure Affiche();
procedure RazGrid;
procedure FiltreCpte;
procedure Visualcpte;
procedure SaveMvts;

protected
procedure Execute();override;
public
AigStart : Integer;
xCleCpte, xxLibCpte, xTypeMvt: String;

constructor Create(CreateSuspended: Boolean);
procedure EdtExit(Sender: TObject);
procedure RzDateClick(Sender: TObject);
procedure NumEdtExit(Sender: TObject);
procedure CmBxClick(Sender: TObject);

end;

var
wJrnalEntrer: TwJrnalEntrer;
Boucle:TBoucle;
implementation

uses DM_Planet1, W_DMUser, PlanetMenu;

{$R *.dfm}

procedure TwJrnalEntrer.FormActivate(Sender: TObject);
begin
Boucle := TBoucle.Create(True);
Boucle.Affiche();

if not Boucle.Terminated then
Boucle.Terminate;
end;

constructor TBoucle.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
Priority := tpNormal;
if CreateSuspended then
Resume;
end;

procedure TBoucle.Execute;
begin
// Boucler tant que l'utilmisateur n'a pas demander de stopper
while not Terminated do
Synchronize(Affiche);
end;

procedure TBoucle.Affiche();
begin
mtTotD :=0;
mtTotC :=0;
mtTotDver :=0;
mtTotCver :=0;
RazGrid;
RzLabel1.Caption := '';
RzLabel4.Caption := '';
RxLabel4.Caption := FormatDateTime('dd mmm yyyy', now);
RxLabel72.Caption := FrmMain.wwwNomUtil;
with DMUser.QSetUp do begin
active := true;
first;
cpteclient :=FieldByName('Cpte_ppl_client').AsString;
cptefsseur :=FieldByName('Cpte_ppl_fsseur').AsString;
cptecapital := FieldByName('Cpte_capital').AsString;
active := false;
end;

if AigStart = 0 then begin
RxLabel1.Caption := 'Journal Entrer (Nouveau)';
//*** RzEdit2.Clear;
RzEdit1.ReadOnly := false;
BtnSave.Enabled:= true;
BtnSaveAll.Enabled:= true;
RzDBComboBox1.ReadOnly := false;
RzDBComboBox2.ReadOnly := false;
RzDBEdit2.ReadOnly := false;
RzDBNumericEdit1.ReadOnly := false;
RzDBNumericEdit2.ReadOnly := false;
// RzDBDateTimeEdit1.Date := now;

RzEdit1.Text :=oStr(DMplanet1.qCompteurJournal.Value+1);
//** RzEdit1.Text :=IntToStr(NouvNum);
//** Libere := False;
i:=0;
i:=i+1;
DMplanet1.QAffBk2.Edit;
RzDBEdit1.Text := IntToStr(i);
DMPlanet1.QAffBk2NoOrdre.AsInteger := i;
DMPlanet1.QAffBk2DateMvt.AsDateTime := Date;
DMplanet1.QAffBk2.Post;
// RzDBLabel1.Caption := IntToStr(i);
RzStrg1.Cells[0,0] := 'Batch No';
RzStrg1.Cells[1,0] := 'Date';
RzStrg1.Cells[2,0] := 'Type';
RzStrg1.Cells[3,0] := 'Compte';
RzStrg1.Cells[4,0] := 'Mémo';
RzStrg1.Cells[5,0] := 'Débit';
RzStrg1.Cells[6,0] := 'Crédit';
// for i :=1 to 11 do RzStrg1.Cells[0,i] := IntToStr(i); //Remplir la première colonne
RzStrg1.Cells[0,1] := IntToStr(NouvNum); //Remplir la première colonne
mtTotd := 0;
mtTotC := 0;
mtSolde:=0;
end
else begin
RzEdit1.ReadOnly := true;
BtnSave.Enabled:= false;
BtnSaveAll.Enabled:= false;
RzDBDateTimeEdit1.ReadOnly := true;
RzDBComboBox1.ReadOnly := true;
RzDBComboBox2.ReadOnly := true;
RzDBEdit2.ReadOnly := true;
RzDBNumericEdit1.ReadOnly := true;
RzDBNumericEdit2.ReadOnly := true;

// RzBitBtn3.Enabled := false;
RzEdit1.Text := xCleCpte;
RzEdit2.Text := xTypeMvt;
RxLabel1.Caption := xTypeMvt+' '+'(Posté)';
visualcpte;
end;
end;

procedure TBoucle.visualcpte;
//**procedure TwJrnalEntrer.visualcpte;
begin
RazGrid;
FiltreCpte;
/// if DMPlanet1.QAffBk2.RecordCount<>0 then
/// DMPlanet1.QAffBk2.Delete;
// KStringGrid1.RowCount :=0;
mtTotD := 0;
mtTotC := 0;
with DMPlanet1 do begin
GdLivre.First;
while not GdLivre.eof do begin
DMPlanet1.QAffBk2.Insert;
DMPlanet1.QAffBk2DateMvt.AsDateTime := GdLivreDateMvt.AsDateTime;
DMPlanet1.QAffBk2NoOrdre.AsInteger := GdLivreNoSeq.AsInteger;
DMPlanet1.QAffBk2TypeMvt.AsString := GdLivreType_Mvt.AsString;
DMPlanet1.QAffBk2Checkno.AsString := GdLivreCode_Mvt.AsString;
//**- DMPlanet1.QAffBk2.FieldByName('CompteGL').AsString := FieldByName('GLCpteID').AsString;
DMPlanet1.QAffBk2CompteGL.AsString := GdLivreLibCompte.AsString;
DMPlanet1.QAffBk2LibCompte.AsString := GdLivreLibCompte.AsString;
DMPlanet1.QAffBk2Memo.AsString := GdLivreLibelle.AsString;
DMPlanet1.QAffBk2Memo1.AsString := GdLivreLibelle.AsString;

if GdLivresignMvt.AsString = 'DR' then begin
DMPlanet1.QAffBk2Debit.AsInteger := GdLivreMntant.AsInteger;
mtTotD := mtTotD+GdLivreMntant.AsInteger;
end
else begin
DMPlanet1.QAffBk2Credit.AsInteger := GdLivreMntant.AsInteger;
mtTotC := mtTotC+GdLivreMntant.AsInteger;
end;
DMPlanet1.QAffBk2.Post;
GdLivre.Next;
end;
end;
// except
// on E: EMyDataError do
// ShowMessage(E.Message);
//* RzLabel1.Caption := FormatFloat('#,##0.00',CumVal);
RzLabel1.Caption := FormatFloat('Fc ###,###,##0.00',mtTotD);
RzLabel4.Caption := FormatFloat('Fc ###,###,##0.00',mtTotC);
end;

7 réponses

notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
14 août 2009 à 15:56
Salut
aucun spécialiste dans le thread pour me venir à l'aide ? Comme vous le remarquer je suis débutant c'est la 1ere fois que je saie d'utiliser le thread dans mon programme, je suis coincé à l'aide svp
Voici le message : "Access violation at adressess 0046CCDE in module ....."
d'avance merci
a+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
20 août 2009 à 16:36
bonjour,

ne pas oublier d'utiliser
la balise code "delphi"


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
21 août 2009 à 23:33
Salut
Merci Bacterius pour le tuto. je veux lire et essayer si je peux y arriver.

Mais une question à Cantador, comment faire la balise code 'delphi'. Puis-je vous demander un peut d'éclaircissement sur la façon d'utiliser la balise SVP. L'objectif poursuivi est de permettre à deux utilisateurs d'utiliser ou exécuter un même programme simultanément. S'il y a encore une autre méthode pour le faire, me fera vraiment plaisir.Je voudrai surmonter cet obstacle pour continuer.
Bonne fin de journée
Notrica
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
22 août 2009 à 09:03
La balise code dont parle cantador est une balise que tu peux utiliser lorsque tu postes un message sur le forum, afin de faciliter la lecture du code que tu envoies. Elle est présente dans la barre d'outils de formatage "code/delphi". Cela n'a rien à voir avec le code en lui-même !

Comme Bacterius, je te redirige vers le tuto sur les threads.

@+
Nico { www.ni69.info }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 août 2009 à 11:35
juste une petite remarque sur le code..
je n'utiliserai OnActivate avec les threads car
cet évènement a la particularité de se déclencher
intempestivement avec tout un ensemble d'actions.

ce qui pourrait nuire au fonctionnement de ces derniers.

il suffit de mettre un point d'arrêt pour s'en convaincre..

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 août 2009 à 11:36
je n'utiliserai pas

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
23 août 2009 à 22:18
Salut
Merci bcp, vos suggestions sons les bienvenues, je veux essayer de suivres vos conseils pr modifier le tire.
a+
Notrica
0
Rejoignez-nous