|  | 		    
					
        
         
          
         
	
          | |  | 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
 | 
 |  |  |  |  | 
  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
            
             |  |  | 
 |  |