/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Genindlæse tekst-fil automatisk
Fra : Tyge


Dato : 24-08-03 20:46

Jeg har lavet en navigations display til sejlere, hvor man kan indlæse en
kystlinie fra en tekstfil, afhængig af hvor man sejler. Når skibet flytter
sig skal navigationsskærmen opdateres og tekstfilen genindlæses. Hvordan
laver jeg denne genindlæsning automatisk ?



 
 
Robert (29-08-2003)
Kommentar
Fra : Robert


Dato : 29-08-03 08:42

> Hvordan
> laver jeg denne genindlæsning automatisk ?

http://www.mvps.org/vbnet/index.html?code/shell/shchangenotify.htm

Robert



Kasper Bo Larsen (29-08-2003)
Kommentar
Fra : Kasper Bo Larsen


Dato : 29-08-03 17:28

"Tyge" <skrammelpost@hotmail.com> wrote in message news:<3f491405$0$24719$edfadb0f@dread14.news.tele.dk>...
> Jeg har lavet en navigations display til sejlere, hvor man kan indlæse en
> kystlinie fra en tekstfil, afhængig af hvor man sejler. Når skibet flytter
> sig skal navigationsskærmen opdateres og tekstfilen genindlæses. Hvordan
> laver jeg denne genindlæsning automatisk ?

Spændende projekt ! Hvordan definerer du kysten, et array af
positioner ? Hvis du har positionerne fra forskellige søkort skal du
huske at tage højde for at de kan have forskellige udgangspunkter (
datum ).

Mhv

Kasper

Finn (29-08-2003)
Kommentar
Fra : Finn


Dato : 29-08-03 21:16

Ja, kysten er en kommasepareret fil ( x,y).

Jeg har fundet ud af at jeg skal lave et dynamic array der først afgør hvor
mange positioner filen indeholder og derefter læser filen ind i et array og
så til sidst plotter den:

Det landmålingstekniske har jeg styr på, men jeg kan ikke rigtigt få
syntaksen til at spille,,,,måske kan du se hvad jeg gør forkert ?

'I et Bas-modul har jeg skrevet Global aCoast () as single

Private Sub mnuOptionLoadDisp_Click()
Dim XY As Integer
Dim Filename As String
Dim FileNo As Integer
Dim I As Integer

CmdDisp.Filename = "*.dis"
CmdDisp.Filter = "Display line files|*.dis|All files|*.*"
CmdDisp.ShowOpen
Filename = CmdDisp.Filename
If Len(Filename) > 0 Then
Screen.MousePointer = 11
FileNo = FreeFile
ReDim aCoast(XY - 1, 1)
Open Filename For Input As #FileNo
Seek #FileNo, 1
Do While Not EOF(FileNo)
Input #FileNo, aCoast(XY, 0), aCoast(XY, 1)
XY = XY + 1
Loop
Close FileNo
End If

If UBound(aCoast) > 0 Then
FrmMap.PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
For I = 1 To UBound(aCoast)
FrmMap.PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
Next I
End If
End sub

Programmet giver mig Run-time error 9, Sub-script out of range ??

"Kasper Bo Larsen" <kb_larsen@hotmail.com> skrev i en meddelelse
news:acd662de.0308290827.60e1c604@posting.google.com...
> "Tyge" <skrammelpost@hotmail.com> wrote in message
news:<3f491405$0$24719$edfadb0f@dread14.news.tele.dk>...
> > Jeg har lavet en navigations display til sejlere, hvor man kan indlæse
en
> > kystlinie fra en tekstfil, afhængig af hvor man sejler. Når skibet
flytter
> > sig skal navigationsskærmen opdateres og tekstfilen genindlæses. Hvordan
> > laver jeg denne genindlæsning automatisk ?
>
> Spændende projekt ! Hvordan definerer du kysten, et array af
> positioner ? Hvis du har positionerne fra forskellige søkort skal du
> huske at tage højde for at de kan have forskellige udgangspunkter (
> datum ).
>
> Mhv
>
> Kasper



Tomas Christiansen (29-08-2003)
Kommentar
Fra : Tomas Christiansen


