Übergeordneter Datenbank-Zugriff mit Frames [gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Real
Beiträge: 5
Registriert: Mo 7. Dez 2009, 18:50

Übergeordneter Datenbank-Zugriff mit Frames [gelöst]

Beitrag von Real »

Erstmal möchte ich allen Lazarus - Benutzern ein freudiges Hallo entgegenbringen.
Ich lese schon einige Zeit mit und das Forum hier hat mir schon tausende Fragen beantwortet - Danke dafür :)
Heute steh ich aber an einem Punkt wo ich einfach festhänge.
Folgendes Projekt:

Auf einem simplen Form werden verschiedene Frames abgerufen (das funktioniert einwandfrei) und bei bedarf wieder geschlossen (auch das klappt). In einem Frame habe ich einen Datenbankeditor entwickelt. Dieser funktioniert soweit auch bis auf ein kleines Problem. Ich habe verschiedene DBEdit-Felder die von mir mit einem OpenDialog gefüttert werden (allerdings nur der Dateiname, diesen habe ich mit simplen Stringoperations aus "FileName" extrahiert (-> überprüft und passt!). Wird der neue Dateinamen in das DBEdit-Feld gefügt wird dieser dort auch angezeigt. Schließe ich die Datenbank ist er weg und der alte steht wieder drinnen. Ist ja auch logisch schließlich wurde die Datenbank nicht aktualisiert (zur Gegenprüfung habe ich ein anderes Feld von hand geändert und dann mit DBNavigator und "post" die Daten aktualisiert. Folgender Ansatz zur Lösung:

MainDatabase.edit
DBEdit1.Field.AsString:= xyfile;
MainDatabase.post

Daraus entsteht das Problem das "MainDatabase" nicht gefunden wird, ist ja auch logisch die liegt auf der MainForm. Gebe ich also MainForm.MainDatabase ein wird auch nichts gefunden muss ja schließlich vorher MainForm in der usesklausel unterbringen. Tuhe ich das schimpft der Compiler:
dbeditorframe.pas(9,61) Fatal: Circular unit reference between dbeditorframe and mainmenu
Mir ist auch klar was das bedeuted ich kann nicht beide miteinander verbinden - wie soll ich aber sonst auf meine Datenbank im Mainform zugreifen?

Für hilfe wäre ich sehr dankbar.

ps.: wenn einer manchmal weiß wie man den Patch für progressive jpeg's anwendet kann ers mich gern wissen lassen.
Gruß
Zuletzt geändert von Real am Mi 9. Dez 2009, 17:44, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Übergeordneter Datenbank-Zugriff mit Frames

Beitrag von Socke »

Da gibt es ein paar Möglichkeiten:
Wird eine unit nur in der Implementation benötigt, kann man sie auch nur dort einbinden:

Code: Alles auswählen

unit xyz;
interface
uses Classes, und_was_weiß_ich;
implementation
uses die_ander_unit
end.
Zweite Alternative: Datenbank-Verbindung auslagern. Da würde sich bspw. ein DataModule anbieten. Da kannst du auch einfach deine (nicht visuellen) Komponenten drauf platzieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Real
Beiträge: 5
Registriert: Mo 7. Dez 2009, 18:50

Re: Übergeordneter Datenbank-Zugriff mit Frames

Beitrag von Real »

Besten dank für die Hilfe,
er kompiliert jetzt problemlos (habe die form in die implentation geschrieben und kann auf die DB zugreifen).
Problem besteht aber weiterhin.

Code: Alles auswählen

try
MainFrame.MainDatabase.Edit;
except
       on e: Exception do
       showmessage(E.message);
end;
Führe ich das PGM aus hängt er sich mit einem SIGSEV Error auf (also der Debugger), habe hier um zu sehen was los ist die Exception abgefangen bekomme da aber nur "Acces Violation" - wo liegt da die Zugriffsverletzung? Liegt es daran das DBGrid,DBEdit,etc. auf die Datenbank zugreifen und somit .Edit sowieso aktiv ist? Versuche ich der Datenbank einen .post befehl zu erteilen passiert das selbe.

Eine andere Möglichkeit für das Problem schwebt mir momentan nicht vor (Ich hole wie gesagt aus nem OpenDialog mir nen Dateinamen und möchte diesen erst ins DBEdit und dann in die Datenbank bringen.

Code: Alles auswählen

OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0)) + 'Unterordner1\ ' +DBComboBox.Caption+'\Unterordner2\ ';
  If OpenDialog1.Execute then
  begin
     xyfile := '';
     For i := length(OpenDialog1.InitialDir)+1 to length(OpenDialog1.FileName) do
     begin
     xyfile := xyfile+OpenDialog1.FileName[i];
     end;
     DBRomFile.Field.AsString:= xyfile;
 
  end;
  try
//Wie gesagt hier haut direkt wieder der Acces Error rein (noch vor der exception!)
MainFrame.MainDatabase.Post;
except
       on e: Exception do
       showmessage(E.message);
end;


werde jetzt mich mal mit deiner zweiten Lösung befassen - rein informativ wäre aber das Problem hier sehr schön zu wissen.

Ps.: Also es funktioniert tadellos mit Datamodule -> danke für den Denkanstoß, vereinfacht mir das programm sehr.
Zum obigen Fehler kann ich auch eine Erklärung abgeben - ich habe um Zugriff auf die DB zu bekommen im FormCreate die Datenbank deklariert - sozusagen doppelt.
Zuletzt geändert von monta am Di 8. Dez 2009, 11:44, insgesamt 1-mal geändert.
Grund: Codehervorhebung (Leerzeichen bei Pfad nur für Highlighter hier gesetzt)

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Übergeordneter Datenbank-Zugriff mit Frames

Beitrag von shokwave »

Real hat geschrieben:ps.: wenn einer manchmal weiß wie man den Patch für progressive jpeg's anwendet kann ers mich gern wissen lassen.
Gruß
Wenn du dir den FPC aus 'm SVN zusammenbastelst dann funktionierts. Nur den Patch einbinden - da bin ich überfragt ob das reicht.
mfg Ingo

Real
Beiträge: 5
Registriert: Mo 7. Dez 2009, 18:50

Re: Übergeordneter Datenbank-Zugriff mit Frames

Beitrag von Real »

Danke, werde einfach warten bis es die neue Version gibt, kann ja eigentlich nicht mehr alzu lange dauern.

Antworten