Nochmals: 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

Nochmals: TDbf

Beitrag von Midykm »

Hallo,

zunächst vielen Dank für den Hinweis, daß es "WriteLn(MyDbf.Fields[i].AsString)" heißen muß.
So weit, so gut...
Lasse ich das Programm laufen, kompiliert es anstandslos, gibt auch als Datensatz-Anzahl korrekt 1465 aus. Aber:
Dann krieg ich einen Exception-Klasse "EListError" ("List index out of bounds").
Debugge ich das Ganze, wirds richtig interessant.
"MyDbf.FilePath <Error: Type TDBF has no component named FILEPATH..."
usw.
Oops!
Ich erwäge, die Computerei an den Nagel zu hängen und zum guten alten Rechenschieber zurückzukehren!

Trotzdem: Danke für die Zeit und Mühe!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Nochmals: TDbf

Beitrag von af0815 »

Schon hier mal nachgelesen: http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial/de bzw. die genauere englische Version ?

BTW: Manche Sachen kann der gdb nicht auflösen. Da muss man halt kreativ sein. Siehe gdb Probleme.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Nochmals: TDbf

Beitrag von wp_xyz »

An den von Lazarus verwendeten Debugger, gdb, muss man sich erst gewöhnen. Gerade Objekte machen ihm das Leben schwer. So kann er inbesondere keine Properties direkt auswerten. Aber du kannst das objekt-interne Feld reinschreiben, auf das sich das/die Property bezieht.

Beispiel TDbf.FilePath:
Klicke im Quelltext, in dem TDbf vorkommt, auf den Bezeichnen "TDbf" mit gedrückter Ctrl-Taste. Dadurch wird der Quelltext von TDbf geöffnet, scrolle etwas nach unten bis du "property Filepath: String read FRelativePath write SetFilePath" findest. Daraus erkennst du, dass hinter der eigenschaft "Filepath" die Objektvariable "FRelativePath" steckt. Wenn du jetzt, wenn dein Programm läuft und ein Breakpoint erreicht ist, im Debugger-Auswerte- oder Watch-Fenster den Ausdruck "MyDbf.FRelativePath" eingibst, wird dir der aktuelle String angezeigt.

In vielen Fällen geht es auch einfacher, weil die Objektvariable in der Regel genauso heißt wie das/die Property und nur ein "F" vorangestellt hat.

Probleme gibt es, wenn die Eigenschaft durch eine Funktion ausgelesen wird, weil gdb keine Funktionen auswerten kann. Hier hilft es, den Quelltext kurz umzuschreiben, und den Wert in einer Variablen zwischenzuspeichern; damit kannst du sogar den Wert in einem Mouse-Over-Popup ablesen. Oder man schreibt sich, gar nicht zeitgemäß, eine WriteLn-Anweisung in den Quelltext. Achtung: Bei Windowsprogrammen muss man dafür in den Projekt-Optionen unter "Konfiguration und Ziele" das Häkchen vor "Win32-Gui-Anwendung" wegmachen; sonst gibt es einen Laufzeitfehler.

Das ist alles recht gewöhnungsbedürftig, und wenn ich zwischendurch mal wieder ein Delphi-Projekt debugge, denke ich mir: Ja, das wär's. Aber einen Vorteil hat es: Dadurch dass man gelegentlich in den Lazarus-Quelltext schauen muss, lernt man immer mehr, wie die Objekte intern funktionieren. Daher bitte nicht die Flinte ins Korn werfen.

Hier noch ein paar Links zum Debugger:
http://wiki.freepascal.org/GDB_Debugger_Tips#Properties
http://wiki.lazarus.freepascal.org/Debugger_Setup

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

Re: Nochmals: TDbf

Beitrag von Midykm »

Vielen Dank für die Antworten!
Ja, das Tutorial kenne ich gut; Teile meines Codes stammen von da.
Daß der Debugger so zickig ist, wusste ich nicht - Danke für die Hinweise.
Es wird wohl mit meiner .DBF-Datei was nicht stimmen, da ich nach Ausgabe des ersten Datensatzes eine "Out Of Index-Fehler" erhalte.
Ist auch keine "generische dBase-Datei", sondern wurde mit LibreOffice (Speichern unter..) erstellt.

OK, nochmals Danke!

Antworten