Frames et shapes

cs_machto Messages postés 179 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 18 février 2009 - 18 juin 2003 à 17:35
cs_cirrus Messages postés 12 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 17 novembre 2006 - 27 nov. 2003 à 10:47
Bonsoir.

je voudrais faire un truc un peu compliqué et je ne sais pas comment m'y prendre. Vos suggestions ou solutions sont les bien venues:

soit:

- J'ai des images schématiques monochromes (bmp par exemple) que je veux charger sur ma Form autant de fois que je veux et placer ensuite où je veux. J'ai besoin, pour que mon programme soit explicite, de pouvoir faire varier la couleur de cette (ces) image(s). Est-ce possible et comment?

- J'ai des frames contenant chacune une shape et des lignes schématiques monochromes. Je sais faire varier les couleurs de la shape et des lignes mais comment faire pour dupliquer ces frames et leur contenu, pendant l'execution, d'un clic par exemple, pour en multiplier le nombre à loisir en les indexant. Mêmes questions.

En résumé, je veux disposer des "trucs" autour d'un cadre et en piloter les couleurs.

Merci par avance.

M@chto

5 réponses

SibosisITS Messages postés 72 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 20 juin 2003
19 juin 2003 à 09:56
Bonjour tout d'abord ;)

Pour la deuxième question, c'est assez simple : Je suppose que Frame est le nom de la Frame à l'écran, Shape est le nom de ta shape et Line1, Line2, ... sont les noms de tes lignes. Je suppose que tu as déjà créé un exemplaire de chaque au moment de la création. Pour pouvoir les duppliquer, tu dois créer des groupes de contrôles. Pour cela, tu dois modifier la propriété Index de chacun des composants en luii donnant la valeur '0'. Ensuite, pour duppliquer l'un des éléments, tu dois écrire le code suivant

Load Frame(i)
with Frame(i)
.visible= true 'affiche l'objet à l'écran (c pas automatique)
'Définition de la position et des dimensions de la frame
.top = ? 'Je te laisse le soin de remplacer les points d'interrogation ;)
.left = ?
.width = ?
.height = ?
'Insérer ici les autres propriétés de l'objet nécessaires
end with

Load Shape(i)
with Shape(i)
.visible = true
.parent = Frame(i) 'Indique l'objet devant contenir la shape
'Insérer ici les propriétés de dimensions, comme pour Frame (sauf qu'ici, les coordonnées fournies sont celles relatives coordonnées de la Frame
'Insérer les autres propriétés nécessaires (forme, couleur intérieure (.BackColor il me semble), couleur de la bordure, etc.)
end with

'Répéter le code suivant pour chaque ligne (en changeant le numéro)
Load Line(i)
with Line(i)
.visible = true
.parent = Frame(i)
'Insérer toutes les autres propriétés nécessaires...
end with

A la fin de la création, il ne reste plus qu'à incrémenter i

i = i + 1

et on est près pour une nouvelle dupplication.

La variable i représente une valeur d'index non utilisé. Plusieurs choix pour sa déclaration : si la dupplication se fait toujours dans la même fonction, tu peux la déclarer en 'static' dans cette fonction et l'initialiser à 1 :

Static i As Integer
if i=0 then i=1

Si tu possède dans ton programme plusieurs fonctions succeptibles de créer des éléments dans un des groupes, tu la déclares au niveau module et tu l'initialises en début de programme à 1 également

Il se peut que tu ais déjà créé un groupe de controles pour les lignes contenues dans la frame (Line(0), Line(1), etc...)
Qu'à cela ne tienne, il suffit de changer l'index 'i' pour les lignes par un autre index, indépendant, 'j' par exemple (original n'est-ce pas ? ;). Ceci a l'avantage de réduire la taille du code à écrire. Supposons que ta frame contient 'n' lignes : on a alors le code suivant (qui remplace celui concernant les lignes écrit plus haut) Je suppose déclarée la variable compteur 'a' , et 'j' initialisée à une valeur d'index non utilisé (les remarques pour 'i' plus haut sont aussi valables ici) :

For a=1 to n
Load Line(j)
with Line(j)
.visible = true
.parent = Frame(i) 'c'est bien un 'i' ici
'Autres propriétés...
end with
j = j + 1 'Ne pas oublier l'incrémentation
Next a

Ce procédé est très pratique : il permet par exemple de créer un nombre variable de lignes dans chaque frame (en faisant varier n d'un appel à l'autre).

Au moment de la création d'un objet dans un groupe, on ne peut pas être certain des valeurs prises par les propriétés de l'objet. Il est donc conseillé, lorqu'on charge un objet, de définir toutes les propriétés dont on a besoin explicitement.

VOILA pour la deuxième question.

Pour la première... ct quoi déjà ? ;) Ah oui...
La réponse : Ca dépend ce que tu veux en faire...
1) Si cette image est chargée au moment de la création dans un controle Image, pour le duppliquer, tu procèdes comme avec les objets Frame, Shape et Line.
2) Si cette image est chargée au moment de l'execution (ie par le code) dans un objet Picture (nommé par exemple MonoPic), grace à la fonction LoadPicture, et que tu veux l'afficher directement dans le contexte graphique de ton form, tu peux utiliser la méthode très utile 'PaintPicture' comme suit :

NomForm.PaintPicture MonoPic, x, y

où x et y sont les coordonnées du coin supérieur gauche de l'image. Bien sûr, cette méthode suppose que tu redessines les contrôles chaque fois que nécessaire (dans l'événement Paint de ton form), ce qui suppose de connaîtres la listes des coordonnées du coin supérieur gauche de chacune des images à afficher : Cela peut se faire en utilisant un tableau dynamique de structures PARAMPIC par exemple. Voici les déclarations nécessaires :

Type PARAMPIC
x As Single
y As Single
'Autres paramètres nécessaires à l'image
End Type

Dim PicTable() As POINT
Dim IndexPic As Integer 'Variable à initialiser à 0

Tu agrandis le tableau lorsque tu ajoutes une nouvelle image (pour des raisons pratiques, tu t'interdis l'utilisation de l'index 0 dans le tableau)

IndexPic = IndexPic + 1
Redim Preserve PicTable(IndexPic) 'Agrandit le tableau tout en préservant les valeurs déjà entrées

With PicTable(IndexPic)
.x = ?
.y = ?
'Initialiser les autres paramètres
End With

Pour afficher les images, tu utilises alors le code suivant (code qui doit être au moins dans l'événement Paint de ton form) :

For a=1 to IndexPic
'Insérer le code pour le traitement des paramètres...
NomForm.PaintPicture MonoPic, Pictable(a).x, PicTable(a).y
Next a

Pour ce qui est de la couleur, tu ne peux pas échapper à l'utilisation de l'API Windows qui donne toutes les fonctions nécessaires pour un traitement rapide. Mais je ne peux pas beaucoup t'aider dans ce sens pour le moment, vue que c'est précisément là-dessus que je réfléchis actuellement (je vois comment faire, mais je ne connaît pas toutes les instructions par coeurs... et ce serait très long... beaucoup plus que la longueur actuelle de ce message, qui est déjà importante ;)

Bien, j'espère avoir répondu à ta (tes) question(s).

S'il y a des points obscures, n'hésite surtout pas à demander : si je suis dans le coin, je me ferais un plaisir de t'éclairer...

(; Sibo ;)
0
cs_machto Messages postés 179 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 18 février 2009 1
19 juin 2003 à 11:47
M@chto
0
cs_machto Messages postés 179 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 18 février 2009 1
19 juin 2003 à 11:51
Bonjour.
Merci, tu as l'air d'être un pro, moi je débute et me suis lancé dans un prog un peu difficile pour moi, mais ça me permet de progresser.
Je n'ai pas tout compris pour l'instant, je reverrai ça à tête reposée. Ce qui m'oimporte, c'est que cela soit possible. En tout cas, merci d'avoir pris le temps.
A+

M@chto
0
cs_machto Messages postés 179 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 18 février 2009 1
25 juin 2003 à 10:06
Bonjour,
j'ai voulu essayer ce code (réponse de la 2° question) mais j'ai qques difficultés:
- Ce dode, tu le mets dans quoi? Un module?
- Comment dois-je l'utiliser pour faire les duplications "en live" pendant mon programme?
- Tu parles de "fonction" pour déclarer (i). Je n'ai pas encore abordé ce type de code dans mon "apprentissage". Que veux-tu dire et que dois-je faire?
Je te remercie par avance.

M@chto
0

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

Posez votre question
cs_cirrus Messages postés 12 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 17 novembre 2006
27 nov. 2003 à 10:47
j 'ai lu la repsone formuler et la chtite question mais je kroa qu'il y a un pblm :
tu dit qu'on peut affecter une valuer à la propriété parent ? comment tu fait ?

frame.parent = qqchose

je croit que c imposible

se qui ammene am am 2 ème question. comment faire pour dupliquer plusieur frame avec des controles à l'interieur ?
0
Rejoignez-nous