Entwickler-Ecke

Windows API - PDF Viewer innerhalb meines Applikationsfensters anzeigen


gdv - Di 22.02.05 15:52
Titel: PDF Viewer innerhalb meines Applikationsfensters anzeigen
Hallo,
ich möchte in meinem Programmfenster den Arcobat-viewer anzeigen.
Dieser soll Kind-Eigenschaften aufweisen so wie das beim Aufruf eines forms möglich ist.(Begrenzung innerhalb des Programmfensters).
Bisher habe ich es über die Funktion createprocess aufgerufen. Allerdings erscheint es dabei immer in einem eigenen Fenster, bei dem ich nur grob die Größe minimal,maximal default und die Startposition xy beeinflussen kann.


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:
procedure TForm1.Button1Click(Sender: TObject);
var
  ErrorCode,ProcID: Cardinal;
begin
  StartAssociatedExe('d:\entwicklung\pdf\schaltpläne.pdf', ErrorCode);
end;

function StartAssociatedExe(FileName: stringvar ErrorCode: Cardinal): Boolean;
var
  Prg: string;
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
begin
  SetLength(Prg, MAX_PATH);
  Result := False;
  ErrorCode := FindExecutable(PChar(FileName), nil, PChar(Prg));
  if ErrorCode >= 32 then
  begin
    SetLength(Prg, StrLen(PChar(Prg)));
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    with StartupInfo do

    begin
      cb := SizeOf(TStartupInfo);
      wShowWindow := SW_SHOW;
      dwX:=50;
      dwY:=50;
    end;
    if CreateProcess(PChar(Prg), PChar(Format('%s %s', [Prg, FileName])),
      nilnil, False, NORMAL_PRIORITY_CLASS, nilnil,StartupInfo, ProcessInfo) then
    begin
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, ErrorCode);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
      Result := True;
    end
    else
      ErrorCode := GetLastError;
  end;
end;


Ich hoffe es kann mir jemand von Euch weiterhelfen.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


retnyg - Di 22.02.05 16:02

du könntest einen api-hook auf CreateWindowEx setzen.
wenn das von dir gewünschte window erzeugt wird übergibst du halt dann das handle deiner anzeigekomponente als parent.


SchelmVomElm - Di 22.02.05 16:04

Mach's doch anders:

Komponente -> ActiveX importieren

Dann "Acrobat Control für ActiveX" auswählen und installieren.

Dann solltest Du im Register "ActiveX" eine Komponente TPdf haben.


Grendel - Di 22.02.05 16:04

Bau das ActiveX Control des Acrobats ein.

Dazu einfach folgendes machen:
Komponente -> ActiveX importieren -> "Acrobat Control for Active X" auswählen und weitere Einstellungen vornehmen -> Installieren
Und schon hast Du eine PDF Komponente mit dem Namen, den Du unter "Klassennamen" eingegeben hast.

Bis neulich ...

edit: Mist zu langsam


jasocul - Di 22.02.05 16:07

Aber Vorsicht!
ActiveX der Version 7 ist nicht abwärts-kompatibel.
Das Programm soll im schlimmsten Fall abstürzen (hatte ich noch nicht). Es gibt aber mindestens eine Fehlermeldung.


SchelmVomElm - Di 22.02.05 16:07

QGrendel: Ätschi Bätsch :D


gdv - Di 22.02.05 16:23

vielen Dank,
genauso habe ich es mir vorgestellt.
mit dem pdf.ocx funzt es.
Thorsten :lol: