Seite 1 von 1

XbpPrintDialog()

Verfasst: Mi, 29. Jan 2014 20:07
von guentergurland
Hallo,

zunächst Allen viel Erfolg in 2014.

Ich habe seit kurzem ein Problem und hoffe jemand kann mir einen Tip geben.

Auf einem PC laufen 2 Programme. Beide identisch (dll, lib, ch, xBase-Version, etc.)
Der Programmcode für die Druckerausgabe ist bei beiden identisch.

Code: Alles auswählen

FUNCTION PRINTER_WAHL( oDlg0 )

 LOCAL oPrinter, oDlg, aPrintPara[7]

 oPrinter := XbpPrinter():new()

 IF oPrinter:list() == NIL
   FEHL_TEXT( oDlg0, 300, "Kein Drucker installiert.", .F.)
   RETURN ( {} )
 ENDIF

 oDlg := XbpPrintDialog():new( oDlg0 ):create()

 oPrinter := oDlg:display()

 IF oPrinter==NIL
   RETURN ( {} )
 ENDIF

......................

Ich versuche aus Programm1 zu drucken, kein Problem. Das Dialogfenster von Windows (Druckerauswahl) erscheint.

Ich versuche aus Programm2 zu drucken, Absturz. Fehlermeldung :

BASE/5
... interne Datenbankstruktur beschädigt ....
XBPPRINTDIALOG:DISPLAY(428)

Danach folgen Angaben zu Funktionsaufrufen.

An dieser Stelle erfolgt der Absturz :

Code: Alles auswählen

oPrinter := oDlg:display()
Das Programm2 muß über den Taskmanager beendet werden.


Das Merkwürdige : Ich starte danach das Programm2 neu, wähle wieder Ausgabe, aber diesmal zunächst Ausgabe als Datei. Kein Problem. Danach versuche ich zu drucken, auch kein Problem.

Für jeden Tip wäre ich dankbar.

Günter

Re: XbpPrintDialog()

Verfasst: Do, 30. Jan 2014 0:33
von AUGE_OHR
hi,

Code: Alles auswählen

oPrinter := XbpPrinter():new()
und wo ist das o:Create() ?

Code: Alles auswählen

oPrinter := oDlg:display(<oXbpPrinter>)
wenn du vorher ein XbpPrinter Object schon angelegt hast dann solltest du es auch übergeben und nicht "überschreiben" denn das ist kein o:Destroy()

p.s. nach einem Absturz ist auch der Speicherbereich nicht mehr im Zugriff

Re: XbpPrintDialog()

Verfasst: Do, 30. Jan 2014 6:50
von brandelh
Hi,

da er nur oPrinter:list() aufruft, ist das kein Problem und solange man KEIN :create() ausgeführt hat, kann auch kein :destroy() nötig sein.

Aber ich sehe hier ein Problem, sobald der Befehl oPrinter:list() NIL zurückgibt !
Das kann passieren !
Ebenso wird oPrinter selbst nicht zurückgegeben, vermutlich wurde die Zeile RETURN oPrinter hier vergessen.

Code: Alles auswählen

FUNCTION PRINTER_WAHL( oDlg0 )
   LOCAL oPrinter, oDlg, aPrintPara[7]
   oPrinter := XbpPrinter():new()
   IF empty(oPrinter) .or. oPrinter:list() == NIL
      FEHL_TEXT( oDlg0, 300, "Kein Drucker installiert.", .F.)
      RETURN ( {} )
   ENDIF
   oDlg := XbpPrintDialog():new( oDlg0 ):create()
   oPrinter := oDlg:display()
   IF oPrinter==NIL
      RETURN ( {} )
   ENDIF
RETURN ...

Re: XbpPrintDialog()

Verfasst: Do, 30. Jan 2014 9:29
von guentergurland
Hallo,

zunächst Danke für Eure schnellen Antworten.
Aber das Problem, ist doch folgendes :
Wieso funktioniert es in dem einen Programm und in
dem anderen nicht ? Beide Programme laufen auf dem gleichen PC, es gibt
also Hard- und Software-seitig keine Unterschiede.
Das Programm, das den Fehler hervorruft, läuft auf vielen anderen PC's seit
Jahren problemlos. Es muß also andere Ursachen haben.

Günter

Re: XbpPrintDialog()

Verfasst: Do, 30. Jan 2014 9:42
von brandelh
guentergurland hat geschrieben:... interne Datenbankstruktur beschädigt ....
ich vermute du meinst die berüchtigte ... interne Datenbankstruktur beschädigt ....
Diese entsteht, wenn auf eine DLL / Systemresource zugegriffen wird, die nicht sauber initialisiert wurde.

Dass beide Programme auf dem gleichen PC laufen könnte ein Grund für die Fehlermeldung sein.
Wenn es NUR auf diesem PC geschieht, könnte ein Fehler im Druckertreiber vorliegen.

Daher mein Rat, immer prüfen ob ein Objekt eventuell NIL ist, bevor man darauf zugreift.

Re: XbpPrintDialog()

Verfasst: Do, 30. Jan 2014 22:19
von AUGE_OHR
brandelh hat geschrieben:da er nur oPrinter:list() aufruft, ist das kein Problem und solange man KEIN :create() ausgeführt hat, kann auch kein :destroy() nötig sein.
YUP ...
ich wollte primär sehen "wie" er ein Create() ausführen würde

Code: Alles auswählen

IF oDC:Create( cPrinter ) == oDC           // = self
und wie er den XbpPresSpace() damit verknüpft und natürlich wie er alles wie er frei gibt.

so wie ich das sehe bedeute die Fehlermeldung das die Objecte nicht freigegeben wurden und deshalb die "Structur zerstört" ist.