[Prog DELPHI]Un truc un peu dans le style WITH machin DO, mais pas tout à fait pareil

Répondre
Partager Rechercher
Bon, je sais, Delphi patati patata...
C'est pas pour moi, c'est pour le bahut .


Donc ce que je cherche à faire (et que donc je n'arrive pas ) c'est à modifier facilement la même propriété sur un paquet d'objets.

image01.picture.loadfromfile('monfichieràlacon.jpg');
...
...
...
image99.picture.loadfromfile('monfichieràlacon.jpg');

sans me retapper à chaque fois le "image" et le ".picture.loadfromfile('monfichieràlacon.jpg');" mais juste en modifiant le numéro. (Bein oui, le fichier reste le même mais j'ai un peu la flemme de le faire 100 fois... surtout qu'il faudra surement que j'en fasse 4 comme ça )


Jsais pas, peut être qu'il existe une procédure qui me permet d'executer une commande contenue dans un string (et donc facilement modifiable) mais je n'en sais rien et si ça existe, je ne connais pas le nom de cette procedure.

Une bonne âme pour m'aider ?
Je connais pas le Delphi, mais il doit y avoir moyen de faire soit des tableaux d'objets, soit de l'indexage.

En gros, quelque chose comme ça en VB :
Code PHP:

Dim i As Integer
For 0 To 99
    image
(i).Picture.LoadFromFile("tonfichieràlapasdevilainmot.jpg")
Next i 
Encore une fois, aucune idée de la syntaxe Delphi, mais je suis prêt à parié que ça existe.
Je pense que ca peux se faire avec RaiseEvent, si ça peux aiguiller quelqu'un qui connait... parce que moi,

[edit]Ah non ca existe pas avec Delphi

il faudrait quelquechose du genre :
<doEvent> ((<type instruction>) "blabla" + i + "blabla")
Je débute en Delphi et je ne sais pas trop à quoi correspond la déclaration d'une collection d'image.

En gros, je les ai juste créé sur ma form et je ne les ai pas encore nommés.

Il y a une façon particulière de les déclarer ?
tu fais: (pas en delphi, faudra trouver la syntaxe adéquate).
Delphi reconnait les classes et les objets, donc il y a le pendant

class imageClass
{
var image (déclare l'image en picture)


function load(string k)
{
image.picture.loadfromfile(k);
}

}


puis dans le programme tu déclares un tableau style comme

var imageObject[4096];

for (i=1;i<4096;i++)
{
imageObject[i] = new imageClass();
imageObject[i]->load("nomdufichier.jpg");
}

voila. tu ne peux faire un tableau d'images, mais en enfermant l'image dans un objet, tu peux utiliser un tableau d'objets.
Cependant pour accéder à l'image tu devras taper:
imageObject[i].image.(show par exemple);

Ceci bien entendu ne suit pas la syntaxe du delphi, mais la philosophie objet y est.
En espérant t'avoir aidé.
Citation :
Provient du message de Loekit
Je débute en Delphi et je ne sais pas trop à quoi correspond la déclaration d'une collection d'image.

En gros, je les ai juste créé sur ma form et je ne les ai pas encore nommés.

Il y a une façon particulière de les déclarer ?
Disons que tout dépend ce que tu veux faire, c'est toujours pareil. Sans cas concret, toujours difficile de juger (surtout que ça fait un an que je n'ai pas fait de Delphi et que là, il n'est pas installé sur mon poste).

Il y a plusieurs façon de faire quand tu veux traiter des séries de composants pour leur appliquer le même traitement :

- si tu poses tous tes composants sur une TForm, il y a moyen en fait d'accéder à tous les composants par le biais d'un tableau de composants (regarde du côté de l'aide Delphi, me souviens plus bien du nom de la propriété mais c'est un tableau de TComponent). En parcourant le tableau (une boucle donc), il est ensuite possible de tester le type du composant (dans le cas par exemple d'un traitement systématique sur toutes tes images) ou également d'accéder à son nom (dans le cas où tu ne souhaites traiter que certains de tes composants image)

- une autre façon de faire et de créer dynamiquement tes composants images et de les ajouter ensuite sur ta TForm, mais là, il faut les positionner, les dimensionner etc dans le code, ce qui est, j'en conviens, un peu plus pénible que de passer par l'interface de conception graphique.

Désolé si je ne suis pas très clair Si tu veux qu'on en parle plus en détail, on peut faire ça par MP et je te promets une réponse un peu plus claire pour lundi

[edit pour Tabassor]

Disons qu'en delphi, tu as moyen de faire moins "agricole" qu'en C++ ( ), mais c'est plus ou moins la façon de faire

[/edit]

[edit 2 le retour du fils de la vengeance]

[mode troll ON]

Rhaaaa, puis arrêtez avec vos exemples en VB, ça n'a rien à voir c'est un vrai langage Delphi

[mode troll OFF]

[edit]

[edit 3]

[mode auto-flagellation ON]

Zut, j'avais oublié le FindComponent

[mode auto-flagellation OFF]

[/edit]
j'aurait bien une solution qui serait un peu plus pratique.. met faut jouer un peu avec le system de fichier..

je m'explique :
dèja positionnes tes images dans un meme fichier puis lit se dossier par programme en inscrivant le chemin complet dns un fichier texte...

après il suffit de faire un

Code PHP:

Compteur 0
open 
"ListeImg.txt" for input as #FicList

while eof (FicList) = false
  input line 
#FicList, LinText
  
Compteur Compteur 1
  image
(Compteur).Picture.LoadFromFile(LinText)
wend

Close 
#FicList 
ca peut etre également une solution
var i : Integer ;
for i := 1 to 99 do
(FindComponent('Image' + IntToStr(i)) as TImage).Picture.LoadFromFile('c:\Monimageàlacon.jpg') ;

Dans le cas ou tu te sert de composant TImage.

[ Edit pour rajouter : Ceci ne fonctionne pas si tu as Image01
Car lors de la conversion IntToStr tu obtiendras juste 1, et donc Image1 au lieu de Image01.
Juste une petite manipulation supplémentaire dans ce cas là. ]
Citation :
Provient du message de Lorim
j'aurait bien une solution qui serait un peu plus pratique.. met faut jouer un peu avec le system de fichier..

je m'explique :
dèja positionnes tes images dans un meme fichier puis lit se dossier par programme en inscrivant le chemin complet dns un fichier texte...

après il suffit de faire un

Code PHP:

Compteur 0
open 
"ListeImg.txt" for input as #FicList

while eof (FicList) = false
  input line 
#FicList, LinText
  
Compteur Compteur 1
  image
(Compteur).Picture.LoadFromFile(LinText)
wend

Close 
#FicList 
ca peut etre également une solution
Ou pourquoi faire simple quand on peut faire compliqué
Citation :
Provient du message de Le Saint
La manière de faire proposée par Tynril me semble limpide et être la plus simple à mettre en oeuvre.
Tu devrais pratiquement faire juste un copier/coller
La manière décrite par Tynril ne fonctionne pas, simplement.

Je vais essayer ça dès que j'aurais reboot sous windows et je vous dis.
si y a d'autres zidées, je suis preneur.
En tous cas, merci de vous décarcasser pour moi

T'inquiète Jezabelle, j'ai quand même des bases en programmation (mais pas encore en objet malheureusement ), donc je vois ce qui peux ne pas coller et comment le corriger en principe
Citation :
Provient du message de Le Saint
Ou pourquoi faire simple quand on peut faire compliqué
c'est ma devise

mais cette méthode a l'avantage d'etre rapide (car la lecture/écriture d'un fichier texte c'est ultra rapide) et de ne pas prendre ou quasiment pas de puissance machine
Citation :
Provient du message de Lorim
c'est ma devise

mais cette méthode a l'avantage d'etre rapide (car la lecture/écriture d'un fichier texte c'est ultra rapide) et de ne pas prendre ou quasiment pas de puissance machine
On aura tout entendu.
Accéder au disque est infiniment plus lent que n'importe quelle boucle non-optimisée ou programmée avec les pieds.
C'est même ce qui limite la vitesse des applications, en règle générale.
Essai d'associer une variable en string qui se modifie selon l'incrémentation de ton compteur.

Un truc du genre :

for ( i=1 ; i = 99 ; i++ ){
img = "image" + i ;
ligne de chargement de l'image ;
}

C'est du java, mais comme c'est aussi un langage objet, ca doit y ressembler. En fait, je te propose simplement de creer une variable de type string que tu modifie dans ta boucle.
Code PHP:

Procedure ClaqueDesBMPDansToutMesControlesTimage;
var
 
integer;
begin
  
for := 0 to self.ComponentCount do // self = ta form, a remplacer par le controle parent de tes Timage.
  
begin
    
if Components[iis TImage then (Components[i] as Timage).Picture.LoadFromFile('MonImageDePingouin.bmp');
  
end;
end
je vois pas plus simple


[edit] correction mineure
Code:
image tabimage[4096];

for(int i = 0; i < 99; i++)
{
  sprintf(name,"monfic%d.img", i);
  tabimage[i].load(name)
}
voila un truc qui fait ca en C++, ca doit surement pouvoir s'ecrire a la strict identique en delphi ou en pascal objet. Ca fait 6 ans que je n'ai pas dait de pascla ou de delphi alors je ne sais plus t'aider pour ce qui est de la syntaxe precise.
C'est bon, c'est trouvé
Code PHP:

For i:=0 to 9 do
begin
    
for j:=0 to 9 do
    
begin
        
(FindComponent('Image' IntToStr(i)+ IntToStr(j))as Timage).Picture.LoadFromFile('image.jpg')
    
end;
end
Un grand merci à tout ceux qui m'ont aidé à trouvé ce truc qui me sera super utile pour mon projet.
Special Thanks to Jezabelle qui a trouvé la formule magique (la première puisque d'autres ont donné des trucs simillaire par la suite).

Citation :
Provient du message de Geshir-Ouaf
On aura tout entendu.
Accéder au disque est infiniment plus lent que n'importe quelle boucle non-optimisée ou programmée avec les pieds.
C'est même ce qui limite la vitesse des applications, en règle générale.
c'est vrais un fichier texte en accès disque c'est super lent

surtout vis a vis d'une mauvais boucle ^^;
fait : Il y a un facteur de temps de reponse de l'ordre de 1 million entre la memoire et le cache du disque. Il y a un facteur 1000 entre le cache niveau 1 et la memoire. Au mieux la lecture dans un fichier :
- cout d'un appel systeme pour l'ouverture creation des fd etc changement de contexte de processus et passage en mode noyau.
- lecture du premier bloc du fichier, extremement couteux puisque operation realisée hors cache disque.
- lecture suivantes : cout d'une operation mémoire.
- si le disque n'est pas fragmenté : la lecture du bloc suivant a certainement été faite en prefetch, ca coute donc le prix d'une lecture en cache disque (facteur 10000 a 100000 quoi)
- sinon tu repayes une vrai lecture hors cache disque et la merci bonjour.

Utiliser un fichier "peut etre presque aussi rapide" que d'utiliser de la memoire. Dnas le pire des cas c'est 1 Million de fois plus lent au minimum.
je viens de tester ça :


Code PHP:

procedure TForm1.Button1Click(SenderTObject);
var
 
integer;
begin
  
for := 0 to self.ComponentCount do
  
begin
    
if ((Components[iis TImage) and ((Components[i].Name >= 'Image1') and (Components[i].Name <= 'Image99'))) then (Components[i] as Timage).Picture.LoadFromFile('c:\winnt\winnt.bmp');
  
end;
end
Ca a l'avantage de ne toucher que les Timage nommés (image+n°)
Citation :
Provient du message de Lorim
c'est vrais un fichier texte en accès disque c'est super lent

surtout vis a vis d'une mauvais boucle ^^;
Oui, c'est exactement ce que j'ai dit, et je maintiens.
Le temps d'ouverture du fichier est diablement plus long que n'importe quelle boucle mal optimisée.
Citation :
Provient du message de Geshir-Ouaf
Oui, c'est exactement ce que j'ai dit, et je maintiens.
Le temps d'ouverture du fichier est diablement plus long que n'importe quelle boucle mal optimisée.
aaaah?
c'est bizarre car moi en deux ans de travail sur fichier mode texte (reconnaissance de caractère,formatage du texte,traduction ascci-ansi et inversement tout ca sur du texte brut) pour intégration dans des BDD (Ms Acces et Oracle principalement) ...
Bah étrangement la plupart des traitements était plus rapide avec des fichiers texte ^^

Ou ca doit etre mon imagination peut etre ^^
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés