+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Access Violation nach dem Druck von Berichten mit HTML-Objekten


(Guest) #1

Hallo zusammen,
ich nutze List&Label 16 in Delphi - verwende aber nicht die VCL-Komponenten sondern lade die DLL’s und erzeuge die Komponenten dynamisch.

Um das Problem einzugrenzen habe ich ein simples Beispielprojekt erzeugt in dem sich der Fehler reproduzieren lässt mit folgendem Ablauf:

procedure TForm1.FormCreate(Sender: TObject);
begin
if LL16xLoad < 0 then
begin
Button1.Enabled := false ;
end
else
begin
LlSetDebug(1);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
LL: TL16_;
begin
LL := TL16_.Create(nil);
try
LL.Print(0, LL_PROJECT_LIST, ‘c:\temp\test.lst’, true, LL_PRINT_PREVIEW,
LL_BOXTYPE_NORMALMETER, handle, ‘test’, false, ‘’)
finally
FreeAndNil(LL);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
LL16xUnload;
end;

Der Bericht enthält lediglich ein HTML-Objekt, welches eine HTML-Datei einbindet.

Inhalt der HTML-Datei:





Freitag, 01.04.2011

Das Drucken (egal ob Vorschau oder Ausdruk auf einem Drucker) funktioniert ohne Probleme.
Laut Debwin 3 läuft alles korrekt, aber ca. 5-10 Sekunden nachdem der Druck abgeschlossen
und die Komponente freigegeben ist gibt es eine Acccess Violation.

Folgende Möglichkeiten habe ich gefunden, damit es keinen Fehler gibt:

  • “Table”-Tags aus der HTML-Datei entfernen (keine Ahnung was das damit zu tun hat,
    aber es gibt dann definitiv keine Zugriffsverletzung…)
  • vor dem Freigeben der Komponente das Programm per “sleep” 5 Sekunden warten lassen
    (auch mit “table” in der HTML-Datei).
  • die Komponente (TL16_) nach direkt nach dem Laden der DLL erstellen und erst beim
    Beenden des Programms wieder freigeben
  • Eine 2. Dummy-Komponente (TL16_) direkt nach dem Laden erzeugen und erst beim
    Beenden des Programms wieder freigeben

Auf Tabellen kann ich in der HTML-Datei nicht verzichten und alle anderen Lösungs
-möglichkeiten sind für mich nicht zufriedenstellend. (Zumal das obige Vorgehen unter
LL11 auch problemlos funktioniert hat).

Getestet habe ich das ganze auf WindowsXP 32bit und Windows 7 64bit.


(Guest) #2

Leider funktionierten die Umwege über die Dummy-Komponente und dem sleep nur in meinem Testprogramm, da dort die Ressourcen erst bei Programmende freigegeben wurden.

Werden die Ressourcen freigegeben und das Programm läuft weiter gibt es die Zugriffsverletzung.

Ich habe das Problem jetzt an den Support weitergeleitet…


(Guest) #3

Offenbar bin ich zu doof für die Anleitung, die combit hierzu zur Verfügung stellt.

Ich habe mir Dein Beispiel angesehen und wollte es bei mir ausprobieren, allerdings mit LL14, ebenfalls mit Delphi. Müsste ja trotzdem funktionieren.

Kannst Du mir verraten, wie Du Delphi dazu überredet hast, dass es LL16xLoad und LL16xUnload kennt? Mit dem kurzen Hinweis von combit

Hinweis: Für Delphi gehen Sie genau analog vor und verwenden die .PX Datei.

kann ich leider so gar nichts anfangen. Wie mache ich das?

Danke im Voraus.


(Guest) #4

Hallo,

Davon würde ich nicht ausgehen. Bei Delphi kann ichs nicht so gut beurteilen, aber in 2 Hauptversionen ändert sich schon üblicherweise ne Menge.

Was aber sicher ist, ist dass
LL_____16_____xLoad

mit einer 14er Version nicht gehen wird :wink:

Gruss,
Harry


(Guest) #5

[quote=Harald Eisen]
Was aber sicher ist, ist dass

LL_____16_____xLoad

mit einer 14er Version nicht gehen wird ;-)[/quote]

Witzbold;-)

Schon klar, dass das dann LL14xLoad und LL14xUnload heißen muss. Und eigentlich ist schon davon auszugehen, dass es mit LL14 auch gehen sollte, denn der Artikel von combit unter

[url=http://www.combit.net/knowledgebase?action=display&articleid=KBTD000594

gibt][/url] unter ‘Betrifft’ auf LL14 an.


(Guest) #6

[quote=Carmen Smolne]Offenbar bin ich zu doof für die Anleitung, die combit hierzu zur Verfügung stellt.

Ich habe mir Dein Beispiel angesehen und wollte es bei mir ausprobieren, allerdings mit LL14, ebenfalls mit Delphi. Müsste ja trotzdem funktionieren.

Kannst Du mir verraten, wie Du Delphi dazu überredet hast, dass es LL16xLoad und LL16xUnload kennt? Mit dem kurzen Hinweis von combit

Hinweis: Für Delphi gehen Sie genau analog vor und verwenden die .PX Datei.

kann ich leider so gar nichts anfangen. Wie mache ich das?

Danke im Voraus.[/quote]

Hallo Carmen,
ich hab’ auch 'ne ganze Weile gebraucht bis es lief und jetzt auch nicht alle Fallstricke im Kopf… Im Groben bin ich aber so vorgegangen:

-cmbtLL16x.pas(bzw. cmbtLL14x.pas) in die uses aufnehmen (dort stehen die Funktionen zum dynamischen laden)

-in der Unit schauen ob in der Funktion ‘LL16xModuleName’ die richtige dll steht (in den Sourcen steht bei der 16’er Version was falsches drin)

  • in der l16.pas alle Stellen die auf cmbtll16 zeigten auf cmbtll16x ändern (ich glaube dann funktionieren die Komponenten aber zur Designzeit nicht mehr - da ich alles dynamisch erzeuge ist mir das aber auch egal :wink: )

wenn ich nichts vergessen habe sollte das so funktionieren…


(Guest) #7

Da bin ich aber beruhigt, dass es dann doch nicht ganz so offensichtlich war:-)

Herzlichen Dank für Deine ausführliche Antwort. Bei der nächsten Gelegenheit werde ich ausprobieren, ob ich das mit LL14 auch hinbekomme.


(Guest) #8

Hallo Michael,

gerade wollte ich Deine Tipps ausprobieren, aber ich scheitere schon ganz am Anfang:

Auf meinem Rechner gibt es nirgends eine cmbtLL14x.pas. Ich habe mal in einem der älteren Projekte nachgesehen, noch mit LL11 bzw. LL8, da gibt es die jeweilige Datei, also cmbtLL11x.pas bzw. cmbtLL8x.pas, auch nicht. Seltsam, oder? Im Artikel von combit stand zur Version sonst nichts weiter drin, aber kann es sein, dass man dazu vielleicht eine bestimmte Edition braucht? Die 8er und 11er war eine Professional Edition, die 14er ist nur noch eine Standard Edition.


(Guest) #9

Hallo Michael,

ich habe mir jetzt doch mal die Trial von LL16 heruntergeladen, weil in meiner LL14-Installation die x-Dateien fehlen. Und siehe da, es funktioniert tatsächlich.

Ich habe mich an Deine Anleitung gehalten und alle Verweise auf cmbtll16 bzw. cmbtls16 durch Verweise auf cmbtll16x und cmbtls16x ersetzt. BTW: Das betrifft, zumindest bei mir, die beiden Dateien l16.pas und l16interf.pas. Die richtige DLL war eingetragen und es lief auch auf Anhieb.

Vielen Dank nochmal für Deine Hilfe, ohne Deine Hinweise wäre ich wirklich aufgeschmissen gewesen - mal davon abgesehen, dass ich immer noch nicht wüsste, dass uns diese Art des Zugriffs verwehrt ist mit unserer LL14-Version. Ich werde jetzt erst mal testen, ob das überhaupt den gewünschten Geschwindigkeitsvorteil bringt.

Hast Du denn mittlerweile eine Lösung für Dein Problem gefunden?


(Guest) #10

Hallo Carmen,
ich hab’ hier Version 11, 13, und 16 und bei allen sind die x-pas Dateien dabei (u.A. unter C:\Program Files (x86)\combit\LL16\Programmierbare Beispiele und Deklarationen\Delphi).

Es handelt sich dabei zwar nicht um Standard-Editionen - aber eigentlich müssten die Files dort auch dabei sein. Ansonsten frag doch mal beim Support nach.

Mein Problem mit der Zugriffsverletzung hat’ sich mit dem letzen Service-Pack erledigt. Allerdings gibt es weiterhin Probleme mit HTML-Objekten in Verbindung mit dem IE9 (LL nutzt irgendwelche Ressourcen des IE). Zu dem Thema gibt es in der Knowledgebase auch einen Artikel ( - Kurzfassung: nicht den IE 9 installieren oder auf HTML-Objekte verzichten :wink:


(Guest) #11

Hallo Michael,

Ja, hier sollten sie eigentlich liegen. Laut combit liegt der Fehler bei combit - offenbar haben wir 2009, als wir LL14 gekauft haben, ein fehlerhaftes Setup erhalten. Nur komisch, dass auch unsere LL11-Version die entsprechenden Dateien nicht hat, während Du sie hast.

Na toll. Wie willst du denn verhindern, dass der IE9 installiert wird? Das Problem hast Du aber erst mit LL16, oder? Mit LL11 war der IE9 noch kein Problem?


(Guest) #12

Ob man das verhindern kann weiß ich nicht, aber das Update auf IE9 zu deinstallieren war problemlos möglich(danach ist dann automatisch wieder der IE 8 drauf).

Der IE9 kam glaube ich erst nachdem ich auf LL16 umgestellt habe - von daher weiß ich nicht wie sich das da verhält…