Boucle sur des compostants delphi [Résolu]

isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 2 juin 2011 à 12:56 - Dernière réponse : isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention
- 7 juin 2011 à 11:12
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.
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 5 juin 2011 à 11:59
3
Merci
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]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de Cirec
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 2 juin 2011 à 14:47
0
Merci
Salut,

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


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Commenter la réponse de Caribensila
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 2 juin 2011 à 15:33
0
Merci
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.
Commenter la réponse de isil4
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 2 juin 2011 à 15:46
0
Merci
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
Commenter la réponse de Caribensila
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 2 juin 2011 à 16:10
0
Merci
Oui, marche po :-(.

ça ne m'affiche aucune erreur mais ça ne marche pas :-(.
Commenter la réponse de isil4
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 2 juin 2011 à 16:18
0
Merci
ç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
Commenter la réponse de Caribensila
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 2 juin 2011 à 16:42
0
Merci
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 ).
Commenter la réponse de isil4
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 2 juin 2011 à 18:06
0
Merci
« 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
Commenter la réponse de Caribensila
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 3 juin 2011 à 09:10
0
Merci
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]
Commenter la réponse de Cirec
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 5 juin 2011 à 10:26
0
Merci
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)
Commenter la réponse de isil4
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 5 juin 2011 à 13:55
0
Merci
ça marche à merveillllle. Merci merci merci
Commenter la réponse de isil4
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 7 juin 2011 à 10:52
0
Merci
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
Commenter la réponse de cs_cantador
isil4 15 Messages postés vendredi 28 novembre 2008Date d'inscription 18 janvier 2012 Dernière intervention - 7 juin 2011 à 11:12
0
Merci
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.
Commenter la réponse de isil4

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.