Discussion:
TWebbrowser und PDF
(zu alt für eine Antwort)
M. Behrendt
2014-09-28 17:24:43 UTC
Permalink
Hallo mal wieder!

Ich versuche gerade, notdürftig "auf die Schnelle" ein kleines Programm zusammen zu schieben.
Und zwar geht es darum, eine PDF-Datei zu öffnen, ein paar zusätzliche Label+Edits darüber zu legen und das ganze dann an den Drucker zu schicken.

Ich scheitere schon etwas weiter vorn:
<code>
procedure TForm1.Button4Click(Sender: TObject);
var
wb: TWebBrowser;
begin
wb := TWebBrowser.Create(Form1);
TControl(wb).Parent := Form1;
wb.Width := 640;
wb.Height := 480;
wb.Top := 5;
wb.left:=5;
wb.Navigate('x:\tausch\test.pdf');
Wait('00:00:01');
end;
</code>

Beim Click auf den Button kommt die Fehlermeldung: "Die aktuellen Sicherheitseinstellungen erlauben keinen Download dieser Datei."

Gegoogelt habe ich irgendwelche Verringerungen der Sicherheitseinstellungen in den Internetoptionen.
Das kann aber nicht der Weisheit letzter Schluss sein.
Ich kann nicht auf einem normalen Rechner, der dauernd im Internet rumsurft, nur für dieses Programm die Sicherheitseinstellungen verschlechtern.

Geht das nicht auch anders?

Grüße,
Mike.
Achim Kalwa
2014-09-29 07:56:39 UTC
Permalink
Hallo,
[ Anzeige einer PDF-Datei im Web-Browser ]
Beim Click auf den Button kommt die Fehlermeldung: "Die aktuellen Sicherheitseinstellungen erlauben keinen Download dieser Datei."
Gegoogelt habe ich irgendwelche Verringerungen der Sicherheitseinstellungen in den Internetoptionen.
Das kann aber nicht der Weisheit letzter Schluss sein.
Ich kann nicht auf einem normalen Rechner, der dauernd im Internet rumsurft, nur für dieses Programm die Sicherheitseinstellungen verschlechtern.
Geht das nicht auch anders?
Wenn auf dem Ziel-System der Adobe Reader installiert ist, dann kannst
Du den als ActiveX-Control einbinden und damit die PDF-Datei darstellen:
http://delphi.about.com/cs/howto/ht/htpdf.htm

Wie das mit dem "darüberlegen" von weiteren Controls aussieht, habe ich
aber nie getestet.

HTH
Achim
M. Behrendt
2014-09-29 09:27:43 UTC
Permalink
Post by Achim Kalwa
http://delphi.about.com/cs/howto/ht/htpdf.htm
diese Variante hatte ich mir auch schon angesehen, bzw. ich hatte mich darüber belesen

zum Einen bin ich iwie zu dämlich, ein .tlb oder ein .ocx in Turbo Delphi reinzuholen (Wie geht das?)

zum Anderen hatte ich gelesen, dass die Implementation seitens Adobe nur für den IE gewährleistet wird und anderswo, also z.B. in Delphi wirklich nur zum simplen Anzeigen taugt, skalieren, drehen usw. soll grottig sein
dort stand dann auch der Tip mit dem TWebbrowser
Marc Santhoff
2014-09-29 11:46:25 UTC
Permalink
Post by M. Behrendt
Beim Click auf den Button kommt die Fehlermeldung: "Die aktuellen
Sicherheitseinstellungen erlauben keinen Download dieser Datei."
Prüf doch mal, ob der Benutzer Leserecht auf den Verzeichnissen und
Datei hat.

Marc
M. Behrendt
2014-09-29 14:13:28 UTC
Permalink
ja, alles da
neues Verzeichnis auf extra Partition, eigene Datei
alle Rechte vorhanden
M. Behrendt
2014-09-30 14:06:23 UTC
Permalink
mal was anderes dazu

nachdem ich dem TWebbrowser jetzt erstmal ein .mht zum verdauen gegeben habe (und das mit dem .pdf später kläre) hab ich noch zwei andere Fragen:

1. Kann ich aus Delphi heraus beim Compilieren eine Anwendung unter einem anderen benutzerkonto laufen lassen? Zu deutsch, ich habe ein eingeschränktes Benutzerkonto, wil jedoch die Anwendung schon zu Testzwecken als Administrator laufen lassen, geht das?

2. Ich habe wire eingangs erwähnt dem Formular ein TEdit hinzugefügt.
<code>
procedure TForm1.BDatumClick(Sender: TObject);
begin
with Form_OleCont do
begin
Datumsfeld:=TEdit.create(Form_OleCont);
Datumsfeld.top:=10;
Datumsfeld.Color:=clred;
Datumsfeld.left:=form1.Width-50;
Datumsfeld.width:=40;
Datumsfeld.height:=15;
Datumsfeld.Text:=datetostr(date());
datumsfeld.BringToFront;
Datumsfeld.Show;
end;
end;
</code>

