Autor |
Beitrag |
mexx
      
Beiträge: 1183
|
Verfasst: Di 04.07.06 09:34
Ich habe ein DBGrid welches ich farbig mache. In dem Ereigniss CalcCellColors befindet sich auch ein Field:TField. Dieses ist jedoch nil! Wie kann das sein.
Jetzt wird es aber noch verwirrender. Durch das Field = nil treten Fehler auf, weil ich mit dem Field in dem Ereigniss arbeite. Starte ich die compilierte Anwendung an einem anderem PC kommt kein Fehler bzgl. des Field = nil. Aber auf einen anderen Rechner wiederrum ist das Field = nil. Wie kann das sein?
Welches sind die Hauptgründe, dass ein Field in einem Zeichnungsereigniss eines DBGrid nil ist?
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
Jetstream
      
Beiträge: 222
|
Verfasst: Di 04.07.06 09:57
Standart-Antwort: Hast du den Konstruktor aufgerufen? Field := TField.create(self);
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 04.07.06 10:10
Nein...habe es aber gerade damit versucht. Keine Veränderung. Ich erhalte beim Zeichnen eine Zugriffsverletzung. Durch den Debug erfahre ich, dass das Field nil ist.
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 04.07.06 10:14
@Jetstream:
Ist nicht erforderlich, da "Field" ein Parameter ist.
Eine Ursache für dies Verhalten kann ich so pauschal nicht nennen. Da du CalcCellColors verwendest, gehe ich davon aus, dass du persistente Felder verwendest. Wenn du dann von einem PC auf Daten zugreifst, in denen ein Feld nicht enthalten ist (z.B. falscher DB-Connect, falsche Tabelle, etc.), kann es passieren, dass das Feld nil ist.
Prüfe diesen Zustand einfach am Anfang deiner Routine. Ist es nil, darf der Rest eben nicht ausgeführt werden.
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 04.07.06 10:17
Die Daten sind definitiv vorhanden. Immerhin greift die Anwendung auf die selbe DB zu. Jedoch von verschiedenen Rechnern aus. Manchmal kommt die Zugriffsverletzung beim Zeichnen, manchmal nicht!
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.07.06 11:53
Ich muss dieses Thema nochmal aufgreifen, weil ich dringend Hilfe brauche!
Eine Client-Server-Anwendung mit einer Interbase bringt auf manchen Rechnern eine Zugriffsverletzung und auf anderen nicht. Die Zugriffsverletzung erfolgt beim Zeichnen des Grids. Das haben wir durch den Debug-Modus in Delphi herrausgefunden. Field ist da nil, dadurch der Fehler. Aber wie kann das sein? Dazu kommt, dass ich glaube, dass es kein Fehler in der Anwendung ist. Wenn es das wäre, würde die Anwendung auf keinen PC laufen.
Was nimmt noch alles Einfluss auf die Verbindung zur DB? Treiber,...
Ich verwende die BDE.
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Di 11.07.06 12:04
passiert das in deinem OnDraw- Ereignis ?
das passiert wahrscheinlich dann, wenn das Dataset oder die Verbindung vom Grid zum Dataset noch nicht aktiv ist und du zur DesignTime keine Spalten vordefiniert hast.
Ich würde im OnDraw-Ereignis prüfen, ob das Assigned(Field) und wenn nicht, dann nicht darauf zugreifen 
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.07.06 12:36
Das klingt alles recht plausibel und ich werde es prüfen. Aber wie erklärst Du Dir, dass die Anwendung auf manchen PC's läuft und auf anderen nicht. Deine Erklärung begrenzt sich auf einen Fehler in der Anwendung. Ich glaube aber, dass äußere Einflüße eine Rolle spielen.
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Di 11.07.06 13:02
ich habe eine ähnliche problematik schon mehrfach erlebt und zwar war es nicht unbedingt rechnerspezifisch zu erklären, sondern es lag an den jeweiligen arbeitsschritten, die die einzelnen anwender in unterschiedlicher reihenfolge verfolgt haben.
die meisten anwender öffneten die formulare in der reihenfolge, die ich für sinnvoll hielt (und je nach formular wurde auch das bzw. die entsprechende(n) dataset(s) geöffnet)... in den meisten fällen hat das auch gut geklappt, wenn man die fenster in anderer reihenfolge geöffnet hat, da ich oftmals aber auch schon an applikationen mit mehr als 200 formularen gearbeitet habe, konnte nicht zwingend jede konstellation getestet werden (DIE haben aber dafür die anwender ruckzuck gefunden *g*)...
eine andere möglichkeit ist natürlich auch noch, dass du spalten erzeugst oder erzeugt hast und diese noch keine zugewiesene field-property haben... oder dass du die konfiguration deiner spalten zur laufzeit lädst...
aber das plausibelste wäre wohl, dass das bei recht großen tabellen/datasets passiert... an "schnellen" Rechnern mit schnellem Zugriff auf die Datenbank geht alles glatt... wenn der Rechner die Daten von der Datenbank nicht schnell genug erhält (oder er mit der Verarbeitung nicht hinterher kommt), versucht zwar die Anwendung (das Grid) sich neu zu zeichnen, aber kann noch nicht auf das Dataset zu greifen
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.07.06 13:38
Ich verstehe worauf Ihr hinaus wollt, ich prüfe!
Habe gerade etwas gefunden und brauche jetzt ein bisschen Hintergrundwissen. Die BDE stellt einen Alias zur Verfügung unter der Verwendung einen Treibers, denn man vorher läd. Klicke ich nun in der BDE auf Konfiguration uns lasse mir die Versionsinformationen des Interbase-Treibers anzeigen, sehe ich dass die GDS32.DLL bei meinem PC(Anwendung läuft hier) älter ist, als die auf einen anderen Rechner(Anwendung läuft hier nicht). Wie kann ich den Interbase-Treiber ändern? ich habe pauschal versucht die GDS32.dll bei den Problemrechner auszutauschen, jedoch erhalte ich nun eine Meldung, dass es eine unbekannte Datenbank sei.
Ich brauche also eine Interbase-Treiber! Wo bekomme ich den her!
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Mi 12.07.06 10:12
Ich habe die Lösung gefunden und poste Sie einfach mal, falls es mal einen Kollegen mit dem einem ähnlichen Problem gibt. An den Treibern für die DB-Verbindung lag es nicht.
Ich ermögliche es den Benutzer der Anwendung, verschiedene Spalten der Anwendung auszublenden. Damit der User nur die sieht, die er haben möchte. Welche Spalten gesehen werden, wird in einer übergreifenden DB gesichert. So wie in einer INI-File. Die Zugriffsverletzung erfolgte, weil der Benutzer, der sich an die Anwendung angemeldet hat, noch keine solche Informationen hinterlegt hatte. Somit hat die Anwendung alle Spalten verschwinden lassen. Sobald die Anwendung jedoch auf diese Spalten zugreifen wollte, griff die Anwendung ins leere.
Ich werde eine Standartansicht erzeugen und eine Fehlermeldung an diese Stelle einbauen, falls die Fields wieder nil sind.
Gruß Mexx
_________________ Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
|
|
|