gootsu
Messages postés10Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention22 décembre 2010
-
16 janv. 2009 à 15:10
gootsu
Messages postés10Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention22 décembre 2010
-
17 janv. 2009 à 10:08
Bonjour à tous,
Je m'excuse d'avance , car je n'ai pas fait la recherche de mon sujet dans le fofo.
Mais je suis au travail et cela ne concerne pas mes activités professionnelles mais personnelles.
Donc je passe ici en coup de vent. ^^
Voilà, je souhaite développer une application en "Vb6", dans laquelle il se trouve un carnet d'adresse.
Donc j'aurais un accès à des tables Access (2002).
Mon idée et de pouvoir consulter, dans une même fenêtre, deux tables différentes.
Illustration :
- table 'clients'
- table 'fournisseurs'
Donc, ces deux tables n'auront pas toutes les mêmes rubriques.
Comment je peux changer la présentation de ma fenêtre, rien qu'en choisissant la table concerner?
Dois-je passer par une Class? en superposant deux frames?
Comment je pourrais être le plus efficace?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 16 janv. 2009 à 15:53
Salut
En VB6, on peut indexer les composants sur une feuille et, bien sûr, on peut, en mode Run, générer (presque) autant de copie de ce composant original (Index 0) que nécessaire - méthode Load monObjet(x).
A mon avis, c'est cette technique qu'il faut utiliser :
Une fois que tu as la liste des champs à afficher (*), il te suffit de :
-1- "Loader" autant de TextBox (**) et de Label que tu as besoin
-2- (c'est ça qui est chiant à faire) les placer au bon endroit sur la forme - méthode monObjet(x).Move
-3- pour les Labels, mettre le nom du champ dans son Caption
(*) Liste : Soit des paramètres que tu crées toi même sous forme d'un tableau = f(client ou fournisseur), soit en relisant les Fields(x).Name dans le RecordSet
(**) Chaque objet VB6 possède une propriété Tag qui ne sert à rien d'autre que de stocker un texte ou un chiffre, invisible à l'utilisateur : Tu peux en profiter pour y stocker le nom du champ, comme ça tu pourras plus facilement reconnaitre le TextBox parmi la collection de TextBox.
Exemple rapide basé sur un RecordSet :
For r = 1 To monRecordSet.Fields.Count
' Il me semble que les Fields sont numérotés à partir de 0 --> A revoir
Load maTextBox(r)
With maTextBox(r)
.Visible = True
.Move maTextBox(0).Left, maTextBox(r - 1).Top + .Height + 100
.Tag = monRecordSet.Fields(r).Name
.Text = monRecordSet.Fields(r).Value
End With
With monLabel(r)
.Visible = True
.Move monLabel(0).Left, monLabel(r - 1).Top + .Height + 100
.Text = monRecordSet.Fields(r).Name
End With
Next r
Et, lors de la validation, reprendre le même principe à l'envers
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
' cnx
inexistante?
If CnxAdo Is Nothing Then
Exit Function
ElseIf Not (CnxAdo.State = adStateOpen)
Then
Exit Function
End If
'
sql vide?
sSql = Trim$(sSql)
If LenB(sSql) = 0 Then Exit Function
'
logique rows
If lFirstRow < 0 Then
Exit Function
ElseIf lLastRow < 0 Then
Exit Function
ElseIf (lLastRow > 0) And (lLastRow < lFirstRow)
Then
Exit Function
End If
' variables
Dim i As Long
Dim j As Long
Dim RstAdo As New ADODB.RecordSet
Dim Itmx As ListItem
' init Listview
If bHeader Then MyLv.ListItems.Clear:
MyLv.ColumnHeaders.Clear
MyLv.Visible = False
On Error GoTo Lbl_Err
' Paramètres RecordSet et lancement de la
requête
RstAdo.CursorLocation = adUseClient
RstAdo.Open sSql, CnxAdo, adOpenDynamic,
adLockPessimistic
' Si il n'y a pas de champs
on ne fait rien
If RstAdo.Fields.Count > 0 Then
' header
If bHeader Then
' on affiche
forcément toutes les colonnes puisque c'est la requête qui prévoit le
retour
For i = 0 To RstAdo.Fields.Count - 1
MyLv.ColumnHeaders.Add , ,
RstAdo.Fields(i).Name
Next i
End If
'
champs. attention!! si pas de header, il faut évidemment que la listview ait
été préparée avant!
If RstAdo.RecordCount > 0 Then
' 1er champ zéro
= aucun champs
If lFirstRow > 0 Then
' dernier
champ zéro tous, trop grand> on réduit
au dernier
If (lLastRow = 0) Or (lLastRow > RstAdo.RecordCount) Then
lLastRow = RstAdo.RecordCount
' ajoute
RstAdo.Move lFirstRow - 1
For i = lFirstRow - 1 To lLastRow - 1
Set Itmx = MyLv.ListItems.Add(, ,
CStr(RstAdo.Fields(0).Value))
For j = 1 To RstAdo.Fields.Count - 1
Itmx.SubItems(j) = IIf(LenB(RstAdo.Fields(j).Value) > 0, RstAdo.Fields(j).Value,
vbNullString)
Next j
' passe à
l'enregistrement suivant
If Not RstAdo.EOF Then RstAdo.MoveNext
Next i
' pas d'erreur
FillListViewFromAdoCnx = True
Else
' pas de
champs mais pas d'erreur pour autant
FillListViewFromAdoCnx = True
End If
Else
' pas d'erreur
FillListViewFromAdoCnx = True
End If
End If
' gestion d'erreur s'il y en a eu
Lbl_Err:
If Not (Err.Number = 0) Then
FillListViewFromAdoCnx = False
Err.Clear
End If
MyLv.Visible = True
'
destruction objets
RstAdo.Cancel
If Not (RstAdo.State = adStateClosed)
Then RstAdo.Close
Set RstAdo = Nothing
Set Itmx = Nothing
End Function
gootsu
Messages postés10Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention22 décembre 2010 17 janv. 2009 à 09:30
Vos deux idées sont exactement ce dont je cherche.
La première, c'est celle que j'imaginais faire car c'est l'aspect mise en page de textbox et label que je souhaitais faire.
Cependant, je n'avais pas pensé à la seconde idée évoqué!
Donc question subsidiaire :
- Quelle est celle que vous me conseillez?
Merci encore
Gootsuunique au monde
Vous n’avez pas trouvé la réponse que vous recherchez ?
gootsu
Messages postés10Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention22 décembre 2010 17 janv. 2009 à 10:08
C'est vrai!!
j'aurais dû venir après le petit déjeuné, ça m'aurais évité de poser une question idiote! ^^
Ah quand on est pas réveillé, c'est pas le moment de bosser, on fait tous de travers!! lol
... à moins que ça ne s'applique qu'à moi!