Códigos Postales
y callejero de capitales

Actualizado el: 06/May/97
Link a la nueva versión (05/May/2001)


Esta utilidad la hice basándome en unos discos que vendía (¿vende?) Correos con los códigos postales de las provincias (y capitales de provincia) de España.
Por tanto, para usarlo de forma "eficiente" deberás comprar los discos que venden en las oficinas de Correos (antes costaban 1000 pesetas, no sé cuanto valdrán ahora...).
En estos discos se incluye una utilidad para manejar esa información, pero realmente a mi no me funcionaba muy bien... realmente no me gustaba cómo estaba hecha...
Así que me decidí a "destripar" el formato en que estaba guardada la información y fabricarme mi utilidad para Windows. La primera versión (por el 93) la hice para el VB3 (¿o era el VB2?, no recuerdo... tampoco importa mucho...) Esta versión debería seguir funcionando en el VB3, pero la compilé con el VB4 de 32 bits. De todas formas como incluyo los listados... pues la compilas cómo mejor te plazca.

El programa en sí es muy simple, por tanto no voy a dar más explicaciones y mostrar el código, una foto del formulario y los más importante:
un link para que te bajes los listados (gscpostal.zip 4.79 KB)
Este otro link es para los archivos con los códigos postales de Málaga y Granada (dirdat.zip 78.2 KB)

¡A disfrutarlo! Y si te gusta y te puede ser de utilidad, me lo dices y yo tan pancho.


La base de todo está en los archivos que se usan para obtener la información, están estructurados de la siguiente forma:
Un archivo Dir.dat con los datos de las provincias que están disponibles
Para cada provincia existe dos archivos: xxPob.dat y xxDir.dat
La xx se sustituirá por el número del código de provincia, por ejemplo Málaga es el 29, Barcelona el 08, Madrid el 28, etc.
El formato de Dir.dat es muy simple: El nombre de la provincia y el código separados por una coma.
En este archivo estarán las provincias que tenemos disponibles, en este ejemplo incluyo sólo las de Málaga y Granada, son las que realmente necesito (ya que en principio lo usamos en mi empresa y sólo trabajamos con datos de estas dos provincias)
Si necesitas alguna provincia en particular... o bien te compras los discos (sólo 1000 pesetillas, no me llevo comisión...) o bien me lo pides y veremos que puedo hacer.

La estructura de los archivos xxPob.dat y xxDir.dat es la misma, pero con un significado diferente en el contenido:
xxPob.dat contiene los nombres de las poblaciones y xxDir.dat el callejero de la capital de provincia.

Ahora pasemos a ver el código del programa, aunque primero una foto del form:

pantalla para los códigos postales

El código:

'
'gsCPostal.bas Declaración de tipos y variables globales
'en VB4 no es necesario usar este módulo ya que se pueden
'declarar los tipos de datos de forma privada en los forms
'
Option Explicit

Type tipoProvDAT                'Para el fichero Prov.DAT
    Prov As String
    miniCP As String
End Type
'----------------------------------------------------------
'NOTA: los ficheros xxPOB.dat (poblaciones)     (19/Abr/94)
'                 y xxDIR.dat (direcciones de la capital),
'tienen la mísma longitud de datos y las mísmas posiciones.
'Por ejemplo el campo "Poblacion":
'   en población hace referencia a la población,
'   en dirección hace referencia a la calle.
'----------------------------------------------------------
Type tipoPobDAT                 'Longitud 83 caracteres
    PrvLen As String * 1
    Provincia As String * 17
    PobLen As String * 1
    Poblacion As String * 58
    CPLen As String * 1
    CPostal As String * 5
End Type

Global Provincia As String
Global HayCP As Integer


Sub AbrirCPfrm()
    'Abrir y mostrar la ventana de Códigos Postales
    'Comprobar si ya está en memoria...
    If HayCP Then
        If CPfrm.WindowState = 0 Then
            CPfrm.WindowState = 1
        Else
            CPfrm.WindowState = 0
        End If
    Else
        CPfrm.Show
    End If

End Sub
'--------------------------------------------------
' gsCPostal Form para los códigos postales
' (c)Guillermo Som Cerezo, 1993-96
'--------------------------------------------------
Option Explicit
Option Compare Text

Dim iniH As Integer
Dim iniW As Integer
Dim lngTmp As Long

Dim Provincias() As tipoProvDAT
Dim numProv As Integer

Dim EsFormLoad As Integer

Dim CPostal As Variant
Dim miniCP As String
Dim Poblacion As String

Dim tCP As tipoPobDAT

Dim nomFicCP As String
Dim nomDirCP As String
Dim numFic As Integer
Dim numRegCP As Integer
Dim lenPOB As Integer

Dim PobODir As Integer
Dim Pob_Dir As String

Dim ClickEnList As Boolean


