PDA

View Full Version : نحوه اجرای pdf در دلفی



rasoulasaltala
چهارشنبه 13 آبان 1388, 15:50 عصر
سلام
من توی یه پروژه گیر کردم
پروژه من یه کتابخونه مجازیه با دلفیه
مشکل من اینه که نمی تونم کتابهای pdf رو اجرا کنم یعنی میخوام روی هر کتابی که کاربر کلیک کرد اون کتاب که pdf هست با acrobat باز شه ولی نمی خوام از دستور shellexecute استفاده کنم چون فقط acrobat رو باز میکنه
ممنون

دلفــي
چهارشنبه 13 آبان 1388, 16:10 عصر
سلام
من توی یه پروژه گیر کردم
پروژه من یه کتابخونه مجازیه با دلفیه
مشکل من اینه که نمی تونم کتابهای pdf رو اجرا کنم یعنی میخوام روی هر کتابی که کاربر کلیک کرد اون کتاب که pdf هست با acrobat باز شه ولی نمی خوام از دستور shellexecute استفاده کنم چون فقط acrobat رو باز میکنه
ممنون

شما می تونید هم از کامپوننت های مخصوص PDF و هم از ActivX خود Acrobat که هنگام نصب به همراه برنامه در سیستم اضافه می شه استفاده کنید .

rasoulasaltala
پنج شنبه 14 آبان 1388, 10:49 صبح
میشه بیشتر توضیح بدید

دلفــي
پنج شنبه 14 آبان 1388, 11:08 صبح
میشه بیشتر توضیح بدید

پیدا کردن , نصب و استفاده از کامپوننت رو فکر کنم خودتون می تونید انجام بدید , برای استفاده از ActiveX آکروبات هم به روش زیر اقدام کنید :

مراجعه به گزینه Import ActiveX Control در منوی Component
انتخاب Acrobat Control for ActiveX از لیست اکتیوایکس های نمایش داده شده
انتخاب گزینه ActiveX از منوی بازشوی Palette Page
کلیک بر روی Install و انتخاب سر برگ Into new package در صفحه باز شده
وارد کردن نامی مناسب برای پکیج مانند TPdf
کلیک بر روی دکمه OK

با این کار اکتیوایکس PDF به سربرگ ActiveX در منوی کامپوننت ها اضافه میشه و شما می تونید از اون در فرمتون استفاده کنید .

rasoulasaltala
شنبه 16 آبان 1388, 17:34 عصر
من این کار کردم و اکتیوایکس pdf اومد اما یه مشکل دیگه که دارم نمی دونم چطور از اون استفاده کنم یعنی
چطور باید مسیر فایل pdf رو بهش داد

دلفــي
شنبه 16 آبان 1388, 18:07 عصر
من این کار کردم و اکتیوایکس pdf اومد اما یه مشکل دیگه که دارم نمی دونم چطور از اون استفاده کنم یعنی
چطور باید مسیر فایل pdf رو بهش داد

با این دستور در زمان اجرا :


Pdf1.LoadFile(FileName:String);

rasoulasaltala
سه شنبه 19 آبان 1388, 16:54 عصر
واقعا ممنونم از جوابتون
یه مشکل دیگه هم اگه جواب بدید زحمت کم می کنیم
اینکه این activex رو ، روی هر سیستمی که میشینی باید نصب کنی یعنی اگه کسی اون activex رو نصب نکنه اون شی نمیاد و کل برنامه بهم میریزه
تصور کنید این برنامه رو بخوایم بدیم به استاد............. نمره=0

A.Nemati
سه شنبه 19 آبان 1388, 17:09 عصر
اين طبيعيه. شما به engine آكروبات نياز داريد. حالا يا بايد ActiveX اون رو نصب كنيد يا اينكه خود Adobe Reader رو. البته پيشنهاد من اينه كه خود Adobe Reader رو نصب كنيد.

rasoulasaltala
سه شنبه 19 آبان 1388, 17:25 عصر
adobe reader رو تمام سیستم هایی که من تست کردم بود مشکل اینه که باید اون activex رو تو هر سیستم نصب کرد سوال من اینه که نمیشه اون ثابت باشه مثل تمام شی های دیگه
میشه یه کم در مورد engine اکروبات توضیح بدید
یه سوال کوچولو دیگه من میخوام مثلا دو تا فرم داشته باشم که رو یکی button بذارم و روی دیگری acropdf
به این صورت که کاربر بر روی کتاب کلیک کرد کتاب در صفحه بعد با acropdf باز بشه
میشه کمکم کنید

دلفــي
سه شنبه 19 آبان 1388, 17:40 عصر
واقعا ممنونم از جوابتون
یه مشکل دیگه هم اگه جواب بدید زحمت کم می کنیم
اینکه این activex رو ، روی هر سیستمی که میشینی باید نصب کنی یعنی اگه کسی اون activex رو نصب نکنه اون شی نمیاد و کل برنامه بهم میریزه
تصور کنید این برنامه رو بخوایم بدیم به استاد............. نمره=0



برای حل این مشکل می تونید فایل اکتیوایکس آکروبات رو در کنار برنامه تون بزارید و هنگام اجرای برنامه اون رو توسط تابع زیر در سیستم طرف رجیسترش کنید :




function ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile);
lpParameters := PChar(ParamString);
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
Result:=True;
end
else Result:=False;
end;

procedure RegisterOCX(ocxPath: string);
type
TRegFunc = function : HResult; stdcall;
var
ARegFunc : TRegFunc;
aHandle : THandle;
begin
try
aHandle := LoadLibrary(PChar(ocxPath));
if aHandle <> 0 then
begin
ARegFunc := GetProcAddress(aHandle,'DllRegisterServer');
if Assigned(ARegFunc) then
begin
ExecAndWait('regsvr32','/s ' + ocxPath);
end;
FreeLibrary(aHandle);
end;
except
ShowMessage(Format('Unable to register %s', [ocxPath]));
end;
end;

rasoulasaltala
سه شنبه 19 آبان 1388, 18:07 عصر
متوجه نشدم میشه بیشتر توضیح بدید
باید این کد چی کار کنم

دلفــي
سه شنبه 19 آبان 1388, 18:35 عصر
متوجه نشدم میشه بیشتر توضیح بدید
باید این کد چی کار کنم


در رویداد OnShow یا OnCreate فرم اصلیت باید پروسیجر رجیستر کننده فایل اکتیوایکس رو با نام و مسیر فایل اکتیوایکس آکروبات فراخوانی کنی !



procedure RegisterOCX(ocxPath: string);