Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
Delphi 7 Enterprise
|
Re: DBGrid zeigt nicht alle Werte an
17. Feb 2008, 12:50
Wenn Du DBF Dateien nur für den Import (Readonly) brauchst, musst Du Dich nicht mit den Treiber belasten. Dann geht es auch mit einer simplen Routine, die das direkt liest (Quick and dirty):
Delphi-Quellcode:
type
TFieldDef = class
public
FieldName : string[10];
FieldType : char;
FieldLen : smallint;
FieldDec : smallint;
end;
...
uses contnrs, (* Für TObjectlist *)
math (* Für max() *)
...
procedure TMainForm.ReadDbfFile(const AFileName: string);
const
HeaderRecordLen = 32;
var
fs : TFileStream;
Buffer : string;
RecLen, c, p, r : integer;
FieldList : TObjectList;
FieldDef : TFieldDef;
begin
(* Öffnen der Datei zum Lesen *)
fs := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
fs.Seek(HeaderRecordLen, soFromBeginning);
(* Felddefinitionen einlesen *)
FieldList := TObjectList.Create(True);
SetLength(Buffer, HeaderRecordLen);
RecLen := 0;
fs.ReadBuffer(Buffer[1], HeaderRecordLen);
while buffer[1] <> #13 do
begin
FieldDef := TFieldDef.Create;
FieldDef.FieldName := trim(copy(buffer, 1,10));
FieldDef.FieldType := buffer[12];
FieldDef.FieldLen := ord(buffer[17]);
FieldDef.FieldDec := ord(buffer[18]);
if (FieldDef.FieldType = 'C') and
(FieldDef.FieldDec > 0) then
begin
FieldDef.FieldLen := FieldDef.FieldDec * 256 + FieldDef.FieldLen;
end;
inc(RecLen, FieldDef.FieldLen);
FieldList.Add(FieldDef);
fs.ReadBuffer(Buffer[1], HeaderRecordLen);
end;
(* Eintrag der Feldnamen in Stringgrid *)
StringGrid.RowCount := 2;
StringGrid.FixedRows := 1;
StringGrid.FixedCols := 0;
StringGrid.ColCount := FieldList.Count;
for c := 0 to FieldList.Count-1 do
begin
StringGrid.Cells[c, 0] := TFieldDef(FieldList.Items[c]).FieldName;
StringGrid.ColWidths[c] := Max(Length(StringGrid.Cells[c, 0]), TFieldDef(FieldList.Items[c]).FieldLen)*10;
end;
(* Zurück an das Ende der Felddefinitionen gehen *)
fs.Position := fs.Position-HeaderRecordLen+1;
(* Die Daten können direkt nach dem Endekennzeichen #$D stehen *)
(* Wurde die DBF durch Clipper erzeugt, so steht hier noch ein *)
(* zusätzliches Nullbyte *)
fs.ReadBuffer(Buffer[1], 1);
if Buffer[1] <> #0 then
fs.Position := fs.Position-1;
(* Satzlänge um eins erhöhen, an erster Stelle steht *)
(* das Löschkennzeichen *)
inc(RecLen);
r := 0;
(* Daten einlesen und in Stringgrid eintragen *)
SetLength(buffer, RecLen);
while fs.Position < fs.Size do
begin
if fs.Read(Buffer[1], RecLen) = RecLen then
begin
inc(r);
if r > 1 then
StringGrid.RowCount := StringGrid.RowCount+1;
Application.ProcessMessages;
p := 2;
for c := 0 to FieldList.Count-1 do
begin
StringGrid.Cells[c, r] := copy(buffer, p, TFieldDef(FieldList.Items[c]).FieldLen);
inc(p,TFieldDef(FieldList.Items[c]).FieldLen);
end;
end;
end;
FieldList.Free;
fs.Free;
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
|
|
Zitat
|