Dato : 29-08-03 22:22

Finn skrev:
> 'I et Bas-modul har jeg skrevet Global aCoast () as single

"Global" er et levn fra gamle dage. Du bør bruge "Public", som har samme
betydning.

> Private Sub mnuOptionLoadDisp_Click()
> Dim XY As Integer

Er du sikker på at du ikke kommer over 32767 punkter? Brug dog en Long i
stedet! Den er ikke langsommere at bruge, og fylder det samme, når den ikke
ligger i en record eller i en tabel.

> Dim Filename As String
> Dim FileNo As Integer
> Dim I As Integer

Samme argument med Integer versus Long (anbefaling: brug kun Integer, hvor
det _virkelig_ er nødvendigt).

> CmdDisp.Filename = "*.dis"
> CmdDisp.Filter = "Display line files|*.dis|All files|*.*"
> CmdDisp.ShowOpen
> Filename = CmdDisp.Filename
> If Len(Filename) > 0 Then
> Screen.MousePointer = 11

Brug vbHourglass i stedet for 11. Så kan du også om 2 år huske hvad der
menes.

> FileNo = FreeFile
> ReDim aCoast(XY - 1, 1)

Du starter ikke med at give XY en værdi, og så har den pr. default værdien
0.
XY minus 1 giver altså -1, og negative indeksværdier er altså ikke tilladt!

Husk, at du jo skal beregne størrelsen på forhånd (det skrev du selv)!

Dvs. ReDim aCoast(0 To BeregnetMaksStørrelse, 0 To 1)

> Open Filename For Input As #FileNo
> Seek #FileNo, 1

Hvad er idéen med at Seek'e til starten af filen - dér er du allerede, når
filen lige er blevet åbnet!

> Do While Not EOF(FileNo)

Kan skrives lidt kortere (smagssag): Do Until EOF(FileNo)

> Input #FileNo, aCoast(XY, 0), aCoast(XY, 1)
> XY = XY + 1
> Loop
> Close FileNo
> End If
>
> If UBound(aCoast) > 0 Then
> FrmMap.PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
> For I = 1 To UBound(aCoast)
> FrmMap.PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
> Next I
> End If
> End sub

Lidt indrykning gør koden MEGET lettere at læse!

> Programmet giver mig Run-time error 9, Sub-script out of range ??

Det går vel ned i din ReDim p.gr.a. at XY har værdien 0.

-------
Tomas


Tyge (30-08-2003)
Kommentar
Fra : Tyge


Dato : 30-08-03 14:24

Hej igen,

Nu har jeg lavet lidt småændringer og sat XY=1. Jeg får stadig den samme
fejl, men den kommer nu
i "input" linien.
Du skriver at jeg skal beregne størrelsen på forhånd,,,,finder jeg ikke
størrelsen på mit array i Do Until Loopet ????

'I bas-modulet står Public aCoast () as single

Private Sub mnuOptionLoadDisp_Click()
Dim XY As Long
Dim Filename As String
Dim FileNo As Integer
Dim I As Long
XY = 1
CmdDisp.Filename = "*.dis"
CmdDisp.Filter = "Display line files|*.dis|All files|*.*"
CmdDisp.ShowOpen
Filename = CmdDisp.Filename
If Len(Filename) > 0 Then
Screen.MousePointer = vbHourglass
FileNo = FreeFile
ReDim aCoast(XY - 1, 1)
Open Filename For Input As #FileNo
'Seek #FileNo, 1
Do Until EOF(FileNo)
Input #FileNo, aCoast(XY, 0), aCoast(XY, 1)
XY = XY + 1
Loop
Close FileNo
End If



Tomas Christiansen (31-08-2003)
Kommentar
Fra : Tomas Christiansen


Dato : 31-08-03 01:29

Tyge skrev:
> Nu har jeg lavet lidt småændringer og sat XY=1. Jeg får stadig den samme
> fejl, men den kommer nu i "input" linien.
> Du skriver at jeg skal beregne størrelsen på forhånd,,,,finder jeg ikke
> størrelsen på mit array i Do Until Loopet ????

