SSTab [Résolu]

Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Dernière intervention
10 septembre 2010
- - Dernière réponse : PCPT
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
- 1 sept. 2005 à 20:15
Salut...

J'ai posé une question sur le Forum à propos du SSTab mais la réponse que j'ai eu ne fonctionne pas...

J'ai 5 programmes que je me suis fait en VB6 et je veux faire qu'un seul programme en utilisant le SSTab (5 onglets).

Je me suis fait un nouveau projet et j'ai importer mes 5 Form. J'ai fait un copier coller de ma première Form et je l'ai coller dans un onglet. J'ai fais la même chose pour les 4 autres onglets (Chauqe programme (Form) à son onglet)

Je veux que si je clique sur l'onglet 0 (If SSTab1.Tab = 0 Then) je verrai le programme que j'ai copier et que ca l'appelle le code de la Form auquel elle se rattache. Donc je clique sur l'onglet 0 et je peux utiliser le programme qui se trouve dans cet onglet. Donc à chaque fois que je change d'onglet le code change de form pour faire fonctionner le progaremme... ???? C'est plus clair.. ????

Je ne peux pas utiliser le SHOW car ca fais apparaitre le form qui n'est pas dans le SSTab.... je veux seulement que ca l'appelle le code....

C,est possible de faire ca avec VB6 ?????

J'espere être un peu plus clair.....

msg si cela n'est pas le cas....


Merci d'avance...
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
3
Merci
je crois que Jeff parle des évènement qu'il y avait dans le OnLoad des ses anciens projets.

Jeff, copier l'interface n'est pas tout. le plus propre me semble de créer/modifier tes codes dans des modules, et selon les onglets, executer les codes des modules voulus

ex :

' au SSTab1 click
Select Case SSTab1.Tab
case 0: Call Mod_Zero.LoadProject
case1
Call Mod_Commun.DestroyVars
Call Mod_One.InitInterface
'etc....
End Select

sans oublier de lancer au Load la fonction du premier onglet affiché :
'disons le 3e (j'ai pas la syntaxe sous les yeux)
Call SSTab1_Click(2)

PCPT

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
3
Merci
oui, c'est bien comme çà que je l'avais compris ;)
le truc, c'est qu'il ne suffit pas de copier des composants.
tu avais avant par exemple :
Form1.Text1="machin"
maintenant, tu as Form_SStab.Text1="machin"

mais si dans ta form1, à l'évènement OnChange, tu avais une fonction, cette fonction n'existe pas dans ton Form_SStab.
la meilleur solution est donc d'adapter tes codes, sous formes de modules différents (pour la clareté) et de les appeler selon tes besoins & selon l'onglet concerné.

si ce n'est qu'une solution de facilité, pour ne recopier aucun code, tu as encore une possibilité :

tu as tes 5onglets. tu créés 5 pictures.
au chargement, tu Load tes 5 forms (LOAD, pas SHOW)
ensuite, tu les rends "filles" de tes 5pictures. tu n'auras plus rien à changer, les codes sont accessibles puisque les Forms sont ouverte dans un autre support.

NB : ne pas oublier de les "dé-parenter" au UnLoad

cela dit, il faut vraiment être certain de tes 5 projets existants, pour qu'aucun ne comporte d'évènement public commun, etc..
PCPT

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
3
Merci
si tu as copier les controles il faut que tu copies aussi toutes les procédures évêments sur la forme principale.

sinon tu seras obligé de mettre toutes les procédures en Public et les rappeler à partir de la forme principale.

l'évênement se fera toujours sur la forme principale, là où se trouvent les contrôles



