Avatar billede vallemanden Nybegynder
03. september 2004 - 08:46 Der er 9 kommentarer og
2 løsninger

turbopower btree filer komponet til delphi

Hej
Er der nogle der kender til et komponet til delphi der kan læse/skrive til btree filer??

jeg har prøvet den der ligger på http://sourceforge.net/projects/tpbtreefiler/

men den er ikke rigtig til at finde ud af, jeg kunne godt tænke mig at jeg kunne gå til den med ttable eller via en ODBC drivere
Avatar billede pellelil Nybegynder
03. september 2004 - 08:56 #1
Jeg tvivler. Se nu bare at få faset de gamle DOS programmer ud og flyt det hele til Delphi og brug FireBird  ;-)
Avatar billede vallemanden Nybegynder
03. september 2004 - 08:58 #2
Ja det er jo også det jeg vil ;-) men der er en del kunder der køre i det gamle dos program med en btreefiler DB, og deres data skulle gerne kunne konvateres over i en ny DB

P.S.

Jeg bruger Delphi 7
Avatar billede pellelil Nybegynder
03. september 2004 - 09:27 #3
Konverteringen er nem. Du laver bare (i Delphi) en Packed-Record med samme opbygning som du bruger i DOS og så vil du kunne læse record'ene en for en ind i Delphi (glem alt om BTreeFiler, bare læse dem som records). Husk at den første record i BTreeFiler indeholder "noget snask" og ikke skal medtages, samt (hvis jeg husker korrekt) så kan de første 4 bytes af hver record bruges til at indikere hvorvidt den enkelte record er slettet eller ej (hvis denne er 0 er posten ikke slettet).

Når du har indlæst din record i Delphi kan du gemme den i en hvilken som helst database ved at flytte felterne fra recorden over i din TTable (eller hvad du nu måtte foretrække).
Avatar billede pellelil Nybegynder
03. september 2004 - 09:29 #4
"med samme opbygning som du bruger i DOS": Husk lige at variabeltyperne i TP7 og Delphi7 absolut ikke er ens, så måske du skal lave lidt "fix-faxerier" for at få flyttet felterne over (f.eks. er en Integer i DOS 2 bytes hvor den er 4 i Delphi), men det burde være overkommelig.
Avatar billede vallemanden Nybegynder
06. september 2004 - 05:22 #5
har du evt. en lille kode stump?
Avatar billede hrc Mester
06. september 2004 - 09:32 #6
Et btree system består af en data og en indeks-del. Som pellelil siger kan du bare gennemløbe datafilen (Et problem er dog at du ikke kan se om læste record er slettet eller ej (medmindre det fremgår af felterne i recorden))

Først skal du kende record-størrelsen op de data du vil læse:

type
  TDataRec = packed record
    Navn : string[30]; // 31 bytes
    Adresse : string[30]; // 31 bytes
    ..
  end;

Dernæst skal du kende headeren i datafilen. Dette er lettest at gøre vha. en hex-editor som UltraEdit. Normalt er det et multiplum af 8 byte: 256, 512, 1024 bytes. Disse bytes skal du skippe:

  Seek(fp,1024); // fp er en "file of TDataRec" og her skippes den første kb.

Nu kan du lave loopet vha. blockread:

  repeat
    blockread(fp,DataRec,sizeof(TDataRec),BytesRead);
    if BytesRead > 0 then begin
      // Gem DataRec i database
    end;
  until BytesRead = 0; // EOF

Det er faktiskt det. Jeg har en programstump derhjemme som jeg kan indsætte, men måske kan dette her hjælpe dig lidt på vej.

Sender det som et svar selvom pellelil var først (måske er man heldig at få andel i pointsene)
Avatar billede pellelil Nybegynder
06. september 2004 - 10:10 #7
Nu er det et par dage siden jeg sidst havde fat i BTreeFiler og læsning af Records, men hvis fp er defineret som File Of TDataRec, så skulle du kunne bruge Read uden først at positionere sig (husk blot ikke at gøre noget med første post der læses):

<SNIP>
  FirstRec := True;
  repeat
    Read(fp, DataRec);
    if FirstRec then begin
      FirstRec := False;
    end else begin
      TTable.Edit;
      TTable.FieldByName('Navn').AsString := DataRec.Navn;
      TTable.FieldByName('Adresse').AsString := DataRec.Adresse;
      TTable.Post;
    end;
  until eof(fp);
</SNIP>

PS: Jeg må også heller komme med et svar så ;-)
Avatar billede vallemanden Nybegynder
10. september 2004 - 00:36 #8
er der nogen måde at finde ud af felt typerne og størrelsen?
Avatar billede pellelil Nybegynder
10. september 2004 - 06:37 #9
Er vi "ovre i" at du ikke har sourcen til DOS programme? I så fald tror jeg ikke at du har andre muligheder end at prøve sig frem, og her er en HexEditor næsten nødvendig (f.eks. http://www.winhex.com/).

Det første du skal forsøge at finde ud af er record størrelsen (kig om du kan finde "et mønster" i filen - og husk på at den første record i en BTreeFiler data-fil indeholder "noget snask", så den siger dig ikke så meget). Når du har fuden record-størrelsen skal du til at kigge på de enkelte felter. I BTreeFiler bør de 4 første byte af en recrod ikke blive brugt (af programmet), da BTreeFiler bruger disse til at markere slettede poster (i en hægtet liste). Husk også på at "de gode gamle Pascal-Strenge" starter med een byte der angiver længden på strengen (hvorfor de ikke kunne være længere end 255 tegn). Ligeledes så brugte man typen Real til decimal tal (denne hedder idag Real48 i Delphi).

Sidenløbende med at du finder ud af hvad felterne er til kan du lave et program (a-la tidligere viste source eksempler) der læser posterne og viser dem på skærmen (så kan du se om du "gætter rigtigt" når du forsøger at finde recordens opbygning).

Efterhånden som du finder ud
Avatar billede vallemanden Nybegynder
14. september 2004 - 04:28 #10
jeg har sourcen, men kan ikke holde rede på det hele og kan ikke få alle felterne udredt
Avatar billede vallemanden Nybegynder
06. marts 2005 - 00:17 #11
Pellelil  kan jeg komme i kontakt med dig??

send evt. svar på prog@night.dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester