Anfängerfrage zu TDBF

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Midykm
Beiträge: 10
Registriert: Di 31. Okt 2017, 21:59

Anfängerfrage zu TDBF

Beitrag von Midykm »

Hallo,

ich möchte mit TDbf in einem (vorerst) Kommandozeilenprogramm alle Datensätze via WriteLn ausgeben.
Mein Code:

{$MODE OBJFPC}
Program project1;
uses Dbf, db, Dbf_Common;

var
MyDbf: TDbf;
i : integer;

begin
MyDbf := TDbf.Create(nil);
try
{ benutzen Sie relative Pfade}
MyDbf.FilePath := '.\';

MyDbf.TableLevel := 7;
MyDbf.Exclusive := True;
MyDbf.TableName := 'top1465.dbf';
MyDbf.Open;

WriteLn('Datensätze: ',mydbf.ExactRecordCount);
WriteLn('ENTER drücken...');
ReadLn;
for i := 0 to MyDbf.Fields.Count - 1 do begin
WriteLn(MyDbf.Fields[i]);
end;
ReadLn;

MyDbf.Close;
finally
MyDbf.Free;
end;
end.

Das klappt aber nicht ("Can't read or write variables of this type").

Bitte Hilfe!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Anfängerfrage zu TDBF

Beitrag von wp_xyz »

Zunächst mal: Wenn du vor den Quellcode ein [ code=laz] und anschließend ein [ /code] schreibst, dann wird der Code entsprechend der Pascal-Syntax formatiert. Damit tut man sich als jemand, der deinen Code nicht kennt, leichter, ihn zu verstehen. Das Leerzeichen nach der öffnenden Klammer aber bitte weglassen - ich muss das hier verwenden, sonst formatiert die Forumsoftware den hier eingeschlossenen Text fälschlicherweise als Code.

Zu deiner Frage: Wenn du jetzt noch schreiben würdest, in welcher Zeile der Fehler auftritt, würde man sich nochmals leichter tun. So muss man nur vermuten... Ich denke, es hapert in der Zeile

Code: Alles auswählen

WriteLn(MyDbf.Fields[i]);

denn MyDbfFields[i] ist eine Klasse, die man nicht einfach per WriteLn ausgeben kann. Du musst schon angeben, welche Eigenschaft der Klasse gemeint ist - in diesem Fall wahrscheinlich der Dateninhalt des Feldes als String. Also:

Code: Alles auswählen

WriteLn(MyDbf.Fields[i].AsString);

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Anfängerfrage zu TDBF

Beitrag von compmgmt »

wp_xyz hat geschrieben:Das Leerzeichen nach der öffnenden Klammer aber bitte weglassen - ich muss das hier verwenden, sonst formatiert die Forumsoftware den hier eingeschlossenen Text fälschlicherweise als Code.
Ist zwar nicht Hauptthema des Threads, aber es geht: [code=laz][/code]
Dazu einfach [[b][/b]code=laz][/code] (Einfach irgendein Attribut irgendwo innerhalb des anzuzeigenden Attributs beginnen und sofort beenden), da die Software nur einen Durchlauf zum Formatieren macht und dadurch nur das bold, aber nicht das code-Attribut interpretiert wird.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Anfängerfrage zu TDBF

Beitrag von wp_xyz »

Danke. Gut zu wissen.

Midykm
Beiträge: 10
Registriert: Di 31. Okt 2017, 21:59

Re: Anfängerfrage zu TDBF

Beitrag von Midykm »

wp_xyz hat geschrieben:Zunächst mal: Wenn du vor den Quellcode ein [ code=laz] und anschließend ein [ /code] schreibst, dann wird der Code entsprechend der Pascal-Syntax formatiert. Damit tut man sich als jemand, der deinen Code nicht kennt, leichter, ihn zu verstehen. Das Leerzeichen nach der öffnenden Klammer aber bitte weglassen - ich muss das hier verwenden, sonst formatiert die Forumsoftware den hier eingeschlossenen Text fälschlicherweise als Code.

Zu deiner Frage: Wenn du jetzt noch schreiben würdest, in welcher Zeile der Fehler auftritt, würde man sich nochmals leichter tun. So muss man nur vermuten... Ich denke, es hapert in der Zeile

Code: Alles auswählen

WriteLn(MyDbf.Fields[i]);

denn MyDbfFields[i] ist eine Klasse, die man nicht einfach per WriteLn ausgeben kann. Du musst schon angeben, welche Eigenschaft der Klasse gemeint ist - in diesem Fall wahrscheinlich der Dateninhalt des Feldes als String. Also:

Code: Alles auswählen

WriteLn(MyDbf.Fields[i].AsString);


Danke - genau das war's!

Antworten