AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Paradox "Data Block" länge ermitteln?
Thema durchsuchen
Ansicht
Themen-Optionen

Paradox "Data Block" länge ermitteln?

Ein Thema von Mitchl55 · begonnen am 13. Feb 2006 · letzter Beitrag vom 16. Feb 2006
Antwort Antwort
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#1

Paradox "Data Block" länge ermitteln?

  Alt 13. Feb 2006, 17:09
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
Hallo,

ich bin gerade dabei, in meinem Tool Datensätze (Byteweise) aus einer Paradox Tabelle auszulesen.
Die Einzelnen Tabellenzeilen werden laut:

http://www.byronref.com/rmb/pxspecs.htm


siehe Download *.ZIP file .... PXFORMAT.TXT

Zitat:
Paradox Data Blocks
===================

The data area begins at offset headerSize (usually $0800). It is divided
into blocks of 1024, 2048, 3072 or 4096 bytes -- depending upon the maximum
table size set when the table was created. .....
in Datenblöcke zu je 1024, 2048, 3072 oder 4096 byte abgelegt, das bedeutet, dass
bei einer Datenlänge von 547Byte z.B. 3 Tabellenzeilen in eine Blocklänge von 2048
aufgeteilt wird, der Rest wird mit Leerzeichen gefüllt. Wenn ich jetzt die Blocklänge
auslesen könnte, dann könnte ich die Daten aus der Tabelle genau (Zeilenweise) auslesen.

Weiß jemand wie ich die Blocklänge ermitteln könnte? Geht das irgendwie über die Dateigröße etc.?

Danke & Gruß

Mitchl

PS: Später soll das ganze für ... http://www.delphipraxis.net/internal...171&highlight= dienen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Paradox "Data Block" länge ermitteln?

  Alt 13. Feb 2006, 21:21
Hallo Mitchl,

das Byte im Header an Offset 5 liefert dir die BlockSize.

Grüße vom marabu
  Mit Zitat antworten Zitat
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Paradox "Data Block" länge ermitteln?

  Alt 14. Feb 2006, 11:11
Guten Morgen marabu,

Du meinst:

Zitat:
0006....... fileData

Block size varies according to maxTableSize (at 0005):
maxTableSize = 1 (64M): block size = $0400 bytes
maxTableSize = 2 (128M): block size = $0800 bytes
maxTableSize = 3 (192M): block size = $0C00 bytes
maxTableSize = 4 (256M): block size = $1000 bytes
Das könnte ich dann ja mit der Function :

ReadValues(fn: Test.DB; offset: 0005; ..... aus Frage: ReadValues - Paradox Tabelle

auslesen und dann mit einem Showmessage anzeigen lassen oder?? Mit was lese ich den das Byte dann aus? Type: Float; Cardinal: 5; Länge: 1? Der erste Versuch ging natürlich wiederm schief....

Viele Grüße

Mitchl
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Paradox "Data Block" länge ermitteln?

  Alt 15. Feb 2006, 09:01
Hallo Mitchl,

ich denke du solltest etwas mehr Struktur in dein Programm bringen. Ich würde die ersten 6 Byte der Tabelle in einen Record einlesen. Danach kennst du die HeaderSize und kannst den Rest nachlesen. Nur auf die einzelnen Datensätze würde ich über direkte Positionierung zugreifen:

Delphi-Quellcode:
// ungetester Code ...

type
  PHeaderInfo = ^THeaderInfo;
  THeaderInfo = packed record
    RecordSize: SmallInt;
    HeaderSize: SmallInt;
    FileType: Byte;
    MaxTableSize: Byte;
  end;

  PTableHeader = ^TTableHeader;
  TTableHeader = packed record
    NumRecords: LongInt;
    NextBlock: Word;
    // ...
  end;

var
  hi: THeaderInfo;
  th: PTableHeader;
  fs: TFileStream;

begin
  fs := TFileStream.Create(fileName, fmOpenRead);
  fs.Read(hi, SizeOf(hi));
  GetMem(th, hi.HeaderSize);
  fs.Read(th.NumRecords, hi.HeaderSize);
  // ...
  FreeMem(th, hi.HeaderSize);
  fs.Free;
end;
Auf diese Weise kannst du auf die Header-Informationen zugreifen, als ob es normale Variablen wären. Wenn du noch einen dynamischen Puffer für die Datensätze spendierst und die Leseroutine etwas umschreibst, dann bist du schon auf dem Weg ins gelobte Land:

Delphi-Quellcode:
function GetRecord(s: TStream; index: Integer; var buffer: TByteDynArray): Boolean;
var
  offset: Cardinal;
begin
  offset := SizeOf(hi) + hi.HeaderSize + index * hi.RecordSize;
  if offset + Length(buffer) > s.Size then
    Result := false else
  begin
    s.Position := offset;
    s.Read(buffer[0], Length(buffer));
    Result := true;
  end;
end;

var
  buffer: TByteDynArray;

begin
  SetLength(buffer, hi.RecordSize);
  if GetRecord(fs, 0, buffer) then
    ShowMessage('der erste Record wurde gelesen - wie gefällt dir das?')
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Paradox "Data Block" länge ermitteln?

  Alt 15. Feb 2006, 11:23
Hallo,

Teil 2.) mit dem Auslesen der Records habe ich schon fast genau so
realisiert wie Du, Deine Version ist vielleicht noch etwas eleganter!!!

Teil l.) ist natürlich der bessere Weg, das ganze detailiert auszulesen!
Denke das ich den Part wohl in dieser Form übernehmen werde....

Hab da mal das bisherige Angehängt....

Das ganze funktioniert im Moment nur wenn die Tabelle das erste mal Ausgelesen wird...
Ist wohl noch eine Variable, um das Kopieren in eine *.bak Tabelle habe ich noch nicht
Programmiert. Ignorierte Zeichen ist für den Header(2048) + 0006 = 2054 Zeichen wo die
Records anfangen! Wie gesagt, da übernehme ich wohl die vorgeschlagenen Teile...

Viele Grüße

Mitchl
Angehängte Dateien
Dateityp: zip project1_108.zip (457,4 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Paradox "Data Block" länge ermitteln?

  Alt 15. Feb 2006, 12:05
So... habe das getestet funzt auch wie beschrieben...

habe nur noch das Problem, mir die Maximale Tabellenlänge='Data-Block' ausgeben zu lassen...

Müßte ja irgendwie so gehen...

Delphi-Quellcode:
fs.Read(????, hi.MaxTableSize);
showmessage('MaxTableSize:'+XXX);
Need Help???

Thanx

Mitchl
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Paradox "Data Block" länge ermitteln?

  Alt 15. Feb 2006, 12:42
Meinst du so?

ShowMessage(Format('MaxTableSize = %dM', [64 * hi.MaxTableSize])); marabu
  Mit Zitat antworten Zitat
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Paradox "Data Block" länge ermitteln?

  Alt 16. Feb 2006, 11:29
Jepp,

genau so ... vielen Dank...

Gruß

Michl
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz