Les Threads

RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008 - 21 août 2008 à 15:03
RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008 - 31 août 2008 à 11:02
Bon je comprends rien aux threads apparament,

Voilà mon code que j'utilise aujourd'hui qui me pause problème
La gauge se mets bien à jour mais pas mon caption qui tout le temps à 0.
Pour le moment je fais cela dans OnTimer, j'ai essayer de voir comment faire avec un Thread, mais je ne c'est pas quoi mettre dans execute, quoi synchronizé etc..
De plus je crois qu'il ne faus pas utilisé de timer dans ce cas, alors où je mets l'exection de ma procedure.

Mon code dans un Form

procedure TFormProgressBar3.FormActivate(Sender: TObject);
begin
  Timer1.Enabled := True;
end;


procedure TFormProgressBar3.FormCreate(Sender: TObject);
begin
  NbRecord:= ModuleDeDonnee.ADOCalendrier.Recordset.RecordCount;
  Timer1.Enabled := False;
end;


procedure TFormProgressBar3.Timer1Timer(Sender: TObject);
Var
  i: Integer;
  Panel: TPanel;
begin
  with Gauge1 do Begin
    MinValue:= 0;
    MaxValue:= NbRecord;
    Progress :=0;
  end;


  for i:= 0 to (NbRecord -1) do
  Begin
    Panel := TPanel.Create(FormPrincipal);
    Panel.Font.Size := 6;
    Panel.Font.Name := 'Arial';
    Panel.Ctl3D := true;
    Panel.Name := 'PANEL' + ModuleDeDonnee.ADOCalendrier.Fields.Fields[31].AsString;
    Panel.Caption := '';
    Panel.Top := StrToInt(ModuleDeDonnee.ADOCalendrier.Fields.Fields[28].AsString);
    Panel.left := StrToInt(ModuleDeDonnee.ADOCalendrier.Fields.Fields[25].AsString);
    Panel.Height := StrToInt(ModuleDeDonnee.ADOCalendrier.Fields.Fields[22].AsString);
    Panel.Color := StringToColor(ModuleDeDonnee.ADOCalendrier.Fields.Fields[20].AsString);
    Panel.Width := StrToInt(ModuleDeDonnee.ADOCalendrier.Fields.Fields[30].AsString);
    Panel.Parent := FormPrincipal.StringGridSemaine;
    Panel.PopupMenu := FormPrincipal.PopupMenu1;
    Panel.OnDblClick := FormPrincipal.PanelDblClick;
    Panel.ParentBackground := False;
    Panel.Hint := ModuleDeDonnee.ADOCalendrier.Fields.Fields[23].AsString;
    Panel.ShowHint := True;
    ModuleDeDonnee.ADOCalendrier.Next;
    Gauge1.Progress := Gauge1.Progress + 1;   <- ca se mets a jour
    StatusBar1.Panels[1].Text := IntToStr(i);     <- CA RESTE à 0
  end;
  ModuleDeDonnee.ADOCalendrier.Filtered := false;
  ModuleDeDonnee.ADOCalendrier.close;
  Self.Close;
end;

Est-ce que quelqu'un peux m'aider ?

10 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 août 2008 à 16:22
je vais pas corriger ton bug, mais je vais juste te dire que tu utilise la mauvaise methode pour faire ce que tu cherche a faire.

utilisation de panel, dans un stringgrid ... pour faire une sorte de calendrier ou d'agenda ?!
y'a plus leger comme methode.

je te laisse chercher.

<hr size="2" width="100%" />
0
RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008
21 août 2008 à 16:46
Bug ??
je mauvais choix de composant pour toi ? non !!! lol

Tu veux parler de Tlabel ou Tedit ??? 

Sinon pour l'utilisation d'un Thread ? comment je peux faire dans mon cas ?
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
23 août 2008 à 18:27
Panel := TPanel.Create(FormPrincipal);
Panel.parent:=FormPrincipal;

StatusBar1.Panels[1].Text := IntToStr(i);     <- CA RESTE à 0

il y a un array de panels[ ...] dans le statusBar1
 Qu'importe le record on met a jour toujour le panels 1 c'est bien ça ?

yve
0
RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008
25 août 2008 à 09:01
Bonjour Yves,

le Create Panel me permet de mettre en place un certain nombre de panel sur ma form.
La statusBar compontre 4 item, mon souhait c'est que le 1 donc, affiche au fur et a mesure le nombre de panel.
exemple j'ai 300 panel à pauser, dans la Statusbar on affiche de 0 à 300.

Voilà.
0

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

