Autor Beitrag
Thomas Müller-Vellay
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: 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
ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 22.05.07 09:57 
Moin und :welcome: im Forum!

user profile iconThomas Müller-Vellay hat folgendes geschrieben:
ausblenden 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. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Thomas Müller-Vellay Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 22.05.07 10:39 
Moin!

Nächster Versuch: ;)
user profile iconThomas Müller-Vellay hat folgendes geschrieben:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 22.05.07 16:06 
Hallo,

teste mal das, eine Schleife bis der Webbrowser fetig ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  WebBrowser.Navigate('about:blank');  
  while WebBrowser.ReadyState < READYSTATE_INTERACTIVE then
    Application.ProcessMessages;
  //weiter

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Thomas Müller-Vellay Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: 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.

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

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: Do 24.05.07 11:33 
user profile iconStefan.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 Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: Do 24.05.07 11:35 
user profile iconMrSaint 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 24.05.07 11:54 
Titel: Re: Kein Erfolg
Hallo,

user profile iconLannes hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE then					
user profile iconThomas Müller-Vellay hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do					
:mrgreen: hab ich doch glatt eine while-then-Schleife konstruiert, aber ist ja noch mal gutgegangen 8)

Zurück zum Thema.
Ich hab mal Dein Problem nachgebaut(mit D3 und Adobe Reader 6.0):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//GetCurrentDir durch ExtractFilePath(ParamStr(0)) ersetzt, 
//da GetCurrentDir nur Arbeitsverzeichnis liefert
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 Threadstarter
Hält's aus hier
Beiträge: 11

WIN 2000, WIN XP, Linux
Delphi 5 Prof, Kylix
BeitragVerfasst: 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