Autor |
Beitrag |
Thomas Müller-Vellay
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Di 22.05.07 09:27
Hallo Gemeinde,
ich habe schon viele nützliche Tipps in eurem Forum gefunden und hoffe nun auf Hilfe bei meinem Problem
Ich arbeite derzeit an einem Projekt um PDF-Files zu verbinden. Technisch ist dies kein Problem, aber ...
Der Kunde möchte natürlich vorher die entsprechenden PDF-Files visualisieren und somit einer Kontrolle unterziehen. Nun dachte ich dies wäre kein Problem. Nutze den TWebBrowser um auch gleichzeitig die Adobe-Versionsproblematik zu umgehen.
Jetzt passiert folgendes:
- Der Benutzer klickt in einer FileListBox auf das gewünschte PDF.
- Das PDF wird ordnungsgemäß im TWebBrowser angezeigt
- Der Benutzer klickt auf einen Button, dessen Funktion darin besteht
im TWeBrowser eine leere HTML-Seite anzuzeigen
den PDF-File in ein temporäres Verzeichnis zu verschieben
und ein modales Fenster aufzurufen um den entsprechenden zweiten PDF-File zum Mergen zu suchen.
Das auftauchende Problem besteht nun darin das die Verschiebung des PDF's nicht funktioniert weil er noch durch Adobe im Zugriff ist. Erst wenn die komplette Prozedur durchlaufen ist wird die leere HTML-Seite angezeigt und das PDF vom Adobe-Prozess freigegeben. Welche Möglichkeit besteht dieses Problem zu lösen?
Nebenbei bemerkt: Mit der ActiveX-Komponete funktioniert das Prozedere fast reibungslos aber sie kann nicht zum Einsatz kommen.
Zur Info, kompiliert wird mit Delphi5
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit main;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw, FileCtrl;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; FileListBox: TFileListBox; TWebBrowser1: TWebBrowser; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FileListBoxClick(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; basedir:string;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject); begin application.Terminate; end;
procedure TForm1.FormCreate(Sender: TObject); begin basedir := GetCurrentDir; end;
procedure TForm1.FileListBoxClick(Sender: TObject); begin TWebBrowser1.Navigate(FileListBox.Filename); end;
procedure TForm1.Button1Click(Sender: TObject); var basedir : string; begin basedir := GetCurrentDir; TWebBrowser1.Navigate(basedir+'\temp\leer.html'); movefile(PChar(FileListBox.Filename),PChar(basedir+'\temp\'+ExtractFilename(FileListBox.Filename))); showmessage(TWebBrowser1.LocationURL); FileListBox.Update; end;
end. |
Gruss aus Hessen
Thomas
PS: An dieser Stelle vielen Dank an die Administratoren des Forums und die guten Tipps der Mitglieder
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.05.07 09:57
Moin und  im Forum!
Thomas Müller-Vellay hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3:
| TWebBrowser1.Navigate(basedir+'\temp\leer.html'); showmessage(TWebBrowser1.LocationURL); movefile(PChar(FileListBox.Filename),PChar(basedir+'\temp\'+ExtractFilename(FileListBox.Filename))); |
|
Probier das mal so rum, wenn das klappt, dann ist der .Navigate-Call asynchron und braucht ein bischen, bis er "fertig" ist, aber du versuchst direkt schon das File zu verschieben.
Lösung: Schleife um das Verschieben und im Fehlerfall kurz warten und nochmal probieren; Abbruch mit Fehler nach X Versuchen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Di 22.05.07 10:16
Hallo,
das habe ich schon versucht, leider auch ohne Erfolg.
Wenn ich den Code mit dem Debugger durcharbeite wird die leere HTML-Seite erst geladen wenn die komplette Prozedure durchlaufen ist. Ich habe es schon mit einer sleep-Schleife versucht, weil ich auch vermutet habe das es eine gewisse Zeit braucht bis die HTML-Seite angezeigt würde.
Die Merkwürdigkeit besteht wirklich darin das erst nach dem Verlassen der Prozedur der TWebBrowser die leere HTML-Seite anzeigt.
Man könnte das Problem umgehen wenn man nach dem Aufruf einen weiteren Button klickt der die Funktionen übernimmt (movefile, showmodal, etc). Aber das kann ich keinem Anwender zumuten.
Gruss aus Hessen
Thomas
PS: Danke für den Willkommensgruß
PSS: Vergessen - Der Debugger zeigt mir als Wert für LocationURL auch nach dem Aufruf immer noch den PDF-File an, anstatt wie zu vermuten wäre den leeren HTML-File.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.05.07 10:39
Moin!
Nächster Versuch:
Thomas Müller-Vellay hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| TWebBrowser1.Navigate(basedir+'\temp\leer.html'); Application.ProcessMessages; showmessage(TWebBrowser1.LocationURL); movefile(PChar(FileListBox.Filename),PChar(basedir+'\temp\'+ExtractFilename(FileListBox.Filename))); |
|
Wie läuft´s damit?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Di 22.05.07 11:00
Hallo,
der Tipp war schon mal Gold wert. Es funktioniert wenn ich nach dem Aufruf ein sleep(1000) aufrufe - ist ja an sich kein Zustand aber besser als nix
Ich befürchte nur wenn eine größere HTML-Seite geladen wird funktioniert dies alles nicht mehr.
Ich teste nun noch ob ich den PDF-File verschieben kann - ich bin bei Adobe schon auf die merkwürdigsten Sachen gestossen.
Gruß aus Hessen
Thomas
Delphi-Quelltext 1: 2: 3: 4: 5:
| TWebBrowser1.Navigate(basedir+'\temp\leer.html'); sleep(1000); Application.ProcessMessages; showmessage(TWebBrowser1.LocationURL); movefile(PChar(FileListBox.Filename),PChar(basedir+'\temp\'+ExtractFilename(FileListBox.Filename))); |
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 22.05.07 16:06
Hallo,
teste mal das, eine Schleife bis der Webbrowser fetig ist:
Delphi-Quelltext 1: 2: 3: 4:
| WebBrowser.Navigate('about:blank'); while WebBrowser.ReadyState < READYSTATE_INTERACTIVE then Application.ProcessMessages; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Do 24.05.07 09:48
Titel: Kein Erfolg
Hallo und guten Morgen,
der angedachte Workaround funktioniert leider nicht. Ich denke das ist auch nicht verwunderlich weil der TWebbrowser ja nicht als Prozess neu bearbeitet wird und somit auch kein Prozessende ausgewertet werden kann.
Das der angesprochene Webbrowser intern auf die ActiveX-Komponete zugreift kann man somit leider nicht abfangen.
Delphi-Quelltext 1: 2: 3:
| WebBrowser.Navigate('about:blank'); while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages; |
Aber wir geben nicht auf  vielleicht finden wir ja noch eine Lösung.
Gruß aus Hessen
Thomas
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Do 24.05.07 10:04
Probier doch mal aus, ob du die PDF-Datei kopieren kannst, statt sie zu verschieben. Wenn das geht, kannst du nach dem Kopieren noch einen Timer anlegen, der jede Sekunde oder so versucht, die Originaldatei zu löschen.
Stefan
_________________ Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Do 24.05.07 10:44
Was wenn du den Webbrowser freigibst und wieder neu erzeugst? Der müsste das Adobe-ActiveX dann eigentlich abschießen und du hast kein Stress mehr  Fände ich ne bessere Lösung als mit Sleep... weil das ist immer so ungenau... Lass das mal auf ner langsameren Maschine laufen und dann passt die Wartezeit nicht mehr...
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Do 24.05.07 11:33
Stefan.Buchholtz hat folgendes geschrieben: | Probier doch mal aus, ob du die PDF-Datei kopieren kannst, statt sie zu verschieben. Wenn das geht, kannst du nach dem Kopieren noch einen Timer anlegen, der jede Sekunde oder so versucht, die Originaldatei zu löschen.
Stefan |
Hallo Stefan,
kopieren ist kein Problem. Deinen Vorschlag habe ich auch schon in Erwägung gezogen. Hierbei könnte jedoch das Problem auftauchen das ich in eine Endlosschleife gerate. Das lässt sich sicher auch lösen ( nach n-Umläufen break oder so).
Wenn gar nichts funktioniert werde ich es wohl auch so umsetzen müssen.
Wir lassen nicht locker
Gruß aus Hessen
Thomas
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Do 24.05.07 11:35
MrSaint hat folgendes geschrieben: | Was wenn du den Webbrowser freigibst und wieder neu erzeugst? Der müsste das Adobe-ActiveX dann eigentlich abschießen und du hast kein Stress mehr Fände ich ne bessere Lösung als mit Sleep... weil das ist immer so ungenau... Lass das mal auf ner langsameren Maschine laufen und dann passt die Wartezeit nicht mehr...
MrSaint |
Dein Ansatz ist nicht schlecht - habe ich auch gleich versucht. Aber ich bekomme ein vernichtendes Ergebniss
"Zugriffsverletzung bei Adresse blablabla"
Und diese Meldung bekomme ich egal welche Methode ich versuche um den TWebBrowser zu beenden.
Wir werden immer hartnäckiger
Gruß aus Hessen
Thomas
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Do 24.05.07 11:54
Titel: Re: Kein Erfolg
Hallo,
Lannes hat folgendes geschrieben: |
Delphi-Quelltext 1:
| while WebBrowser.ReadyState < READYSTATE_INTERACTIVE then | |
Thomas Müller-Vellay hat folgendes geschrieben: |
Delphi-Quelltext 1:
| while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do | |  hab ich doch glatt eine while-then-Schleife konstruiert, aber ist ja noch mal gutgegangen
Zurück zum Thema.
Ich hab mal Dein Problem nachgebaut(mit D3 und Adobe Reader 6.0):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser.Navigate(FileListBox.Filename); end; procedure TForm1.Button2Click(Sender: TObject); begin WebBrowser.Navigate('about:blank'); Movefile(PChar(FileListBox.Filename), PChar(ExtractFilePath(ParamStr(0))+'\temp\' +ExtractFilename(FileListBox.Filename))); end; | es funktioniert, keine Probleme beim Verschieben der PDFs.
Dabei fällt mir wieder ein das ich auch mal mit der PDF-ActiveX-Komponente experimentiert habe. Das Ergebnis war das ab dem Zeitpunkt(auch nachdem ich die PDF-ActiveX-Komponente wieder entfernt habe) die WebBrowser-ActiveX-Komponente mit PDFs auf dem Rechner ähnliche Probleme bereitet hat. Habe das Problem nicht beseitigen können, hat sich aber erledigt, da der Rechner ausgetauscht wurde.
Besteht das Problem auch bei anderen Documenten xls, doc ...?
Schon mal versucht über das Ereignis OnNavigateComplete2 eine Lösung zu finden?
Funktioniert es auch auf anderen Rechnern nicht?
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Thomas Müller-Vellay 
Hält's aus hier
Beiträge: 11
WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
|
Verfasst: Do 24.05.07 15:24
Titel: Re: Kein Erfolg
Nochmals ein Hallo,
um die Frage zu beantworten ob die Merkwürdigkeit auch bei anderen Dokumenten besteht: Definitiv Nein!! Wieso auch immer.
Ich habe es mit einigen XML-Dateien getestet und dort funktioniert alles so wie gewünscht.
Eine Portierung des Programms auf andere Rechner (mit Adobe Reader 8 und 7) hat den gleichen Effekt zur Folge.
XML-Files lassen sich moven - PDF-Dateien nicht.
Ich glaube ich werde Stefans Idee aufnehmen und ausbauen.
Gruß aus dem sonnigen Hessen
Thomas
|
|
|