Einzelnen Beitrag anzeigen

Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: DBGrid zeigt nicht alle Werte an

  Alt 17. Feb 2008, 11: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
  Mit Zitat antworten Zitat