![]() |
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
Paradox "Data Block" länge ermitteln?
Hallo,
ich bin gerade dabei, in meinem Tool Datensätze (Byteweise) aus einer Paradox Tabelle auszulesen. Die Einzelnen Tabellenzeilen werden laut: ![]() siehe Download *.ZIP file .... PXFORMAT.TXT Zitat:
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 ... ![]() |
Re: Paradox "Data Block" länge ermitteln?
Hallo Mitchl,
das Byte im Header an Offset 5 liefert dir die BlockSize. Grüße vom marabu |
Re: Paradox "Data Block" länge ermitteln?
Guten Morgen marabu,
Du meinst: Zitat:
Delphi-Quellcode:
aus Frage:
ReadValues(fn: Test.DB; offset: 0005; .....
![]() 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.... :gruebel: Viele Grüße Mitchl |
Re: Paradox "Data Block" länge ermitteln?
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:
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:
// 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;
Delphi-Quellcode:
Grüße vom marabu
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; |
Re: Paradox "Data Block" länge ermitteln?
Liste der Anhänge anzeigen (Anzahl: 1)
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 |
Re: Paradox "Data Block" länge ermitteln?
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:
Need Help???
fs.Read(????, hi.MaxTableSize);
showmessage('MaxTableSize:'+XXX); Thanx Mitchl |
Re: Paradox "Data Block" länge ermitteln?
Meinst du so?
Delphi-Quellcode:
marabu
ShowMessage(Format('MaxTableSize = %dM', [64 * hi.MaxTableSize]));
|
Re: Paradox "Data Block" länge ermitteln?
Jepp,
genau so ... vielen Dank... Gruß Michl |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz