Boucle sur des compostants delphi [Résolu]

Signaler
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012
-
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012
-
Bonjour,

Je voudrai faire une boucle qui active tous les adoquery de mon application, j'ai essayé quelque chose qui bien évidemment ne marche pas (pour une seule form)

var i: integer;

for i:=1 to 3 do
adoqueryi.open;

Bien sure adoquery n'est pas reconnu, pouriez vous m'orienter svp.

Le question peut s'étendre sur plein de composants.

Merci.

13 réponses

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
re,

essayes comme ceci:
  {pour chaque composant contenu dans TApplication}
  for I :=  0  to  Pred(Application.ComponentCount) [b]do
    /b[i]{si c'est un TForm}
    /iif (Application.Components[ I] is TForm) [b]then
      with /b(Application.Components[ I] as TForm) [b]do
        /b {pour chaque composant contenu dans la Form}
        for J : = 0 to Pred(ComponentCount) [b]do
          /b[i]{si c'est un TADOQuery}
          /iif (Components[J] is TADOQuery) [b]then
            /b(Components[J] as TADOQuery).open;








[hr]@+Cirec
[hr]
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,

Regarde du côté de ComponentCount, Components[], is et as.


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

Cool, merci ça marche très bien. ça marche par contre pour une forme seulement. Genre maintenant je dois inclure:
for i := 0 to ComponentCount - 1 do (* <<-- passe sans problème *)
if Components[i] is TADOQuery then
TADOQuery(Components[i]).open;

dans chaque form a part.

Mais bon, c'est pas un problème, si y a pas une instruction pour toute l'application j'applerai la procedure de chaque form.

Merciiiiiiiiiii.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Non testé :

for i := 0 to Application.ComponentCount-1 do
  if Application.Components[i] is TADOQuery
    then (Application.Components[i] as TADOQuery).Open;



_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

Oui, marche po :-(.

ça ne m'affiche aucune erreur mais ça ne marche pas :-(.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
ça marche pô parce que je suis une buse en BDD et que je ne connais pas TADOQuery.

Il faut peut-être écrire :

... then (Application.Components[i] as TADOQuery).Open := true;



_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

Bizarre, tout semble logique, au lieu de form1.components[i] (qui marche très bien) on met Application.Components[i] et donc les compostants de toute l'application (qui ne marche toujours pas) justement c'est Application qui pose probleme.

Je l'ai utilisé (Application) avec TEdit et ça ne marche pas (et donc ce n'est pas parce que tu es buse en BDD ).
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
« et donc ce n'est pas parce que tu es buse en BDD »
Bein si. Et il n'y a pas qu'en BDD... Je n'y arrive pas non plus avec Application.



Une autre idée(non testée) si ton application est une application MDI :

Tu peux retrouver la fiche principale avec Application.MainForm.
Ensuite, pour retrouver toutes ses fiches enfants, tu peux utiliser Application.MainForm.MDIChildCount et Application.MainForm.MDIChildren[].
Et pour chaque fiche enfant trouvée, employer la méthode
Application.MainForm.MDIChildren[i].Components[j]...

J'espère que tu suis car j'ai l'impression de ne pas être très clair...

_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut,

"Application.Components" contient essentiellement des fiches "TForm" il faut donc changer un peu le code.

le code suivant passe toutes les fiches de l'application en revue et recense tous les boutons s'y trouvant et affiche le résultat dans un TMemo

procedure TMainfrm.Button1Click(Sender: TObject);
[b]var
  /bI, J: Integer;
[b]begin
  /bMemo1.Clear;
  for I :=  0  to  Pred(Application.ComponentCount) [b]do
    if /b(Application.Components[I] is TForm) [b]then
      with /b(Application.Components[I] as TForm) [b]do
        for /bJ : = 0 to Pred(ComponentCount) [b]do
          if /b(Components[J] is TButton) [b]then
            with /b(Components[J] as TButton) [b]do
              /bMemo1.Lines.Add(Format('Form Name: %s Button Caption: %s',
                [(Application.Components[I] as TForm).Name, Caption]));
end;


[hr]@+Cirec
[hr]
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

merci merci les amis.

desolée pour le retard j'etais un peu "busy". desolée Caribensila je n'ai pas encore essayé ta dernière suggestion. et merci cirec pour ta procedure, elle marche très bien pour les memo mais j'ai assayé les adoquer, il m'affiche une erreur "index out of bound[11]" un truc du genre.

voici ce que j'ai fait:

procedure TForm1.Button2Click(Sender: TObject);

var
  I, J: Integer;
begin

  for I := 0 to Pred(Application.ComponentCount) do
    if (Application.Components[I] is TForm) then
      with (Application.Components[I] as TForm) do
        for J := 0 to Pred(ComponentCount) do
          if (Components[J] is TADOQuery) then
            with (Components[J] as TADOQuery) do
            (Application.Components[J] as TADOQuery).open;
end;

je sais que je me goure quelque part :(.

(encore merci)
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

ça marche à merveillllle. Merci merci merci
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Bonjour,

juste une précison..
on évite d'éparpiller les composants table (TTable ou TQuery) principaux
dans les formes..

on les placent tous dans une fiche prévue à cet effet :
le DataModule
et du coup, on ouvre toutes ses tables à l'ouverture de l'application
par une simple boucle selon le principe proposé par cirec.
il est d'ailleurs conseillé de les fermer avant de les ouvrir et de prévoir un petit traitement d'erreur (au cas où une table serait défectueuse..)

et on les referment de la même manière à la sortie

cela permet également d'appliquer des procédures évenementielles identiques sur un groupe particulier de tables..

c'est une méthode de travail propre qui a fait ses preuves.
l'objectif étant bien entendu de simplifier le code à la fois en exécution et en lecture.

cantador
Messages postés
15
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2012

Oh oui, effectivement, car en ce moment il m'affiche l'erreur :
le fournisseur actuel ne prend pas en charge les jeux d'enregistrement multiple renvoyé à partir d'une requête simple.

pas terrible , mais je crois que c'est à cause de mon quick report, il est lancé en même temps que l'activation de mes adoquery (je dis ça puisque dans une autre procédure où il n'y a pas d'appel à un quick report, la procédure marche sans problème).

Bon, si y a des suggestions je suis toute ouie, mais sinon, je vais essayer de résoudre ça, puisque je sais que c'est une surcharge que je fais quant à mes adoquery.

Merci pour tes précisions cantador, je vais voir si je peux simplifier avec ta methode.