Fehler in TDBF? [gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Fehler in TDBF? [gelöst]

Beitrag von and4more »

Hallo Forum,
habe aktuell versucht über TDBF eine dBase-Datenbank während der Entwicklung auf .Active zu setzen. Auf dem Formular befindet sich das Tdbf-Modul und ein DataSource. Beides korrekt miteinander verbunden. Als erste Meldung beim Versuch über die Entwicklungsumgebung zu aktivieren poppt ein "Stack Overflow" auf. Beim zweiten Versuch stürzt Lazarus einfach ab. Dieses Verhalten habe ich unter Windows 10, Lazarusversion 1.6.2 (32 Bit) beobachtet. Interessanterweise ging das Erstellen der Datenbank mit o.g. Modul problemlos (TableVersion 7, wegen Autoinc, eine .mdx Datei). Die Datenbank-Datei ist auch intakt, sie lässt sich mit DBFPlus auslesen und befüllen. Setze ich im Programm die Datenbank auf Active erfolgt ebenfalls ein Absturz zur Laufzeit, lasse ich sie auf Active=False dann startet das Programm, allerdings sehe ich im DBGrid keine Daten (oh Wunder :roll: ). Ich weiß, dBase ist ein altes Format und SQL ist der "Renner", aber aus verschiedenen Gründen kann und will ich nicht das Ganze mit SQL realisieren . Sollte ich noch wichtige Angaben vergessen haben wäre ich für Hinweise dankbar.

Liebe Grüße und schon mal vielen Dank
Zuletzt geändert von and4more am Mi 25. Jan 2017, 15:41, insgesamt 1-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

Nachtrag: Habe einen Denkfehler drin, da ich den Cross-Compiler für 32 und 64 Bit verwendet habe. Offensichtlich reicht es nicht, das Ziel auf 32 Bit zu stellen. Habe jetzt zusätzlich 32 Bit Lazarus installiert und kann jetzt ohne einen Absturz das Programm mit Tdbf.Active auf True gesetzt kompilieren. Allerdings wenn ich zur Entwicklungszeit die Datenbankkomponente auf True setze kommt es leider wie zuvor zum Absturz. Außerdem zeigt mein DBGrid im kompilierten Zustand auch zur Laufzeit keine Daten.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Fehler in TDBF?

Beitrag von wp_xyz »

Ich weiß nicht, ob das das Problem bei dir ist, aber ein beliebter Fehler (meinerseits) beim Umgang mit Datenbank-Komponenten zur Designzeit ist die Verwendung relativer Dateipfade. Zur Designzeit bezieht sich ein relativer Pfad auf den Ordner, in dem Lazarus.exe steht, zur Laufzeit ist er aber relativ zum Ordner, in dem sich die exe des Programms befindet. Das heißt, wenn du zur Designzeit eine Datenbank erstellst, wirst du sie zur Laufzeit nicht finden.

Abhilfe: während der Entwurfsphase absolute Pfade verwenden. Wenn die DB dann steht, solltest du sowieso den Pfad im Objektinspektor löschen und erst zur Laufzeit einsetzen, damit das Programm fehlertoleranter wird.

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

Danke für den Tipp, hatte im Konfigurationspanel für das Datenbankmodul den absoluten Pfad eingestellt. Was anderes wie z. B. relative Pfade wird dort nicht akzeptiert. Im Programm selbst habe ich allerdings schon einen relativen Pfad. Überschreibt dieser den voreingestellten Pfad bereits zur Entwicklungszeit?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

Interessanterweise werden offensichtlich die Pfadangaben aus der TDBF-Komponente nicht zur Laufzeit übernommen, es muss also immer auch im Programm der Pfad und Tabellenname explizit angegeben werden, sonst tritt im Programm zur Laufzeit ein Fehler auf, wenn man Pfad und Tabellenname auskommentiert. Im Übrigen ändert sich an dem eingangs genannten Fehlverhalten auch nichts wenn man den kompletten absoluten Pfad angibt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Fehler in TDBF?

Beitrag von wp_xyz »

and4more hat geschrieben:Danke für den Tipp, hatte im Konfigurationspanel für das Datenbankmodul den absoluten Pfad eingestellt. Was anderes wie z. B. relative Pfade wird dort nicht akzeptiert. Im Programm selbst habe ich allerdings schon einen relativen Pfad. Überschreibt dieser den voreingestellten Pfad bereits zur Entwicklungszeit?

Wenn du mit "im Programm selbst" meinst, dass der Pfad im Code definiert wird: Nein, dazu müsste der Code ja ausgeführt werden, und das kann die IDE nicht. Die IDE kann nur den Code ausführen, der hinter den im Objektinspektor sichtbaren Properties steckt, und in die IDE einkompiliert ist. Oder ich verstehe hier etwas falsch...

Bist du sicher, dass der Absturz nicht durch dein Programm verursacht wird? Trenne mal die TDbf-Komponente von der TDatasource, entferne alle Eventhandler, die TDbf verwendet, und setzt dann Active auf true. Das müsste jetzt klappen, weil alles in deinem Programm deaktiviert ist. Anschließend würde ich schrittweise wieder alles rückgängig machen. Dazu kann ich aber keine näheren Hilfestellungen geben, weil ich dein Programm nicht kenne.

Oder: setze einen Breakpoint auf die Stelle, in der du zur Laufzeit die Dbf-Komponente auf Active stellst, und steppe durch deinen Code. Achte darauf, ob sich ein und dieselbe Routine rekursiv immer wieder selbst aufruft, was einen Stacküberlauf bewirken kann.

Um zu testen, ob deine dbf-Komponente in Ordnung ist, könntest du das beigefügte Programm testen und laufen lassen. Es stammt aus irgendeinem Forumsbeitrag und läuft ohne Fehler, insbesondere ohne Absturz.
Dateianhänge
dbf_filter.zip
(3.32 KiB) 70-mal heruntergeladen

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

...den Pfad lege ich folgendermaßen fest:

Code: Alles auswählen

 
  dbf.FilePath:=ExtractFilePath(Application.ExeName)+'DB\\';
 


Dies sollte eigentlich den kompletten Pfad umfassen, wie mir auch ShowMessage zeigt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

Sorry, das Mailing hatte ich nicht gesehen (Fenster hatte nicht aktualisiert). Habe jetzt das Beispielprogramm runtergeladen und gestartet, funktioniert einwandfrei. Super, jetzt habe ich die Möglichkeit den funktionierenden Code zu analysieren, das hilft super. Werd' mich wieder melden, muss aber noch was arbeiten. Erst mal vielen Dank
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF?

Beitrag von and4more »

...ein Problem ist schon mal gelöst: nachdem ich "Mastersource" aus der TDBF-Komponente von DataSource auf leeres Feld gestellt hatte funktioniert es wenn man den Active-Button zur Entwicklungszeit auf True stellt. Jetzt sehe ich im Grid auch die Spaltenüberschriften. Ist Mastersource vorbelegt kommt es zum o. g. Absturz. Allerdings muss ich noch rumprobieren warum das zur Laufzeit nicht klappt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fehler in TDBF? [gelöst]

Beitrag von and4more »

...hab's jetzt rausgefunden. Ich Trottel hatte in der Form.Show Prozedur noch "dBf:=TDbf.Create(self);" eingetragen. :oops:
Das kann natürlich nicht funktionieren. Damit erachte ich das Thema für gelöst. Vielen Dank an Alle für's Kopfzerbrechen und ganz besonders an wp_xyz!
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Antworten