Autor Beitrag
mexx
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Di 04.07.06 09:57 
Standart-Antwort: Hast du den Konstruktor aufgerufen? Field := TField.create(self);
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 11.07.06 13:38 
:gruebel:

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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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.