Function BuscarEnList(oTextB As TextBox, oListB As ListBox) As Integer
    'Actualizar el ListBox, según lo escrito en el TextBox
    'Ver ficha 103 de Notas Guille
    Dim i As Integer, j As Integer
    Dim iHallado As Integer
    Dim sTmp As String

    If ClickEnList Then
        Exit Function
    End If
    If oListB.ListCount Then
        ClickEnList = True
        sTmp = oTextB.Text
        j = Len(sTmp)
        iHallado = 0
        For i = 0 To (oListB.ListCount - 1)
            If StrComp(sTmp, Left$(oListB.List(i), j)) = 0 Then
                iHallado = i + 1
                Exit For
            End If
        Next i
        If iHallado Then
            oListB.TopIndex = iHallado - 1
            oListB.ListIndex = iHallado - 1
        End If
        BuscarEnList = iHallado
        ClickEnList = False
    End If
End Function


Private Sub AbrirProvincia()
    Dim i           As Integer
    Dim Combo1Index As Integer
    Dim sFile       As String
    Dim lTmp        As Long

    'Cambiar el cursor del ratón...
    MousePointer = vbHourglass
    DoEvents

    'Abrir el fichero de datos de la provincia activa...
    sFile = nomDirCP & Provincias(numProv).miniCP & Pob_Dir
    ClickEnList = True
    If Len(Dir$(sFile)) Then
        numFic = FreeFile
        Open sFile For Random As numFic Len = Len(tCP)
        numRegCP = LOF(numFic) \ Len(tCP)
        ListPoblacion.Clear
        ListCodigo.Clear
        TxtCodigo = ""
        TxtPoblacion = ""
        For i = 1 To numRegCP
            Get numFic, i, tCP
            lenPOB = Asc(tCP.PobLen)
            Poblacion = Left$(tCP.Poblacion, lenPOB)
            CPostal = tCP.CPostal
            ListPoblacion.AddItem Poblacion
            ListCodigo.AddItem CPostal
            ListPoblacion.ItemData(ListPoblacion.NewIndex) = i ' ListCodigo.NewIndex
            ListCodigo.ItemData(ListCodigo.NewIndex) = i ' ListPoblacion.NewIndex
        Next i
        Close numFic
    End If
    ClickEnList = False
    If ListCodigo.ListCount > 0 Then
        ListCodigo.ListIndex = 0
    End If
    Caption = "Códigos Postales -" & Provincias(numProv).Prov

    Provincia = Provincias(numProv).Prov
    If PobODir Then
        CmdPobDir.Caption = "Mostrar las Direcciones de " & Provincia
    Else
        CmdPobDir.Caption = "Mostrar las Poblaciones de " & Provincia
    End If
    MousePointer = vbDefault
End Sub


Private Sub Combo1_Click()
    'Seleccionar la provincia
    If Not EsFormLoad Then
        numProv = Combo1.ListIndex + 1
        AbrirProvincia
    End If
End Sub


Private Sub Combo1_Change()
    If Not EsFormLoad Then
        numProv = Combo1.ListIndex + 1
    End If
End Sub


Private Sub CmdCerrar_Click()
    Unload Me
End Sub


Private Sub CmdPobDir_Click()
    '------------------------------------------------------
    'Poder seleccionar ente Poblaciones o Direcciones
    '                                           (25/May/94)
    '------------------------------------------------------
    PobODir = Not PobODir
    If PobODir Then
        Pob_Dir = "POB.DAT"
    Else
        Pob_Dir = "DIR.DAT"
    End If
    AbrirProvincia
End Sub


Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyF3 Then
        Unload Me
    End If
End Sub


