Autor |
Beitrag |
tschinkes
      
Beiträge: 29
|
Verfasst: Mi 02.02.05 10:37
Moin,
hab momentan folgendes Prob:
Ich habe auf einem Datenmodul einige ADO Komponenten, nun versuche ich aus einer ADOQuery aus dem datenmodul zuzugreifen um eine ListView im Hauptformular zu füllen, aber sobald ich das Programm starte, hängt es sich an der Stelle auf, indem ich zum ersten mal überhaupt auf das datenmodul zugreifen will! Es lässt sich nicht ansprechen.
Delphi-Quelltext 1: 2: 3: 4:
| Daten.leihe_query.Close; Daten.leihe_query.SQL.Add('SELECT * FROM Video as V, Kontakt as K, Leihe as L WHERE V.id = L.Video_id AND K.id = L.Kontakt_id'); Daten.leihe_query.Open; ... |
Es brauch nur mit meinem Datenmodul (Daten) anfangen dann kommt schon eine Fehlermeldung 'EAccessViolation, Zugriffsfehler...'
Ich weiß echt nimmer weiter!
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 02.02.05 10:42
tschinkes hat folgendes geschrieben: | Es brauch nur mit meinem Datenmodul (Daten) anfangen dann kommt schon eine Fehlermeldung 'EAccessViolation, Zugriffsfehler...' |
Wie und wo wird das Datenmodul Daten erzeugt?
|
|
tschinkes 
      
Beiträge: 29
|
Verfasst: Mi 02.02.05 10:44
Statisch vorab, also habe es nicht während der Laufzeit generiert. Habe es auch schön in mein Hauptformular eingebunden per Uses, aber bringt nix!
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 02.02.05 10:51
tschinkes hat folgendes geschrieben: | Statisch vorab, also habe es nicht während der Laufzeit generiert. |
Mhh, und Du bist gaaanz sicher, dass es zum Zeitpunkt des Zugriffs auch schon erzeugt ist?
|
|
tschinkes 
      
Beiträge: 29
|
Verfasst: Mi 02.02.05 10:54
ich denke schon! Denn als ich es mal mit einem DBGrid verbunden habe, hatte ich ja per dataSource ja auch zugriff auf die Daten aus meiner Query aus dem datenmodul! Nur jetzt wenn ich versuche per Code das Datenmodul anzusprechen dann hängt er sich auf!
Aber selbst wenn nicht, wie mache ich es dann?
|
|
tschinkes 
      
Beiträge: 29
|
Verfasst: Mi 02.02.05 11:03
Ok, doch mein Fehler, entschuldige, musste erst das datenmodul erzeugen, sorry!
DAAAANNNNKKKKKKKKEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 02.02.05 11:03
tschinkes hat folgendes geschrieben: | ich denke schon! |
Famous last words...
Zitat: | Denn als ich es mal mit einem DBGrid verbunden habe, hatte ich ja per dataSource ja auch zugriff auf die Daten aus meiner Query aus dem datenmodul! |
Das hat nichts zu sagen.
Zitat: | Nur jetzt wenn ich versuche per Code das Datenmodul anzusprechen dann hängt er sich auf!
Aber selbst wenn nicht, wie mache ich es dann? |
Erzeuge es eben dynamisch oder sorge dafür, dass es sicher erzeugt ist, bevor Du es aufrufst. Ich empfehle in so einem Fall den Einsatz von Assertions:
Delphi-Quelltext 1:
| Assert(Assigned(Daten), 'Datamodule DATEN noch nicht erzeugt'); |
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 02.02.05 11:06
Wenn die Form, von der du das DatenModul ansprichst, das Hauptformular ist, ist das DatenModul beim Start (im FormCreate) noch nicht erzeugt. Somit also auch nicht verfügbar.
Versuch es im FormActivate. Dort solltest du aber prüfen, ob die Query schon Aktiv ist, da das FormActivate auch durch andere Ereignisse ausgelöst wird.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 02.02.05 11:18
jasocul hat folgendes geschrieben: | Versuch es im FormActivate. Dort solltest du aber prüfen, ob die Query schon Aktiv ist, da das FormActivate auch durch andere Ereignisse ausgelöst wird. |
...und genau deshalb würde ich es auf keinen Fall im FormActivate machen. IMHO bietet sich in vielen Fällen eine Singleton-Implementierung für Datenmodule an, wobei die benötigte Instanz im Bedarfsfall automatisch erzeugt wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| type TmyDataModule = class(TDataModule) private public end;
function myDataModule: TmyDataModule;
implementation
var _myDataModule: TmyDataModule = nil;
function myDataModule: TmyDataModule; begin if not Assigned(_myDataModule) then begin try _myDataModule := TmyDataModule.Create(Application); except _myDataModule := nil; end; end; Result := _myDataModule; Assert(Assigned(Result), 'DataModule myDataModule nicht erzeugt!'); end; |
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 02.02.05 11:25
Du hast schon Recht. Deine Lösung ist der bessere Weg. Du hattest dein Posting aber abgesetzt, als ich meins gerade geschrieben hatte. Sonst hätte ich meine große Klappe gehalten.
Ich persönlich generiere sowieso die Fenster und Datenmodule zur Laufzeit.
|
|