XbpPrintDialog()

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
guentergurland
Rookie
Rookie
Beiträge: 13
Registriert: Mo, 29. Okt 2007 18:38

XbpPrintDialog()

Beitrag von guentergurland » Mi, 29. Jan 2014 20:07

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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11350
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpPrintDialog()

Beitrag von AUGE_OHR » Do, 30. Jan 2014 0:33

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
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14504
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpPrintDialog()

Beitrag von brandelh » Do, 30. Jan 2014 6:50

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 ...
Gruß
Hubert

guentergurland
Rookie
Rookie
Beiträge: 13
Registriert: Mo, 29. Okt 2007 18:38

Re: XbpPrintDialog()

Beitrag von guentergurland » Do, 30. Jan 2014 9:29

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14504
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpPrintDialog()

Beitrag von brandelh » Do, 30. Jan 2014 9:42

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.
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11350
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpPrintDialog()

Beitrag von AUGE_OHR » Do, 30. Jan 2014 22:19

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.
gruss by OHR
Jimmy

Antworten