Du skrev altså lidt tidligere i tråden "Jeg har fundet ud af at jeg skal
lave et dynamic array der først afgør hvor
mange positioner filen indeholder og derefter læser filen ind i et array og
så til sidst plotter den".

Hvordan skal jeg tolke det anerledes end at du "på forhånd" finder ud af
hvor stor din tabel skal være, og _derefter_ indlæser filen i den
præ-allokerede tabel?

Jeg har undret mig over _hvordan_ du ville bestemme størrelsen, men metoden
til at gøre dette kunne jo være en "forretningshemmelighed".

> XY = 1
> ReDim aCoast(XY - 1, 1)

Ja, dvs. at du opretter en tabel hvor kun indeks 0 eksisterer. Du kan IKKE
lægge noget ind i indeks -1, 1 eller 127, idet du eksplicit har fortalt VB
at KUN indeks 0 må og kan eksistere i tabellen. Heldigvis findes der en
måde, hvormed man kan _udvide_ en tabel. Metoden hedder ReDim Preserve.

Hvis man undervejs finder ud af at man f.eks. har brug for at udvide
tabellen med yderligere 5 elementer (og det oprindelige indhol ønskes
_bevaret_), kan det gøres således:

ReDim Preserve Tabel(UBound(Tabel) + 5)

Uheldigvis kan man kun udvide _den sidste_ dimension (den som står længst
til højøre), og du kan derfor ikke undervjes udvide aCoast som du ønsker
(med mindre du bytter om på betydningen af du to dimensioner).


> XY = XY + 1

Allerede her en den gal. Nu har XY en værdi større end 1, som er den højest
tillade indek-værdu jævnfør din ReDim.

Du kunne måske med fordel kigge på Collection objektet (alternativt
Dictionary). Her skal du ikke tænke på maks-størrelser, med blot tilføje når
det er nødvendigt.

-------
Tomas


Tyge (31-08-2003)
Kommentar
Fra : Tyge


Dato : 31-08-03 14:00

Så, nu virker det,,,tak for hjælpen.

mvh. Tyge

,I bas-modulet står Public aCoast () as single

Private Sub mnuOptionLoadDisp_Click()
Dim XY As Long
Dim Filename As String
Dim FileNo As Long
Dim I As Long
Dim Count As Long, Coordinates As Long
XY = 1
On Error GoTo Missingchoice
CmdDisp.Filename = "*.dis"
CmdDisp.Filter = "Display line files|*.dis|All files|*.*"
CmdDisp.ShowOpen
Filename = CmdDisp.Filename
If Len(Filename) > 0 Then
Screen.MousePointer = vbHourglass
FileNo = FreeFile
Open Filename For Input As #FileNo
Do Until EOF(FileNo)
Input #FileNo, Count, Coordinates
XY = XY + 1
'Debug.Print Count, Coordinates, XY
Loop
Seek #FileNo, 1
ReDim aCoast(XY - 1, 1)
For I = 1 To XY - 1
Input #FileNo, aCoast(I, 0), aCoast(I, 1)
Next I
Close FileNo
End If

If UBound(aCoast) > 0 Then
FrmMap.PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
For I = 1 To UBound(aCoast)
FrmMap.PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
Next I
End If
Screen.MousePointer = 0

Exit Sub

Missingchoice: Screen.MousePointer = 0
MsgBox "You didn´t choose a displayline file"

End Sub



Tomas Christiansen (31-08-2003)
Kommentar
Fra : Tomas Christiansen


Dato : 31-08-03 20:35

Tyge skrev:
> Så, nu virker det,,,tak for hjælpen.

Det lyder fint, din metode er dog ikke helt optimal - rent
performance-mæssigt set. Du indlæser jo filen hele to gange - først for at
bestemme størrelsen og dernæst for at registrere indholdet.

Hvis du vil optimere lidt, kan du f.eks. kigge på filens størrelse, og
derefte udregne hvor mange koordinater som filen så må indeholde, dvs. noget
i retning af:

Open Filename For Input As #FileNo
XY = LOF(FileNo) \ 4
ReDim aCoast(XY, 1)
For I = 1 To XY
Input #FileNo, aCoast(I, 0), aCoast(I, 1)
Next I
Close FileNo

