Autor Beitrag
bigmasterdenis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mi 12.12.07 13:48 
Hallo Leute!

Zu meinem Prog gibt es eine PDF-Hilfedatei. Am liebsten würde ich die direkt in die exe einbetten, sodass der User die Hilfe dann direkt vom Programm aus starten kann ohne zu wissen wo die PDF liegt.

Klar, ich könnte die PDF irgendwo ablegen und dann mit shellexecute aufrufen, aber dann muss sich die PDF ja an einer vordefinierten Stelle befinden um ausgeführt werden zu können.

Gibt es nicht auch einen Weg die PDF irgendwie als recourse zu behandeln? Hab nirgends was dazu gefunden :-(


Danke und Gruß
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mi 12.12.07 13:54 
Das geht schon, aber du musst die pdf-Datei dann wieder irgendwo ablegen, um sie wieder mit Shell-Execute öffnen zu können. Wieso also nicht gleich abgelegt bereitstellen?

_________________
Hallo Mutti
bigmasterdenis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mi 12.12.07 14:09 
Zitat:
Das geht schon, aber du musst die pdf-Datei dann wieder irgendwo ablegen...

Ich will sie ja direkt in der exe ablegen. Mit Bidern klappt es ja, sodass ich nicht zich bilder und eine exe habe, sondern einfach nur die exe, in welche die Bilder integriert sind.

Frage mich nur ob und wie das mit PDFs klappt.
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mi 12.12.07 14:22 
Du kannst AFAIK jeden Datentyp in einer RES-Datei integrieren:

Bsp.:
HELP RCDATA HELP.pdf

Wenn du aber keine PDF-Viewer Komponente hast, die das Einlesen aus einem Stream erlaubt, sondern du diese mit ShellExecute aufrufen willst, muss du die pdf-Datei aus der EXE vorher irgendwo ablegen.

_________________
Hallo Mutti
bigmasterdenis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mi 12.12.07 14:30 
achso is dat....

Aber
Zitat:
die pdf-Datei aus der EXE vorher irgendwo ablegen
würde mir schon reichen. Dann extrahiere ich die PDF kurz irgendwo nach temp und rufe sie dann mit shellexecute auf. Dann hat der user immer noch den Eindruck als wäre die PDF eingebettet. :-)

Dafür muss ich nur noch rausfinden wie man resources aus der exe wieder rauskriegt...
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mi 12.12.07 14:39 
SuFu benutzen (Stichwort RCDATA): Hier wird z.B. das Prinzip mit Beispielen erklärt.

_________________
Hallo Mutti
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 12.12.07 14:41 
Teile der Unit sind nicht von mir, aber ich weiß inzwischen nicht mehr was mein und was fremd ist, da es eine 5 Jahre alte Unit ist und ich sie immer wieder verändere:

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:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit uResExport;

interface

uses SysUtils, Windows, Classes, ShellApi, Dialogs, Forms;

  procedure HlpStart;

implementation

function GetTempDir: string;
var 
  Buffer: array[0..MAX_PATH] of Char;
begin 
  GetTempPath(SizeOf(Buffer) - 1, Buffer); 
  Result := StrPas(Buffer);
end;

function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var
  Res: TResourceStream;
begin
  //Result := False;
  Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
  try
    Res.SavetoFile(ResNewName);
    Result := True;
  finally Res.Free end;
end;

procedure ShellExecute_AndWait(FileName: string);
var
  ExInfo: TShellExecuteInfo;
  Ph: DWord;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with ExInfo do begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL; 
  end;

  if ShellExecuteEx(@exInfo) then begin
    Ph := ExInfo.HProcess;
  end else begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;

  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
procedure HlpStart;
var
  HLP_FILE: String;
begin
  HLP_FILE := GetTempDir + 'PopAdress.HLP';

  if ExtractRes('HLPFILE', 'FILE', HLP_FILE) then
    if FileExists(HLP_FILE) then begin
      ShellExecute_AndWait(HLP_FILE);
      DeleteFile(PChar(HLP_FILE));
    end; 
end; 

end.


Das habe ich für eine HLP Datei gemacht, aber es sollte auch mit einer PDF funktionieren.

_________________
Popov
bigmasterdenis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mi 12.12.07 14:47 
Wow, danke Leute! Das hilft mir weiter :-)