Posez votre question
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
25 août 2008 à 22:43
ok

for i:= 0 to (NbRecord -1) do
  Begin
   
   Panel := TPanel.Create(FormPrincipal);
   Panel.parent:=FormPrincipal;
      Panel.tag:= i;
 ...
StatusBar1.Panels[ Panel.tag].Text : = IntToStr(i);     <- CA RESTE à 0

ouais c'est louche !!!

for i:= 0 to (NbRecord -1) do
  Begin
       //si le composant existe déjà ?
       if not(Assigned('PANEL' + ModuleDeDonnee.ADOCalendrier.Fields.Fields[31].AsString)then
       begin
            Panel := TPanel.Create(FormPrincipal);
            Panel.parent:=FormPrincipal;
            Panel.tag:= i;
         end;
 ...
StatusBar1.Panels[ Panel.tag].Text : = IntToStr(i);     <- CA RESTE à 0

bref j'suis pas sure mais bon surtout pas oublier
FormOnclose....
for i:= 0 to (NbRecord -1) do
  Begin
       FreeAndNil('PANEL' + ModuleDeDonnee.ADOCalendrier.Fields.Fields[31].AsString);
   end;

yve
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 août 2008 à 23:30
Bonjour Yve,

Pour info : inutile de libérer de manière explicite les composants Panelxxx puisque la fiche principale en est le propriétaire (Panel := TPanel.Create(FormPrincipal);) sauf si tu souhaites les détruire sans passer par la fermeture de la fiche. CQFD

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
29 août 2008 à 02:28
Bonjour Delphiprog,

C'est certain !!! L'idée de départ dans un OnTimerEvent , bref le nombre de composants créé en runtime , ouf !

With me too ..

yve
0
RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008
29 août 2008 à 09:14
Bonjour tout le monde,
Je comprends pas bien ce que tu dis Delphiprog ?

Si mes panels n'existe pas je dois bien utilisé
Panel := TPanel.Create(FormPrincipal)
non ?

Tu peux m'expliquer ta pensée ?
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 août 2008 à 15:54
@RURUInc : je ne parle pas de la création des composants mais de leur destruction qui sera réalisée naturellement par le composant passé en argument au constructeur de l'instance de TPanel. Or, le propriétaire est toujours responsable de la destruction de ce qu'il possède avant d'être détruit à son tour (par l'objet Application, par exemple, quand il s'agit d'un fiche). Si tu dois concevoir des composants, n'oublie jamais cela.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
RURUInc Messages postés 42 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 21 octobre 2008
31 août 2008 à 11:02
Je comprends ce que tu veux dire.
Je détruit mes composants dans certaine condition (changement de semaine, suppression salarié)
Mes panels ce créer dans un STringGrid (par dessus) dans la formprincipal.
Mon StringGrid est dans un TabSheet également (ce qui me permet de le rendre invisble si je clique dans le menu a prorpié.

quand je ferm ma form principal je fais cela :
procedure TFormPrincipal.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  application.Terminate;
end;

Quand je change de semaine ou suppression salarié (si le tabsheet est visible) je vais cela :
procedure TFormPrincipal.VidageDuStringGrid;
Var
  n: Integer;
Begin
  if LesPanels then
  begin
    if NbRecord > 0 then
    Begin
      StatusBar1.Panels[3].Text := 'Vidage des Tâches';
      Application.ProcessMessages;
      with ProgressBarPrincipal do
      Begin
        Visible := True;
        Min:= 0;
        Max:= FormPrincipal.ComponentCount;
        Position :=0;
        Parent := StatusBar1;
        SetBounds((StatusBar1.Panels[0].Width+StatusBar1.Panels[1].Width)
        ,4,StatusBar1.Panels[2].Width-2,StatusBar1.Height-10);
      end;
      With FormPrincipal do
      Begin
        For n := ComponentCount-1 downto 0 do // Le faire Absolument à l'envers
        Begin
          if (components[n] is TPanel)
            And (Components[n].Name <> 'PanelPlanning')
              And (Components[n].Name <> 'PanelCalendrier')
                And (Components[n].Name <> 'PanelBasCalendrier') Then
          Begin
            (Components[n] As TPanel).free;
          end;
        ProgressBarPrincipal.Position := ProgressBarPrincipal.Position + 1;
        end;
      end;
    end;
    StatusBar1.Panels[3].Text := '';
    ProgressBarPrincipal.Visible:= False;
  end;
end;

Ensuite je le créer par raport à ce que j'ai mis au dessus.

Est-ce que je fais cela bien ou pas à ton avis .?
0
Rejoignez-nous