Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con una Rubrica Telefonica, chi mi aiuta?

Ciao a tutti, sono un neofita di Visual Basic 5 e sto creando una
semplice Rubrica telefonica con i seguenti campi (uso 3 listbox):
- Nome e Cognome
- Indirizzo
- Numero Telefonico.
Il problema principale è che quando inserisco i dati nei vari campi
questi mi risultano sfalsati !!!!
Cioè al nome di uno mi corrisponde il cognome di un altro, ecc.....
Mi hanno detto di usare la proprietà listindex o di fare una matrice di
controlli per le listbox ma non ho capito bene la cosa.....
Potreste aiutarmi a far corrispondere al relativo nome il relativo indirizzo
e numero
di telefono senza che risultino sfalsati nelle 3 listbox ?????
Poi una volta fatto questo dovrei salvare il tutto in un file nella
directory di installazione
del programma (magari un file .RUB o roba del genere.....).
Infine mi deve essere anche possibile aprire il file salvato
precedentemente per visualizzare tutti i dati nei rispettivi campi
ogni volta che apro il programma.....
Ci sto lavorando da qualche settimana ma non sono ancora
riuscito a risolvere questi problemi, nessuno mi vuole aiutare. :-(((((
Se qualcuno mi potesse aiutare gliene sarei veramente grato!!!!
Sono gradite anche risposte per e-mail : 
c...@mailandnews.com
Scusate il disturbo e grazie per un eventuale aiuto.
Ciao! by CDR.


O_O;; io ci ho messo mezz'ora a farlo ^_^;;;
Cmq se vuoi anche l'indirizzo, basta aggiungere:
1) Un nuovo ColumnHeader
2) Una nuova property alla classe persone
3) Modificare le funzioni
Ti riposto il messaggio precedente modificato.
################################################
Supponiamo che hai il seguente Form. Nella parte superiore, tre TextBox
(txtNome, txtNumero e txtIndirizzo) e due CommadButton (cmdAdd e cmdDel).
Mentre il resto
del form è occupato da una ListView (lstPersone).
La proprietà Text dei tre TextBox è inizialmente a vbNullString (campo
vuoto) e la proprietà MaxLengh di txtIndirizzo è 250.
La proprietà View della ListView è su lswReport. Ci sono 3 ColumnHeader,
indicizzate 1, 2 e 3, la cui proprietà Text è, rispettivamente, Nome
Indirizzo e
Telefono. La proprietà Sorted è su True.
Se non ti piace, sta a te cambiare il disegno ^_^;;
Ora.. il problema è come organizzare la struttura dei dati. Il metodo più
semplice è creare una classe "persona" con le property nome e telefono
(questo perché le collection di VB non accettano gli UDP) e mettere le
diverse persone in una collection. In altre parole facciamo una collection
collPersone di oggetti persona. Ciascun oggetto persona avrà le tre
proprietà nome indirizzo e telefono.
Crea quindi un nuovo modulo di classe e chiamalo come ti pare. Inserisci
dentro a questo il seguente codice:
___________________________________________
Option Explicit
Private m_nome As String
Private m_telefono As String
Private m_indirizzo As String
Public Property Get Nome() As Variant
    Nome = m_nome
End Property
Public Property Let Nome(ByVal vNewValue As Variant)
    m_nome = vNewValue
End Property
Public Property Get Telefono() As Variant
    Telefono = m_telefono
End Property
Public Property Let Telefono(ByVal vNewValue As Variant)
    m_telefono = vNewValue
End Property
Public Property Get Indirizzo() As Variant
    Indirizzo = m_indirizzo
End Property
Public Property Let Indirizzo(ByVal vNewValue As Variant)
    m_indirizzo = vNewValue
End Property
____________________________________________
Nella form, invece, inserisci il seguente codice:
____________________________________________
Option Explicit
Private Type FileHeader
     tipo As String * 4
     versione As String * 4
     size As Long
     Reserved1 As Long
     Reserved2 As Long
     Reserved3 As Long
     Reserved4 As Long
     sezioni As Long
End Type
Public collPersone As New Collection
Private Sub cmdAdd_Click()
    Dim Nome As String
    Dim Telefono As String
    Dim Indirizzo As String
    Dim persona As New persona
    Nome = Trim(txtNome.Text)
    Telefono = Trim(txtNumero.Text)
    Indirizzo = Trim(txtIndirizzo.Text)
    txtNome.Text = vbNullString
    txtNumero.Text = vbNullString
    txtIndirizzo = vbNullString
    If Nome = vbNullString Or Telefono = vbNullString Or Indirizzo =
vbNullString Then
        MsgBox "Inserire tutti i paramentri correttamente", vbExclamation
        Exit Sub
    End If
    persona.Nome = Nome
    persona.Telefono = Telefono
    persona.Indirizzo = Indirizzo
    collPersone.Add persona
    salva
    listRefresh "n" & collPersone.Count
End Sub
Public Sub listRefresh(ultimo As String)
    Dim lstItem As New ListItem
    Dim conta As Long
    lstPersone.ListItems.Clear
    If collPersone.Count <> 0 Then
        For conta = 1 To collPersone.Count
            Set lstItem = lstPersone.ListItems.Add(, "n" & conta,
collPersone(conta).Nome)
            lstItem.SubItems(1) = collPersone(conta).Indirizzo
            lstItem.SubItems(2) = collPersone(conta).Telefono
        Next
        lstPersone.ListItems(ultimo).Selected = True
        lstPersone.SetFocus
    End If
    If collPersone.Count = 0 Then
        cmdDel.Enabled = False
    Else
        cmdDel.Enabled = True
    End If
    Set lstItem = Nothing
End Sub
Private Sub cmdDel_Click()
    Dim keyPersona As String
    Dim indicePersona As Long
    keyPersona = lstPersone.SelectedItem.Key
    indicePersona = Val(Mid(keyPersona, 2))
    collPersone.Remove indicePersona
    salva
    If indicePersona = collPersone.Count + 1 Then indicePersona =
indicePersona - 1
    listRefresh "n" & indicePersona
End Sub
Public Sub salva()
    Dim file As Integer
    Dim temp As String * 255
    Dim oggetto As New persona
    Dim header As FileHeader
    If Len(Dir$(App.Path & "\persone.dat")) <> 0 Then Kill (App.Path &
"\persone.dat")
    file = FreeFile
    header.tipo = "PPPP"
    header.versione = "0000"
    header.sezioni = collPersone.Count
    Open App.Path & "\persone.dat" For Binary As #file
        Put #file, 1, header
        For Each oggetto In collPersone
            temp = oggetto.Nome
            Put #file, , temp
            temp = oggetto.Indirizzo
            Put #file, , temp
            temp = oggetto.Telefono
            Put #file, , temp
        Next
        header.size = LOF(file)
        Put #file, 1, header
    Close #file
    Set oggetto = Nothing
End Sub
Public Sub leggi()
    Dim file As Integer, conta As Integer
    Dim temp As String * 255
    Dim oggetto As New persona
    Dim header As FileHeader
    If Len(Dir$(App.Path & "\persone.dat")) = 0 Then Exit Sub
    file = FreeFile
    Open App.Path & "\persone.dat" For Binary As #file
        Get #file, 1, header
        If header.size <> LOF(file) Then
            MsgBox "L'rchivio è danneggiato", vbCritical
            Close #file
            Kill (App.Path & "\persone.dat")
            Exit Sub
        End If
        If header.tipo <> "PPPP" Then
            MsgBox "Formato di file sconosciuto", vbCritical
            Close #file
            Kill (App.Path & "\persone.dat")
            Exit Sub
        End If
        For conta = 1 To header.sezioni
            Get #file, , temp
            oggetto.Nome = Trim(temp)
            Get #file, , temp
            oggetto.Indirizzo = Trim(temp)
            Get #file, , temp
            oggetto.Telefono = Trim(temp)
            collPersone.Add oggetto
            Set oggetto = Nothing
            Set oggetto = New persona
        Next
    Close #file
End Sub
Private Sub Form_Activate()
listRefresh "n1"
End Sub
Private Sub Form_Load()
    Caption = "Rubrica telefonica"
    leggi
End Sub
_____________________________________________
################################################

...
D'accordo che a te piace il C, ma perchè utilizzare una classe (pesante)
anzichè una semplice struttura e un array di queste strutture?
C'è un motivo?
Poi un'altra cosa che ancora non ho capito è la convenzione di usare la m_
davanti al nome privato delle proprietà.
Che significa? Io ho deciso di usare una p_...
Ciao.


m_ sta per membro. m_variabile è una variabile membro.
Ciao


Cosa significhi non saprei... potrebbe essere espressione del senso di
onnipotenza di Microsoft (nome che, guarda caso, inizia per M :-)
Per la cronaca anch'io tendenzialmente uso p_, quindi siamo gia' in due!
--
Roal Zanazzi
z...@iol.it

Per la cronaca anch'io tendenzialmente uso p_, quindi siamo gia' in due!
L'ho sempre detto io che Roal č un grande, e non perchč usa la p_, ma perchč
lo fa ANCHE lui :)
Ciao.


Infatti, quello che ho usato è il metodo più scemo per usare le classi.
Sarebbe stato opportuno creare una classe Rubrica con una collection Persone
di classi Persona, come metodi Aggiungi, Rimuovi, Modifica, Conta, etc...
cioè una classe di insiemi.
Ciao