Det kan næsten ikke være nemmere - og så går det dobbelt så hurtigt!

Bemærk at det ikke er sikkert at konstanten ved udregningen af XY skal være
4 - det er blot et eksempel. Prøv at gemme et kendt antal koordinater i en
file og check derefter filens størrelse. Så er det let at udregne hvor mange
bytes hver koordinatsæt fylder.

-------
Tomas


Tyge (31-08-2003)
Kommentar
Fra : Tyge


Dato : 31-08-03 21:02


>
> Open Filename For Input As #FileNo
> XY = LOF(FileNo) \ 4
> ReDim aCoast(XY, 1)
> For I = 1 To XY
> Input #FileNo, aCoast(I, 0), aCoast(I, 1)
> Next I
> Close FileNo
>
> Det kan næsten ikke være nemmere - og så går det dobbelt så hurtigt!

Ja, det var lidt smart. Jeg har også tænkt på at man jo som første linie i
filen, med tal, kunne angive hvor mange koordinatsæt den indeholder, men det
gør jo slutproduktet lidt mindre brugervenligt.

Jeg er i øvrigt løbet ind i et andet problem. Når jeg nu opdatere min skærm,
så gøres det med CLS og herefter gentegnes skibet og koordinatlinierne,,,og
så var det meningen at kystlinien også skulle gentegnes. Jeg har tilføjet
den del af koden der tegner kystlinien til koden i den form(en MDIchild
form. Den tidligere omtalte kode var skrevet i MDIparent formen) hvorpå
kysten tegnes:

PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
For I = 1 To UBound(aCoast)
PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
Next I

Jeg får igen Run-time error 9.

Jeg er jo startet med at definere 'Public aCoast as Single' i bas-modulet,
så hvorfor kan jeg nu ikke kalde den i hvilken som helst form,,,eller er det
ikke det der er problemet??

mvh. Tyge



Tomas Christiansen (31-08-2003)
Kommentar
Fra : Tomas Christiansen


Dato : 31-08-03 21:15

Tyge skrev:
> PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
> For I = 1 To UBound(aCoast)
> PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
> Next I
>
> Jeg får igen Run-time error 9.

HVOR kommer der en fejl 9? Præcis i hvilken linie?

-------
Tomas


Tyge (01-09-2003)
Kommentar
Fra : Tyge


Dato : 01-09-03 07:05


"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:bitkqj$e16$1@news.cybercity.dk...
> Tyge skrev:
> > PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
> > For I = 1 To UBound(aCoast)
> > PicMap.Line -(aCoast(I, 0), aCoast(I, 1)), vbBlack
> > Next I
> >
> > Jeg får igen Run-time error 9.
>
> HVOR kommer der en fejl 9? Præcis i hvilken linie?


Ja, hovsa. Den kommer i første linie i det ovenstående.

mvh. Tyge



Tomas Christiansen (01-09-2003)
Kommentar
Fra : Tomas Christiansen


Dato : 01-09-03 08:11

Tyge skrev:
> > > PicMap.PSet (aCoast(0, 0), aCoast(0, 1)), vbBlack
> Ja, hovsa. Den kommer i første linie i det ovenstående.

Tjaaa... Du starter med at indlæse data i indeks 1 - og _ikke_ indeks 0 - i
aCoast.

Dvs. at der i aCoast(0, 0) og i aCoast(0, 1) altid vil stå 0 (nul).

-------
Tomas


Kasper Bo Larsen (31-08-2003)
Kommentar
Fra : Kasper Bo Larsen


Dato : 31-08-03 07:10

"Tyge" <skrammelpost@hotmail.com> wrote in message news:<3f491405$0$24719$edfadb0f@dread14.news.tele.dk>...
> Jeg har lavet en navigations display til sejlere, hvor man kan indlæse en
> kystlinie fra en tekstfil, afhængig af hvor man sejler. Når skibet flytter
> sig skal navigationsskærmen opdateres og tekstfilen genindlæses. Hvordan
> laver jeg denne genindlæsning automatisk ?

