Redim tableau à n dimension (2 ici) [Résolu]

Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 21 déc. 2009 à 20:38 - Dernière réponse : Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention
- 31 janv. 2010 à 18:37
Salut la team, voila j'ai un petit (nan un gros) soucis !
j'ai posté ce soft :
http://www.vbfrance.com/codes/COMPTE_BANCAIRE-NET_50966.aspx

j'ai envie de bien le réécrire suite aux remarques de claudedetom.

Du coup je me lance dans un défi dépassant mes compétences, et du coup j'ai besoin de votre savoir.
Mon souci, je déclare un tableau à 2dim dans une classe (mon_compte), et lors de la lecture j'aimerais qu'il mette tout seul à jour les lignes qui sont "mensualisées" (x,7)=true
Mais voila le redim me jette car il ne peux redim que la dimension de droite -_- (c'est nul)
Donc j'imagine que je dois utiliser les collections. Mais voila aprés plein de lecture j'y pige pas grand chose.
Je vous post "ma bidouille tab_temp" qui revient en fait au même et qui biensur ne marche pas.
béwui lorsque je fais
 'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
il redimmensionne ce que j'avais avant prévu (voir plus bas)
Si une bonne âme à une idée ou un exemple je prends.
amicalement @dn
' trouve le nombre de mise à jours à faire
        Dim NB_maj As Integer = 0
        ' trouve le nombre de ligne à traiter
        Dim NB_ligne As Integer = CInt((lecture.lignes.Length / 8) - 1)
        'calcule le nombre de ligne en divisant la longueur total par le nombre de colonne (-1 car on commence à 0)
        'utlise unbound pour voir ;)
        For ligne As Integer = 0 To NB_ligne
            ' ajoute le nombre de mise à jour à faire si la colonne 7 = true.
            If CBool(lecture.lignes(ligne, 7)) Then NB_maj += 1
        Next
        'dimensionne le tableaux en fonction du nombre de ligne.
        Dim tab_temp(NB_ligne + NB_maj, 8) As String
        'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
        'pour chaque mise à jours à faire :
        For boucle As Integer = 0 To NB_maj
            'pour chaque ligne du compte
            For ligne As Integer = 0 To NB_ligne
                ' si c'est une ligne échéancier et que la date correspond au début du mois
                If Now.Day >= 1 AndAlso CBool(lecture.lignes(ligne, 7)) Then
                    ' et que ce mois n'est pas déja rempli (ou alors si c'est une nouvelle année) alors
                    If Now.Month > CDate(lecture.lignes(ligne, 0)).Month _
                    Or Now.Year > CDate(lecture.lignes(ligne, 0)).Year Then
                        'attribut la date d'aujourd'hui et le jour de l'opération mensuel
                        Dim maintenant As Date = CDate(CDate(lecture.lignes(ligne, 0)).Day & " " & Now.Month & " " & Now.Year)
                        ' retire à l'anciénne ligne le status de mensuel
                        lecture.lignes(ligne, 7) = "false"
                        ' ajouter cette nouvelle ligne !
                        'ajoute la nouvelle ligne  et active la mensualisation (encore une fois utilse unbound ! )
                        Dim index As Integer = CInt(tab_temp.Length / 8) - 1
                        tab_temp(index, 0) = maintenant.ToString("yyyy MM dd")
                        tab_temp(index, 1) = maintenant.ToString("dd MMMM yy")
                        tab_temp(index, 2) = lecture.lignes(ligne, 2)
                        tab_temp(index, 3) = lecture.lignes(ligne, 3)
                        tab_temp(index, 4) = lecture.lignes(ligne, 4)
                        tab_temp(index, 5) = lecture.lignes(ligne, 5)
                        tab_temp(index, 6) = "False"
                        tab_temp(index, 7) = "true"
                    End If
                End If
            Next ligne
        Next boucle
        ' attribut le tableaux à ME.
        Me.mdp = lecture.mdp
        Me.types = lecture.types
        Me.budgets = lecture.budgets
        Me.lignes = tab_temp


Tiens les balises ne sont pas reconnues ^_____^, zut alors.....
Afficher la suite 

Votre réponse

115 réponses

Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 déc. 2009 à 13:18
3
Merci
je n'ai pas vu la simplification....

bon, dans ce cas :
une classe représentant une ligne (clsRow) avec 7 propriétés :
2 date, 3 string, 2 boolean


et tu constitues tes éléments dans une list(of clsrow)

++

[hr]

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 27 déc. 2009 à 19:47
3
Merci
non tu ne te trompes pas, j'avais oublié ta sérialisation

création d'une nouvelle ligne (de tête, à tester bien sûr) qui va donc reprendre l'ancienne mais avec la nouvelle date :

lecture.add(new ligne_compte with {.L_date=CDate(lecture.lignes(ligne).L_date.Day & " " & Now.Month & " " & Now.Year), .L_type=lecture.lignes(ligne).L_type, .L_budget=lecture.lignes(ligne).L_budget, .L_commentaire=lecture.lignes(ligne).L_commentaire, .L_credit=lecture.lignes(ligne).L_credit, .L_debit=lecture.lignes(ligne).L_debit, .L_pointage=lecture.lignes(ligne).L_pointage, .L_mensuel=lecture.lignes(ligne).L_mensuel})


NB : attention, ne pas oublier que tu es dans une boucle. ton COUNT va changer donc conserver NB_ligne comme tu le fais ici, mais bien sûr il ne faut pas à ce stade supprimer lecture.lignes(ligne)

NB : syntaxe WITH valable sous vs2008, pas 2005 il me semble

après si c'est un peu indigeste (là un peu quand même !) suffit de mettre le with sur la LIST :

Dim new_ligne As New ligne_compte
with lecture.lignes(ligne)
new_ligne.L_date=CDate(.L_date.Day & " " & Now.Month & " " & Now.Year)
new_ligne.L_type=.L_type
new_ligne.L_budget=.L_budget
new_ligne.L_commentaire=.L_commentaire
new_ligne.L_credit=.L_credit
new_ligne.L_debit=.L_debit
new_ligne.L_pointage=.L_pointage
new_ligne.L_mensuel=.L_mensuel
end with
lecture.add(new_ligne)
new_ligne=nothing


strictement pareil

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 19:53
3
Merci
oups j'ai oublier le new_ligne=nothing !
Donc je reste sur :
                   ' ajouter cette nouvelle ligne !
                    Dim new_ligne As ligne_compte = lecture.lignes(ligne)
                    new_ligne.L_date = CDate(lecture.lignes(ligne).L_date.Day & " " & Now.Month & " " & Now.Year)
                    new_ligne.L_pointage = False
                    new_ligne.L_mensuel = True
                    lecture.lignes.Add(new_ligne)
new_ligne=nothing 



cela me parait plus clair à lire, c'est vraiment top plein de façon d'écrire la même chose (miam)
Pour mon soucis d'écriture sur la form principale, c'est simplement que j'avais un autre projet d'ouvert qui porte le même nom de form visiblement, étrange.. Allez zou à table pi dodo, Merci bien pour ton coup de pouce !
passe une bonne soirée.

Merci Adn56 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Adn56
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 28 déc. 2009 à 18:27
3
Merci
LECTURE est vraiment à se représenter comme un objet
il a des propriétés (budget etc...) et un ensemble de lignes
(çà serait encore à améliorer d'ailleurs, question philosophie justement, mais bon)
comme tu vas ajouter des lignes, que ce soit par la création ou la lecture, tu auras forcément besoin de ta LIST
il faut donc bien l'instancier
tout comme tu fais un NEW LECTURE (dans l'idée), lecture doit faire un NEW LIST

et de là s'il n'y a aucune ligne, tu auras le count à zero, plus logique que d'avoir une erreur ou un test nothing à faire à chaque appel de la propriétés LIGNES

++

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 29 déc. 2009 à 10:06
3
Merci
^^

alors

Le count est faux, ah bon il manque -1 peut-être ?

oui il manque -1
et une autre manière (pour l'apprentissage) est le bon vieux
for each enfant as type_enfant in nom_collection




l'affichage listV est baclé et des colonnes sont masqué, sinon je vois poa

non pire...
pour tout t'avouer j'ai mis un petit moment avant de m'en apercevoir, même du passer par une autre listview
aller j'te le dis : quelle est la différence entre
lv.clear

et
lv.items.clear

et oui. tu prépares ta listview dans le load et au chargement tu supprimes cette préparation
donc du coup çà marche moins bien
ensuite notion objet, il pourrait être intéressant de demander à ta LIGNE_COMPTE qu'elle nous renvoie directement une ligne de listview, par exemple
du coup dans une boucle for each
ListView1.Items.Add(item.ToListViewItem)

bien plus facile à maintenir, à mon sens...
j'te laisse deviner quel code peut bien contenir la méthode .ToListViewItem



cela doit être le test sur le L_mensuel qui perturbe non ?

beh j'sais pas trop là...
j'ai laissé mais ne tombe jamais dans ce IF et... ouai çà fait spaghetti quand même. c'est peu compréhensible, normal que tu t'y perdes aussi un peu.
le choix des noms des variables y est peut-être aussi pour quelquechose



Pour finir avec le new, je m'en doute bien, même si j'ai pas encore assimilé la différence avec ou sans

ok un peu d'explication simple

dim f as form2
f.show

ce code relève une erreur d'objet null également
normal on déclare la variable en tant qu'objet form2
et on l'affiche
mais F n'est pas instanciée, elle est juste typée
il faut bien faire
dim f as form2
f = new form2
f.show


sur un objet on utilise pas NEW quand on attribue notre variable à un objet existant. puisque du coup lui est attribué la valeur de l'existant, forcément

si j'ai une tableau de textbox, je peux parcourir ce tableau par
'on supporte malist étant une list(of textbox) contenant des éléments
dim t as textbox
for each t in malist
console.writeline(t.text)
next

ici pas besoin de NEW sur t, puisque t est instancié par le for each, ce n'est pas un nouvel objet

par contre si je veux ajouter une textbox à ma list
dim malist as list(of textbox)
malist.add(me.textbox1)

mon objet LIST est null au moment de l'appel, il faut bien que ma list se prépare non?
donc
dim malist as NEW list(of textbox)
malist.add(me.textbox1)

ou
dim malist as list(of textbox)
malist = new list(of textbox)
malist.add(me.textbox1)

ou
dim malist as list(of textbox) = new list(of textbox)
malist.add(me.textbox1)


ces 3 derniers codes étant strictement la même chose, juste des manières différentes de les écrire
on a bien notre NEW avant l'ajout


j'espère que çà t'éclaire un peu

(moi qui ne fait pas particulièrement de dotnet çà me fait cogiter aussi )

baisse pas les bras, manque pas grand chose pour que çà fonctionne

ps : pourquoi serialiser toute la classe et pas juste les lignes?
du coup le mot de passe est enregistré en clair...

++

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 29 déc. 2009 à 17:59
3
Merci
si j'ai besoin d'un klaxonne.. j'te bipp


le count passe à 0, du coup j'ai pas fais comme avec un tableau.
Sinon avec une list vide je me suis dis qu'un for i= 0 to -1 risque de ne pas lui plaire ?


ok mais le count renvoie zéro si rien, 3 s'il y en a 3

zero
y'en a pas et tu vas pourtant lire, de 0 à 0 = erreur ; puisque list(0= n'existe pas

trois
tu vas lire de 0 à 3, donc 4 items alors qu'ils ne vont que de 0 à 2

d'où le -1 :
for i  = 1 to x.count
  x.item(i-1)...


là t'es bon, qu'il y en ait 0 ou N

ou le for each (cf plus haut)


bon courage, je verrai ta réponse plus tard dans la soirée
++

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 30 déc. 2009 à 19:50
3
Merci
mouai çà prend forme ^^

par contre manque la notion objet encore et toujours

reprenons un instant le principe de F_OP
cette form sert à remplir une ligne, un enfant...

voici comment j'avais fait l'autre jour
(comprend le principe, tout est renommé puisque j'ai repris de zéro)

affichage de la form =>


    Private Sub Bp_add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_add.Click
        Dim f As New frmOperation
        f.cboType.DataSource = CurrentAccount.Types
        f.cboBudget.DataSource = CurrentAccount.Budgets
        f.ShowDialog()
        If Not f.Canceled Then
            CurrentAccount.Items.Add(f.Operation)
            CurrentAccount.save()
            ListView1.Items.Add(f.Operation.ToListViewItem)
        End If
        f = Nothing
    End Sub




code de la form (pas de test de saisie évidemment)

Public Class frmOperation
    Public Canceled As Boolean = False
    Public Operation As New clsAccountItem

    Private Sub frmOperation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        txtDateOperation.Text = Date.Now.ToString
    End Sub

    Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
        Me.Canceled = True
        Me.Close()
    End Sub

    Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdd.Click
        With Me.Operation
            .DateOperation = CDate(txtDateOperation.Text)
            .TypeOperation = cboType.Text
            .Budget = cboBudget.Text
            .Commentaires = txtComments.Text
            .Credit = Convert.ToDouble(txtCredit.Text)
            .Debit = Convert.ToDouble(txtDebit.Text)
            .Pointage = optPoint1.Checked
            .Mensuel = optMens1.Checked
        End With
        Me.Close()
    End Sub
End Class


tu vois un peu le principe?

dans ce cas l'enfant n'a pas besoin de connaître la classe compte

du coup pas besoin de PUBLIC non plus...
et la form ne renvoie qu'un enfant (ou pas), que l'appelant (frmMain) ajoute alors, enregistre de suite et ajoute "facilement" à la listview

++


[hr]

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de PCPT
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 déc. 2009 à 00:43
0
Merci
salut,

tu peux faire un exemple allégé stp?
(pas le temps de regarder ta source pour voir exactement ce que tu veux)

sur le principe : un tableau peut toujours être redim, mais jamais en PRESERVE s'il a plusieurs dimensions (en gros)

donc toujours dans le principe, tu peux faire un tableau de type, de structure, de classe

et cet "élément" étant alors simplement un élément, plus de souci de redim
te reste qu'à y mettre ce que tu veux, en l'occurrence juste ta 2e dimension

au final tu passes de
t(1,2) = x
à
t(1).item(2)=x

après rien ne t'empêche de faire une classe pour remplacer T qui pourra communiquer avec les différentes dimensions mais là on en revient à ma première phrase ;)

++

[hr]
Commenter la réponse de PCPT
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 22 déc. 2009 à 07:53
0
Merci
Bonjour et merci pour ta lecture.
Voici plus d'info. Le tableau que je cherche à redim (en preserve) vient d'une classe mon_compte, dont voici l'en tête :
Option Explicit On
Option Strict On
Imports System
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
' Imports System.Collections 'pour faire des collections à la place d'un tableau (pour _ligne) à finir

<Serializable()> Public Class Class_fichier_compte

    Private _ligne(,) As String 'les lignes de la listview
    
    Private _Type() As String 'les types de paiments
    Private _budget() As String 'les budgets
       Private _mdp As String 'le mot de passe

Tous ces tableaux sont ensuite sérialisé dans un fichier BIN.
Dans le tableau ligne il existe une colonne qui si elle est true ajoute une nouvelle ligne à ce tableau (échéancier) avant je lisais la class directement et faisait cette ajout dans une listview, puis je rebalancais toutes les lignes de cette listview dans un tableau.
Aujourd'hui je souhaite que tout soit gérer dans la class, donc dés la lecture du tableau, j'aimerai pouvoir y ajouter une lignes. Mias je peux pas, sauf j'imagine avec une collection (comme je le faisait avec la list view)
Ton exemple me parle pas trop, mais c'est que je cherche à faire, pouvoir gerer les items d'un tableau et donc utiliser les collections.
cordialement. @dn
Tiens les balises ne sont pas reconnues ^_____^, zut alors.....
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 22 déc. 2009 à 18:13
0
Merci
Bonsoir, dsl pour l'explication, c'est limpide pour moi, mais en effet pour quelqu'un qui ne trime pas dessus depuis 2 mois cela doit pas être simple
En gros si je pige bien, il faut bien que je fasse une collection plutot qu'un tableau.
une collection de string ou d'une class.
Merci pour ta lecture et tes réponses.
Commenter la réponse de Adn56
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 23 déc. 2009 à 01:26
0
Merci
une collection de string ou d'une class


c'est précisément ce à quoi j'ai répondu non?
une collection de class, donnant accès à 7 propriétés

c'est une idée

il y en a d'autres mais elles dépendent de ton besoin.
et comme en effet je n'ai pas le nez dans ton projet depuis 2 mois..., celle-ci convient
Commenter la réponse de PCPT
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 26 déc. 2009 à 17:31
0
Merci
Salut et bonne fêtes:
Je reviens aprés le repos necessaire en cette période pour avoir un éclaircissement. Il va donc faloir que j'imbrique deux classes. Une qui contient toutes les lignes et qui sera sérialisé, puis une autre qui contient juste le moule d'une ligne avec ses 7 propriétées.
Là j'avoue la puissance du truc, mais je suis bien en peine d'imaginer un exemple de code.
Est ce que je pars bien si fais un truc de ce style ?
<Serializable()> Public Class Class_ligne_compte

    Private _date As date 
'etc... pour les string et boolean avec les get/set qui vont bien
end class
'puis ensuite
    
<Serializable()> Public Class Class_fichier_compte

    Private _ligne() As listof(class_ligne_compte) 'les lignes de la listview
   Private _mdp As String 'le mot de passe
' dans les get/set cela risque de ce compliquer non ?


Merci pour ton attention et bonne année si l'on se revoit pas d'ici là. cordialement ADN
Commenter la réponse de Adn56
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 26 déc. 2009 à 17:52
0
Merci
le fonctionnement étant dit et expliqué, 3ème (et dernière) fois, je ne te donnerai un exemple concret qu'après que tu en aies toi-même donné un, étant le SIMPLIFIé de ton besoin !

si je dois mettre le nez dans ta source je vois d'ici comment çà va se terminer : il va falloir tout reprendre et je n'ai pas le temps pour çà

donc fais un nouveau projet, exemple simple, et je t'aiderai sur cette base

sinon tu as de toute manière tous les éléments en main

bonnes fêtes également
Commenter la réponse de PCPT
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 18:06
0
Merci
Oula, te faches pas je vois pas pourquoi tu imagines devoir décrypter mon code, alors que justement j'ai posté ci-dessus la base de mon nouveau départ ULTRA simplifié (à mon sens). Je voulais juste savoir si je pars bien dans ton idée en faisant cela. Je vais changer les variables pour te faire moins peur si tu veux
Note : Il est hors de question que je demande de refaire tout mon code, c'est pas mon genre. J'aime comprendre et apprendre.
La seul chose c'est que j'ai du mal avec la philosophie object étant automaticien à la base, donc juste me dire si oui ou non j'ai compris l'idée, et peut être me guider pour les get/set de la listof(class_ligne_compte). Le reste je me démerde et si autres problémes je post un nouveau sujet. @+
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 18:26
0
Merci
Cette mise au point faite, voici le code que je prépare dans un nouveau projet, et déja cela coince (normale )

Je commence donc par creer une classe pour les lignes, comme tu me la dit :
Friend Class ligne_compte 'remplacé par public
    Private Shared _Nb As Integer = 0 'nombre d'instance ou nombre de lignes
    Private _date As Date 
    Private _type As String
    Private _budget As String
    Private _commentaire As String
    Private _credit As Double
    Private _debit As Double
    Private _pointage As Boolean
    Private _mensuel As Boolean

    'les propriétées
    Public ReadOnly Property Nb_lignes() As Integer
        Get
            Nb_lignes = _Nb
        End Get
    End Property
    ' je supprime les autres pour pas allourdir le post    
Public Property L_date() As Date
    Public Property L_type() As String
         Public Property L_budget() As String
            Public Property L_commentaire() As String
           Public Property L_credit() As Double
           Public Property L_debit() As Double
            Public Property L_pointage() As Boolean
          Public Property L_mensuel() As Boolean
      
    ' les méthodes
    Sub New()
        _Nb += 1
    End Sub ' ajoute 1 à chaque nouvelle instance
End Class



Voila, aprés je cherche donc à créer une autre class qui contiendra divers chose et surtout la list des lignes générées à partir de la class ligne :
<Serializable()> Public Class Class_fichier_compte
Private _ligne As List(Of ligne_compte)
 Public Property lignes() As List(Of ligne_compte)
        Get
            Return _ligne
        End Get
             Set(ByVal value As List(Of ligne_compte))
            _ligne = value
        End Set
    End Property ' les lignes du comptes

là il est pas content car il me dis que lignes() ne peut pas exposer le type ligne_compte en dehors du projet via class fichier compte, j'ai du faire une boulette de portée ?
Donc je corrige la portée de ma class ligne compte en public et cela marche, tu le vois déja je pige mal pourquoi un friend ne marche pas, alors qu'un public oui

Bref maintenant il faut que je puisse renseigner une ligne et l'ajouter à la list lignes. La suite plus tard (je post cela car je suis sur que cela servira à d'autre..et puis comme cela tu peux facilement critiquer mon code au fur et à mesure, j'éspére que cette façon de faire te conviendra, cordialement @dn
Commenter la réponse de Adn56
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 27 déc. 2009 à 18:43
0
Merci
t'es fait pas je m'énerve pas

pourquoi le FRIEND ne passe pas?
simplement parce que si c'est FRIEND, seul le déclarant peut l'utiliser
si tu as une propriété PUBLIC, tu ne peux pas partager ou faire hériter cette propriété (puisqu'elle n'est, par nature, utilisable que par le déclarant)
donc normal, il faut du PUBLIC

dans ce premier jet certaines choses me gênent :

[i] Public ReadOnly Property Nb_lignes() As Integer
' je supprime les autres pour pas allourdir le post
Public Property L_date() As Date/i

les propriétés commençant par L_ sont-elles aussi en readonly?
(apparemment non mais c'est ta ligne en commentaire qui m'a mis le doute) : évidemment il ne faut pas

et il manque bien sûr une méthode public permettant d'attribuer aux propriétés les valeurs depuis une seule ligne string
cette méthode peut très bien être un 2e constructeur (NEW)


ensuite _NB
en théorie c'est bon, mais si tu dois par la suite supprimer par exemple de l'item 5 à 10 sur 15 lignes existantes, les NB restant ne seront plus dans l'ordre
reste à voir si ces infos te sont utiles
(et je suppose que oui, sinon pourquoi avoir ce membre )


à partir de là, çà me semble correct oui
++
Commenter la réponse de PCPT
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 19:16
0
Merci
Cool ^^
Alors :
Pour le friend j'ai pas tout compris mais bon c'est pas la priorité (je pensais à tord que friend = tout le projet)
Pour les autres propriétées elles sont biensur en lecture/écriture
Pour la le _NB je l'ai placé là au cas ou, mais visiblement il ne me servira pas, de plus j'ai le count de la list qui le remplace.
Pour la méthode public permettant d'attribuer aux propriétés les valeurs depuis une seule ligne string je ne l'ai pas fait, en fait j'exploite le code comme suit (je programme en même temps )
<Serializable()> Public Class Class_fichier_compte
    
    Private _ligne As List(Of ligne_compte)
    Private _mdp As String 'le mot de passe
    Private _Type() As String 'les types de paiments
    Private _budget() As String 'les budgets


    ' Public Property lignes() As String(,)
    Public Property lignes() As List(Of ligne_compte)
        Get
            Return _ligne
        End Get
        'Set(ByVal value As String(,))
        Set(ByVal value As List(Of ligne_compte))
            _ligne = value
        End Set
    End Property ' les lignes du comptes
' aprés je lis le fichier sérialisé comme suit
    Public Function load(ByVal fichier As String) As Boolean

        Try

            Dim myFileStream As Stream = File.OpenRead(fichier)
            Dim deserializer As New BinaryFormatter()
            Dim lecture As New Class_fichier_compte
            lecture = CType(deserializer.Deserialize(myFileStream), Class_fichier_compte)
            myFileStream.Close()

            ' attribut les tableaux à ME.
            Me.mdp = lecture.mdp
            Me.types = lecture.types
            Me.budgets = lecture.budgets
            Me.lignes = lecture.lignes

'ensuite je peux tester mes lignes comme cela :

            'récupére le nombre de ligne initiale (avant mise à jour mensuel) voir si utile
            Dim NB_ligne As Integer = lecture.lignes.Count

            ' trouve le nombre de mise à jours à faire (pas sur que cela serve à grand chose now)
            Dim NB_maj As Integer = 0
            ' recherche le nb de mise à jour à faire
            For ligne As Integer = 0 To NB_ligne
                ' si c'est une ligne échéancier et que la date correspond au début du mois
                ' et que ce mois n'est pas déja rempli (ou alors si c'est une nouvelle année) alors
                If Now.Day >= 1 AndAlso lecture.lignes(ligne).L_mensuel _
                AndAlso (Now.Month > lecture.lignes(ligne).L_date.Month _
                    Or Now.Year > lecture.lignes(ligne).L_date.Year) Then
                    NB_maj += 1
                    ' retire à l'anciénne ligne le status de mensuel
                    lecture.lignes(ligne).L_mensuel = False
                    'attribut la date d'aujourd'hui et le jour de l'opération mensuel
                    Dim maintenant As Date = CDate(lecture.lignes(ligne).L_date.Day & " " & Now.Month & " " & Now.Year)
                    ' ajouter cette nouvelle ligne !
                    Dim new_ligne As New ligne_compte
                    ligne_compte.L_date = maintenant
                    lecture.lignes.AddRange = new_ligne


                End If
            Next



et biensur c'est la que je coince pour le moment, c'est pour ajouter un item à ma list... voila ou j'en suis pour l'interface utilisateur de la classe cela devrait être idem, donc je ne pense pas avoir besoin d'une sub pour avoir toute la ligne sur une string (mais je dois me gourrer puisque tu en parles lol)
content que tu m'aides @++
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 19:30
0
Merci
Et voila, je pense que cela pour ajouter une nouvelle ligne à ma list devrait focntionner, il me souligne en vert la premiére attribution de new_ligne, mais je vois pas ce qui le géne
puisque je lui assigne une valeur avant qu'elle soit utilisé. Bon on verra lors du premier cycle en run
                    ' ajouter cette nouvelle ligne !
                    Dim new_ligne As ligne_compte
                    new_ligne.L_date = CDate(lecture.lignes(ligne).L_date.Day & " " & Now.Month & " " & Now.Year)
                    new_ligne.L_type = lecture.lignes(ligne).L_type
                    new_ligne.L_budget = lecture.lignes(ligne).L_budget
                    new_ligne.L_commentaire = lecture.lignes(ligne).L_commentaire
                    new_ligne.L_credit = lecture.lignes(ligne).L_credit
                    new_ligne.L_debit = lecture.lignes(ligne).L_debit
                    new_ligne.L_pointage = False
                    new_ligne.L_mensuel = True
                    lecture.lignes.Add(new_ligne)


Sans blague je sis tomber amoureux des classes ! grace à vous, et plus paticuliérement à toi je regrette vraiment que cette notion soit inexistante en automatisme !
allez je continu
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 19:32
0
Merci
Tiens cela doit être encore mieux comme ça :
                    ' ajouter cette nouvelle ligne !
                    Dim new_ligne As ligne_compte = lecture.lignes(ligne)
                    new_ligne.L_date = CDate(lecture.lignes(ligne).L_date.Day & " " & Now.Month & " " & Now.Year)
                    ' new_ligne.L_type = lecture.lignes(ligne).L_type
                    ' new_ligne.L_budget = lecture.lignes(ligne).L_budget
                    ' new_ligne.L_commentaire = lecture.lignes(ligne).L_commentaire
                    ' new_ligne.L_credit = lecture.lignes(ligne).L_credit
                    ' new_ligne.L_debit = lecture.lignes(ligne).L_debit
                    new_ligne.L_pointage = False
                    new_ligne.L_mensuel = True
                    lecture.lignes.Add(new_ligne)
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 27 déc. 2009 à 19:44
0
Merci
A ben vla autre chose je peux rien écrire dans le code de la form1
tout et en noir... brrr décidément un probléme chasse l'autre..
bon @+ j'ai ma dose pour ce soir, demain boulot.
Commenter la réponse de Adn56

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.