Zur Laufzeit bei Click auf TForm1.BDatum auf ein zweites Formular "Form_OleCont" erzeugt, wie man sieht.
Allerdings wird es nicht angezeigt, wieso nicht?
Achim Kalwa
2014-09-30 14:10:10 UTC
Permalink
Post by M. Behrendt
1. Kann ich aus Delphi heraus beim Compilieren eine Anwendung unter
einem anderen benutzerkonto laufen lassen? Zu deutsch, ich habe ein
eingeschränktes Benutzerkonto, wil jedoch die Anwendung schon zu
Testzwecken als Administrator laufen lassen, geht das?
Ja; Du musst dazu die IDE bereits mit Admin-Rechten starten.
Post by M. Behrendt
2. Ich habe wire eingangs erwähnt dem Formular ein TEdit
hinzugefügt. <code> procedure TForm1.BDatumClick(Sender: TObject);
begin with Form_OleCont do begin
Datumsfeld:=TEdit.create(Form_OleCont);
Datumsfeld.Parent := Form_OleCont;
Post by M. Behrendt
Datumsfeld.top:=10; Datumsfeld.Color:=clred;
Datumsfeld.left:=form1.Width-50; Datumsfeld.width:=40;
Datumsfeld.height:=15; Datumsfeld.Text:=datetostr(date());
datumsfeld.BringToFront; Datumsfeld.Show; end; end; </code>
Zur Laufzeit bei Click auf TForm1.BDatum auf ein zweites Formular
"Form_OleCont" erzeugt, wie man sieht. Allerdings wird es nicht
angezeigt, wieso nicht?
Das Control benötigt einen Parent; siehe oben.

HTH
Achim
M. Behrendt
2014-09-30 17:33:56 UTC
Permalink
selbst dann wirds nicht gezeichnet

ich habe jetzt zusätzlich noch
Datumsfeld.Visible:=true;

und
form_oleCont.Refresh;
form_oleCont.Repaint;

eingefügt, aber es wird noch immer nicht angezeigt

Ich hab keine Ahnung, was ich nun noch tun muss, damit ich das TEdit sehe.
M. Behrendt
2014-09-30 20:50:34 UTC
Permalink
des Rätsels Lösung:
<code>
...
Datumsfeld.Show;
end;
form_oleCont.SetFocus;
form_oleCont.Refresh;
form_oleCont.Repaint;
Form1.setfocus;
...
</code>

Bei SetFocus kommt eine Exception "ein deaktiviertes oder unsichtbares Element kann nicht den Focus erhalten" o.ä.

Dann füge ich vor den with-Block ein
Form_OleCont.Visible:=true;
ein und voilá, erscheint ein zweites Fenster mit einem ähnlichen Aussehen wie das, das ich schon sehe, aber mit einem Datumsfeld.

Ich hatte zur Designzeit dem Projekt ein zweites Form mit dem Namen Form_OleCont hinzugefügt, das auch immer fein angezeigt wird.
Bei Form1.create wird aber schon ein
Form_OleCont:=TForm_OleCont.Create(Form1);
ausgeführt, das nicht das erste Form_OleCont überschreibt oder wegen dessen Existenz meckert, sondern ein zweites Form mit dem gleichen Namen aber .visible=true erzeugt. Und dort landet, wie gewollt, das Datumsfeld.

Nun brat mir einer einen Storch, warum ein Form zwei Childs mit dem gleichen Namen haben kann. Ein richtiges Standesamt würde da meckern...
Hans-Peter Diettrich
2014-10-01 02:54:52 UTC
Permalink
Post by M. Behrendt
Ich hatte zur Designzeit dem Projekt ein zweites Form mit dem Namen
Form_OleCont hinzugefügt, das auch immer fein angezeigt wird. Bei
Form1.create wird aber schon ein
Form_OleCont:=TForm_OleCont.Create(Form1); ausgeführt, das nicht das
erste Form_OleCont überschreibt oder wegen dessen Existenz meckert,
sondern ein zweites Form mit dem gleichen Namen aber .visible=true
erzeugt. Und dort landet, wie gewollt, das Datumsfeld.
Nun brat mir einer einen Storch, warum ein Form zwei Childs mit dem
gleichen Namen haben kann. Ein richtiges Standesamt würde da
meckern...
Vermutlich sind die Namen beide leer, das stört nicht. Es handelt sich
aber nicht um Kinder (childs), sondern um mehrere Instanzen - davon
können beliebig viele erzeugt werden, solange sie keinen Namen erhalten.

Das "FormOleCont" ist eine Variable, die nichts mit den Namen der darin
(nacheinander) gespeicherten Objekte zu tun hat. Daß solche globalen
Variablen für Formulare von der IDE automatisch erzeugt werden, das war
schon immer sehr umstritten - wie Du ja jetzt selbst nachvollziehen kannst.

DoDi
M. Behrendt
2014-10-06 16:10:11 UTC
Permalink
so, weiter im Text,

TWebbrowser und TOlecontainer als Member von TForm
TWebbrowser zeigt mir ein PDF, ein OleContainer zeigt mir auch ein PDF
dazu i.M. zwei TEdit ebenfalls als Member von TForm, verschieb- und füllbar im Vordergrund über den anderen beiden

man nehme
uses printers;

und
form1.Print;

aber:
der Olecontainer mit dem PDF und die beiden Edits werden gedruckt
der Webbrowser auch
aber das darin enthaltene ActiveX-Element nicht (also z.B. darin geladene PDFs, Excels, Words, usw.)

Hat da jemand eine Lösung im Auge?

Grüße,
Mike

Loading...