Hvis det hele tiden er den samme tekstfil der indlæses kan jeg altså
ikke se formålet, med mindre du gør det for at sløve programmet ??
Ønsker du et display a la stabiliseret head-up som fra radar'en eller
North-up som kendt fra gyrostabiliserende radar/ARPA og søkort ??

Tyge (31-08-2003)
Kommentar
Fra : Tyge


Dato : 31-08-03 14:02

Det er et helmsmans display.

Der kan zoomes ind og ud og når skibet flytter sig langs kysten bliver det
nødvendigt at gentegne billedet hvergang skibet gentegnes.


"Kasper Bo Larsen" <kb_larsen@hotmail.com> skrev i en meddelelse
news:acd662de.0308302210.5e432c93@posting.google.com...
> "Tyge" <skrammelpost@hotmail.com> wrote in message
news:<3f491405$0$24719$edfadb0f@dread14.news.tele.dk>...
> > Jeg har lavet en navigations display til sejlere, hvor man kan indlæse
en
> > kystlinie fra en tekstfil, afhængig af hvor man sejler. Når skibet
flytter
> > sig skal navigationsskærmen opdateres og tekstfilen genindlæses. Hvordan
> > laver jeg denne genindlæsning automatisk ?
>
> Hvis det hele tiden er den samme tekstfil der indlæses kan jeg altså
> ikke se formålet, med mindre du gør det for at sløve programmet ??
> Ønsker du et display a la stabiliseret head-up som fra radar'en eller
> North-up som kendt fra gyrostabiliserende radar/ARPA og søkort ??



Kasper Bo Larsen (31-08-2003)
Kommentar
Fra : Kasper Bo Larsen


Dato : 31-08-03 22:21

"Tyge" <skrammelpost@hotmail.com> wrote in message news:<3f51efd6$0$24707$edfadb0f@dread14.news.tele.dk>...
> Det er et helmsmans display.
>
> Der kan zoomes ind og ud og når skibet flytter sig langs kysten bliver det
> nødvendigt at gentegne billedet hvergang skibet gentegnes.
>
>
Jeg har selv haft "fornøjelsen" at stå til rors på diverse skibe, men
betegelsen "helmsmans display" kender jeg ikke, men jeg formoder at
det må minde meget om "head up", hvor man ser fremad enten fra midten
af skærmen, eller evt. lidt forskudt agterefter ?
Jeg kan stadig ikke forstå hvorfor du har behov for at læse
positionslisten mere end een gang. Positionerne der angiver kystlinien
ændre sig jo sjældent bare fordi man flytter sig
Mine erfaringer med vb er godt nok ca 5 år gamle, ( arb. med C++ de
sidste 5 år ) men man må vel kunne lave positionslisten til en global
liste således at man ikke hele tiden skal læse fra disk ?

Kasper

Tyge (01-09-2003)
Kommentar
Fra : Tyge


Dato : 01-09-03 07:03

Jeg har selv haft "fornøjelsen" at stå til rors på diverse skibe, men
> betegelsen "helmsmans display" kender jeg ikke, men jeg formoder at
> det må minde meget om "head up", hvor man ser fremad enten fra midten
> af skærmen, eller evt. lidt forskudt agterefter ?
> Jeg kan stadig ikke forstå hvorfor du har behov for at læse
> positionslisten mere end een gang. Positionerne der angiver kystlinien
> ændre sig jo sjældent bare fordi man flytter sig

Jo, for skibet er i centrum af skærmen og når kortcentrum flytter sig, så
flytter kortet sig. Det du forslår er at kysten er stationær og kun skibet
flytter sig,,, så må skibet jo til sidst sejle ud af kortet/skærmen.

> Mine erfaringer med vb er godt nok ca 5 år gamle, ( arb. med C++ de
> sidste 5 år ) men man må vel kunne lave positionslisten til en global
> liste således at man ikke hele tiden skal læse fra disk ?

Det er det jeg prøver på.

mvh. Tyge



Søg
Reklame
Statistik
Spørgsmål : 177557
Tips : 31968
Nyheder : 719565
Indlæg : 6408878
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste