Старые функции EOF
, FileClose
, Input
и т. Д. Являются наследием старого, старого VB (например, оригинального VB) - я не рекомендую использовать их сегодня.
Я думаю, что ваш код хочет прочитать файл построчно, а затем нарисовать строку после прочтения каждой входной строки.Ваш код не должен этого делать, потому что вы смешиваете проблемы (ввод-вывод файла и рисование на экране).Это также означает, что вашему приложению нужно будет перечитывать файл каждый раз, когда ему нужно перекрасить карту (при условии, что вы рисуете непосредственно в окно, а не на Bitmap
поверхности).
Я предлагаю вам сначаласчитайте файл в память (т. е. в ОЗУ, переменные программы) как объект List(Of T)
, а затем раскрасьте карту.
Сначала вам нужно определить пользовательские сложные (не скалярные) данные.тип, называемый Structure
, который представляет каждую запись в файле - в этом случае каждая запись представляет собой кортеж широты и долготы, представленный в виде точных десятичных чисел (не неточных чисел с плавающей запятой), поэтому вы должны использовать Decimal
вместо Single
или Double
(поскольку Decimal
является точным типом, Single
и Double
не являются).
Public Structure LatLong
Public Lat As Decimal
Public Lng As Decimal
End Structure
Тогда нам нужно прочитать это. Как я уже говорил ранее, яне рекомендуется использовать старый файловый IO API, вместо этого вы должны использовать FileStream
и StreamReader
, например:
Dim list As New List(Of LatLong)
Using fs As New FileStream( "coastline.dat", FileMode.Open, FileAccess.Read )
Using reader As New StreamReader( fs )
Dim line As String
Do
line = reader.ReadLine();
If line = Nothing Then
Exit Do
End If
If line.StartsWith("#") Or String.IsNullOrWhiteSpace( line ) Then
Continue
End If
Dim fields() As String
fields = line.Split( Nothing, StringSplitOptions.RemoveEmptyEntries )
If fields.Length = 2 Then
Dim lat As Decimal
Dim lng As Decimal
If Decimal.TryParse( fields(0), lat ) AndAlso Decimal.TryParse( fields(1), lng ) Then
Dim ll As New LatLong
ll.Lat = lat
ll.Lng = lng
list.Add( ll )
End If
End If
Loop
End Using
End Using
' Then paint them (put this in a separate function):
For i As Integer = 0 To list.Count - 2
Dim ll0, ll1 As LatLong
ll0 = list(i)
ll1 = list(i + 1)
Dim x0, x1, y0, y1 As Integer
x0 = ( ( ll0.Lng + 180 ) * Me.Width ) / 360
y0 = ( ( 90 - ll0.Lat ) * Me.Height ) / 180
x1 = ( ( ll1.Lng + 180 ) * Me.Width ) / 360
y1 = ( ( 90 - ll1.Lat ) * Me.Height ) / 180
map.DrawLine( pen1, x0, y0, x1, y1 )
Next