sur la forme principale tu ne peux pas non plus avoir deux controles de même nom (sauf s'ils sont indexés bien sur)

donc si tu as un Command1 sur la Form1 et un Command2 sur la Form2,
soit tu copies tout sur la Forme principale, soit tu met tout en Public
et tu appelles les procédures correspondantes:


Private Sub Command1_Click()

Call Form1.Command1_Click

End Sub


Private Sub Command2_Click()


Call Form2.Command2_Click


End Sub



Daniel

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
non c'est pas clair

une forme dans un onglet ?

on met des contrôles dans un onglet

et quand on clique sur un onglet, les contrôles correspondant à cet onglet apparaissent.

il y a pas de code correspondant, seulement l'évênement Click.

Daniel
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
dans ce cas là je rectifie le post précédent









Private Sub SSTab1_Click(PreviousTab As Integer)

If SSTab1.Tab = 4 Then

frmGestionTemps_Load

End If

End Sub


Daniel
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Dernière intervention
10 septembre 2010
0
Merci
Je vais ressayer d'^tre plus clair...

Ca m'ennuis car je ne connais pas tous les termes en VB donc c'est un peu plus complexe à expliquer pour moi...

Je réessaye...

Oublions le SSTab...

Je vais essayer d'en dire un peu plus et je sais tres bien que je vaius dire des choses que vous savez déjà mais enfin j'essais...

J'ai 5 programmes donc 5 projet (Projet.vbp) C'est projet on chacun une Form que je nommerais Form1 (Projet1), Form2 (Projet2), Form3 (Projet3) etc.. C'est Form ont tous des textbox, cmdbutton Listview, etc....

Je me suis donc créé un Projet et j'ai Ajouter mes 5 Form à ce projet...

Revenons au SSTab.

J'aimerais que mon premier onglet puisse avoir les textbox, cmdbutton, etc de ma Form1. J'ai donc pris tout les boutons, textbox, etc. de ma Form1 et j'ai fais un copier de tous ces éléments pour les coller dans mon premier onglet.

Donc quand je démarre mon programme et que je vais dans mon premier onglet, je veux que mon premier onglet utilise le code de ma Form1 (Projet1)...

et si je vais dans mon second onglet le code utilisé sera celui de ma Form2 (Projet2)... Ca va ????

Donc je crois que Pcpt a la solution mais j'aimerais être bien compris pour être certain que je part dans la bonne direction....


J'attends de vos nouvelles... et merci d'avance et merci de votre patience

A+
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Dernière intervention
10 septembre 2010
0
Merci
Merci beaucoup....


Je vais regareder ca....

Merci de votre patience....

A+
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
0
Merci
Salut



Si tu veux, il y a une solution peut etre plus simple pour mettre en place Ta demande.



On peut allez sur plusieurs pistyes apres tu choisiras ce que tu voudras.



Piste 1

---> Utilise les controle utilisateur.

(tu code le code et les elements graphiques de tes formes à l'interieur)

Et tu fais cela pour tes quatre forms



(c'est equivalent a coller les form sur le SSTab grossomodo)



Ensuite tu cherche le composant et il doit appraitre dans la boite d'outil.

Tu le prend et tu colles le composant utilisateur sur l'onglet 0 de ton SStab.



Tu fais de meme avec les autres onglets.



Pour le momment c'est pas compliqué.



Pour completer le terminate de l'OCX (composant) permet de detruire les objet

et le nitialze permet de faire le chargement.





Il y a quelquespoint a savoir c'est que pour le deploiment (c'est plus compliqué a voir)





C'est une solution simple et propre.



2--> Si tu veux garder tes veilles forms

Je pense que les fonctions sont appellables

avec un call form1.mafunction(param1param2)

Mais il faut refaire une partie du code des sstab pour transferer les parametres au fonctions contenues dans les form



Je te deconseilles de faire cela



Je te conseil la methode 1.



3--> Pour aller plus loin



Si tes fonctions sont commune avec entyre les formes

Il faut créer un module pour les stocker

Exemple :

Un module base de données

Un module fonction utilitaire

Un module fonction API

....

Un module export Word

un module export excel



Dans un de mes programmes,

J'avais déporté tous le code de chaque onglet dans un module;

A l'epoque le programme qui j'ai repris n'utilisais pas les controle user.



Mais le code etait plus clair ( car mieux reparti et plusieurs personnes pouvait travailler dessus)



Pour appeller les fonction des modules un call mafonction suffit (je crois)

De plus les controles de l'IHM sont atteignables.



Exemple

dim nom as string

nom = frmMain.txtNom.text





Avec toutes ces methodes.

Je pense que tu arriveras a mettre d'applob ton programme ;-)



Il faut le faire maintenable et ne pas hesiter a creer un max de fichier c'est plus simple

a retrouver une ligne un code apres.



Esperant etre clair ;-)



Bonne continuation et programmation
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
bon j'ai essayé la méthode de pcpt avec SetParent.

ça a l'air de marcher, en plus il n'y a rien à copier.

toutes les Formes avec

Appearence = 0

BorderStyle=0

BackColor = ButtonFace




Option Explicit



Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long



Private Sub Form_Load()

SetParent Form1.hWnd, SSTab1.hWnd

Form1.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15

Form1.Show

SetParent Form2.hWnd, SSTab1.hWnd

Form2.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15

Form2.Show

SetParent Form3.hWnd, SSTab1.hWnd

Form3.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15

Form3.Show

End Sub



Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Unload Form1

Unload Form2

Unload Form3

End Sub



Private Sub SSTab1_Click(PreviousTab As Integer)

If SSTab1.Tab = 0 Then

Form1.Move 15, 310

End If

If SSTab1.Tab = 1 Then

Form2.Move 15, 310

End If

If SSTab1.Tab = 2 Then

Form3.Move 15, 310

End If

End Sub


Daniel
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
oui, c'est une méthode que j'ai découvert il n'y a pas très longtemps et que j'utilise dans mon dernier projet posté (CSMS)

ce n'est pas sa principale utilisé (getparent), mais pour le coup, çà évite pas mal de remaniements
PCPT
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Dernière intervention
10 septembre 2010
0
Merci
Salut....

J'ai fait un copier coller du code à propose du SetParent....

Lorsque je démarre ca bug au Show de ma première Form....
Et c'est quoi la couleur du ButtonFace.. mon VB est en francais et je ne trouve pas c'est quelle couleur....

Merci d'avance

Voici le code que j'ai modifié


Option Explicit

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Sub Form_Load()
frmDossierActif.Appearance = 0
frmDossierActif.BorderStyle = 0
frmDossierActif.BackColor = ButtonFace
frmContrat.Appearance = 0
frmContrat.BorderStyle = 0
frmContrat.BackColor = ButtonFace
frmContratIndexAuxImmeubles.Appearance = 0
frmContratIndexAuxImmeubles.BorderStyle = 0
frmContratIndexAuxImmeubles.BackColor = ButtonFace

SetParent frmDossierActif.hWnd, SSTab1.hWnd
frmDossierActif.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15
frmDossierActif.Show
SetParent frmContrat.hWnd, SSTab1.hWnd
frmContrat.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15
frmContrat.Show
SetParent frmContratIndexAuxImmeubles.hWnd, SSTab1.hWnd
frmContratIndexAuxImmeubles.Move 15, 310, SSTab1.Width - 30, SSTab1.Height - 310 - 15
frmContratIndexAuxImmeubles.Show
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Unload frmDossierActif
Unload frmContrat
Unload frmContratIndexAuxImmeubles
End Sub

Private Sub SSTab1_Click(PreviousTab As Integer)
If SSTab1.Tab = 0 Then
frmDossierActif.Move 15, 310
End If
If SSTab1.Tab = 1 Then
frmContrat.Move 15, 310
End If
If SSTab1.Tab = 2 Then
frmContratIndexAuxImmeubles.Move 15, 310
End If
End Sub
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
personnellement, je n'aurais pas tout à fait fait de la même manière :

j'aurais mis 5 pictureBox (une par onglet), dimmentionnées de la bonne taille (donc sans doute la totalité du sstab).
ensuite, en vérifiant bien qu'aucun des Form_Load des Form ne contiennent "show"

Form Load

Load form1: SetParent Form1.hWnd, me.PictureBox1.hWnd
Load form2: SetParent Form2.hWnd, me.PictureBox2.hWnd
Load form3: SetParent Form3.hWnd, me.PictureBox3.hWnd
Load form4: SetParent Form4.hWnd, me.PictureBox4.hWnd
Load form5: SetParent Form5.hWnd, me.PictureBox5.hWnd

et c'est tout.

et au Form UnLoad

unLoad form1: unLoad form2: unLoad form3: unLoad form4: unLoad form5

PCPT
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
les 3 propriétés faut les mettre dans l'IDE, surtout le BorderStyle.

Button Face c'est une couleur, tu la trouve dans les propriétés
Backcolor, Forecolor, FileColor et dans les constantes vb, comme vbRed,
vbActiveBorder, vbActiveTitleBar, vbApplicationWorkspace, etc ...



frmDossierActif.BorderStyle = 0

frmDossierActif.Appearance = 0

frmDossierActif.BackColor = vbButtonFace


ça bug au Show ?

ça affiche une erreur ou ça marche mal ?



sinon j'ai une correction à faire:

il faut cacher les autres formes à chaque fois, sinon certains controles apparaissent de temps en temps.



If SSTab1.Tab = 0 Then

frmDossierActif.Move 15, 310

frmContrat.Move -75000

frmContratIndexAuxImmeubles.Move -75000

End If

If SSTab1.Tab = 1 Then

frmDossierActif.Move -75000

frmContrat.Move 15, 310

frmContratIndexAuxImmeubles.Move -75000

End If

If SSTab1.Tab = 2 Then

frmDossierActif.Move -75000

frmContrat.Move -75000

frmContratIndexAuxImmeubles.Move 15, 310

End If


Daniel
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
ça marche très bien directement dans la SStab

le Move de départ c'est pour adapter la taille de la forme au SStab

avec le BorderStyle 0 et la couleur vbButtonFace, la forme est
totalement invisible comme si elle n'existait pas et comme si les
controles étaient effectivement sur le SStab.

310 c'est la taille en twips de l'entête tabHeight + 15


Daniel
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
vi, c'était surtout pour ne plus être éventuellement embêté avec le code du click. sachant que je n'ai pas essayé avec un sstab pour autant.

logiquement, les 2méthodes doivent marcher, et la solution générale du SetParent me parraît la moins contraignante
PCPT
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Dernière intervention
10 septembre 2010
0
Merci
Bon disons que j eme renseigne sur le deux méthode.....

Alors Pcpt...

Ok il y a quelque chose que je ne saisi pas.....

Si je mets un picture pour chaque onglet.....Comment je peux aller dans mon textbox ????
Comment je peux changer mes optbutton ????

Enfin je vais essayer ce que tu me dit et je te reviens la dessus si je m'y perd....

A+
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
oui, si tu demandes, c'est que tu n'as pas esayé, en effet.
PCPT
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
NB : çà parraît évident, mais cette méthode suppose que tu supprimes tous les composants que tu as copié/collé...

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.