Private Sub Form_Load()
    'Abrir el fichero de provincias
    Dim i As Integer
    Dim ProvinciaDat As String

    'Sólo una copia cada vez
    If App.PrevInstance Then
        End
    End If
    iniH = Height
    iniW = Width
    'Posicionar la ventana
    Top = GetSetting("CPostal.ini", "Posiciones", "Top", Top)
    Left = GetSetting("CPostal.ini", "Posiciones", "Left", Left)
    Provincia = GetSetting("CPostal.ini", "General", "Provincia", Provincia)
    If Provincia = "" Then
        Provincia = "MALAGA"
    End If
    PobODir = True
    Pob_Dir = "POB.DAT"
    '
    'Buscar el fichero PROV.DAT en este orden:
    'primero: en el directorio C:\CP
    'segundo: en el de la aplicación
    'tercero: en el directorio actual
    '
    nomFicCP = "C:\CP\PROV.DAT"
    nomDirCP = "C:\CP\"
    i = 0
    Do
        If Len(Dir$(nomFicCP)) = 0 Then
            If i = 0 Then
                i = i + 1
                nomFicCP = App.Path & "\PROV.DAT"
                nomDirCP = App.Path & "\"
            ElseIf i = 1 Then
                i = 2
                nomFicCP = "PROV.DAT"
                nomDirCP = ""
            Else
                Beep
                MsgBox "No he hallado el fichero de PROVINCIAS (PROV.DAT)," & vbCrLf & vbCrLf & "Este archivo debe estar en una de estas localizaciones:" & vbCrLf & "   El directorio C:\CP," & vbCrLf & "   El directorio del programa " & App.Path & "," & vbCrLf & "   El directorio actual." & vbCrLf & vbCrLf & "Programa Terminado.", vbCritical, "Código Postal"
                End
            End If
        Else
            Exit Do
        End If
    Loop

    numProv = 0
    numFic = FreeFile
    Open nomFicCP For Input As numFic
    Do While Not EOF(numFic)
        Input #numFic, ProvinciaDat
        Input #numFic, miniCP
        ProvinciaDat = Trim$(ProvinciaDat)
        numProv = numProv + 1
        'Reservar memoria...
        ReDim Preserve Provincias(numProv) As tipoProvDAT
        Provincias(numProv).Prov = ProvinciaDat
        Provincias(numProv).miniCP = Left$(Trim$(miniCP), 2)
        Combo1.AddItem ProvinciaDat
        Combo1.ItemData(Combo1.NewIndex) = Val(miniCP)
    Loop
    Close numFic
    EsFormLoad = True
    Combo1.ListIndex = 0
    If Provincia <> "" Then
        For i = 1 To numProv
            If Provincia = Provincias(i).Prov Then
                Combo1.ListIndex = i - 1
                Exit For
            End If
        Next
    End If
    numProv = Combo1.ListIndex + 1
    AbrirProvincia
    HayCP = True
    EsFormLoad = False
End Sub


Private Sub Form_Resize()
    If WindowState <> vbMinimized Then
        Height = iniH
        Width = iniW
    End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
    SaveSetting "CPostal.ini", "Posiciones", "Top", Top
    SaveSetting "CPostal.ini", "Posiciones", "Left", Left
    SaveSetting "CPostal.ini", "General", "Provincia", Provincia
    Set CPfrm = Nothing
End Sub


Private Sub ListPoblacion_Click()
    'Conectar los ListBoxs
    ListCodigo.ListIndex = ConectarLists(ListPoblacion.ItemData(ListPoblacion.ListIndex), ListCodigo)
    ListPoblacion.TopIndex = ListPoblacion.ListIndex
    ListCodigo.TopIndex = ListCodigo.ListIndex

    If ClickEnList Then Exit Sub

    ClickEnList = True
    TxtPoblacion.Text = ListPoblacion.Text
    TxtCodigo.Text = ListCodigo.Text
    ClickEnList = False
End Sub


Private Sub ListCodigo_Click()
    'Conectar los ListBoxs
    ListPoblacion.ListIndex = ConectarLists(ListCodigo.ItemData(ListCodigo.ListIndex), ListPoblacion)
    ListPoblacion.TopIndex = ListPoblacion.ListIndex
    ListCodigo.TopIndex = ListCodigo.ListIndex

    If ClickEnList Then Exit Sub

    ClickEnList = True
    TxtPoblacion.Text = ListPoblacion.Text
    TxtCodigo.Text = ListCodigo.Text
    ClickEnList = False
End Sub


Private Sub TxtCodigo_Change()
    lngTmp = BuscarEnList(TxtCodigo, ListCodigo)
End Sub


Private Sub TxtCodigo_GotFocus()
    TxtCodigo.SelStart = 0
    TxtCodigo.SelLength = Len(TxtCodigo.Text)
End Sub


Private Sub TxtCodigo_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        If BuscarEnList(TxtCodigo, ListCodigo) Then
            TxtCodigo = ListCodigo.Text
            TxtPoblacion = ListPoblacion.Text
        End If
        KeyAscii = 0
        TxtCodigo_GotFocus
    End If
End Sub


Private Sub TxtPoblacion_Change()
    lngTmp = BuscarEnList(TxtPoblacion, ListPoblacion)
End Sub


Private Sub TxtPoblacion_GotFocus()
    TxtPoblacion.SelStart = 0
    TxtPoblacion.SelLength = Len(TxtPoblacion.Text)
End Sub


Private Sub TxtPoblacion_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        If BuscarEnList(TxtPoblacion, ListPoblacion) Then
            TxtCodigo = ListCodigo.Text
            TxtPoblacion = ListPoblacion.Text
        End If
        KeyAscii = 0
        TxtPoblacion_GotFocus
    End If
End Sub


Private Function ConectarLists(queItem As Integer, oListB As ListBox) As Integer
    Dim i As Integer
    Dim iHallado As Integer

    iHallado = 0
    For i = 0 To oListB.ListCount - 1
        If oListB.ItemData(i) = queItem Then
            iHallado = i
            Exit For
        End If
    Next
    ConectarLists = iHallado
End Function

ir al índice