PDA

View Full Version : سوال: طریقه استفاده از یک اشاره گر به فایل pdf



sajioo
دوشنبه 25 مهر 1390, 11:23 صبح
سلام دوستان گرامی
من یک فایل pdf را ریسورس کردم ، و می خوام اون فایل رو توسط کامپوننت acropdf نشان بدم.
برای نشان دادن pdf معمولی از کد

AcroPDF1.LoadFile('D:\delphi program\resorce\password1.pdf');
استفاده می کنم.
اما من چون فایل pdf مورد نظرم رو به صورت ریسورس کردم و به آن یک اشاره گر وصل کردم وقتی از نام اشاره گر استفاده می کنم ارور میده که باید از رشته استفاده کنید.
آیا راهی برای حل این مشکل است؟
کد برنامه من به صورت زیر است.



var
Form1: TForm1;
pdfo: pointer;
implementation
function GetResourceAsPointer(ResName: pchar; ResType: pchar;
out Size: longword): pointer;
var
InfoBlock: HRSRC;
GlobalMemoryBlock: HGLOBAL;
begin
InfoBlock := FindResource(hInstance, resname, restype);
if InfoBlock = 0 then
raise Exception.Create(SysErrorMessage(GetLastError));
size := SizeofResource(hInstance, InfoBlock);
if size = 0 then
raise Exception.Create(SysErrorMessage(GetLastError));
GlobalMemoryBlock := LoadResource(hInstance, InfoBlock);
if GlobalMemoryBlock = 0 then
raise Exception.Create(SysErrorMessage(GetLastError));
Result := LockResource(GlobalMemoryBlock);
if Result = nil then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
{$R *.dfm}
{$R file4.res}

procedure TForm1.FormCreate(Sender: TObject);

var
size: longword;
begin

pdfo := GetResourceAsPointer('pdf', 'pdf', size);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
AcroPDF1.LoadFile(pdfo) ;

end;


ممنون میشم اگه کسی بلد هست من را نیز راهنمایی کنه.
راستی دوستان می دونم میشه فایل pdf رو جای ذخیره کرد و سپس استفاده کرد اما من نمی خوام این کار رو کنم و می خوام به صورت همین اشاره گر و بدون ذخیره سازی فایل pdf بر روی هارد این کار انجام بدم.

vcldeveloper
دوشنبه 25 مهر 1390, 12:06 عصر
راستی دوستان می دونم میشه فایل pdf رو جای ذخیره کرد و سپس استفاده کرد اما من نمی خوام این کار رو کنم و می خوام به صورت همین اشاره گر و بدون ذخیره سازی فایل pdf بر روی هارد این کار انجام بدم.
اون چیزی که تعیین میکنه شما چطوری میتونید فایل PDF رو لود کنید، رابط برنامه نویسی کتابخانه مورد استفاده تان (AcroPDF) هست. اگر این کتابخانه فقط اسم فایل رو به عنوان ورودی قبول میکنه، باید بهش اسم فایل بدید. نمیشه که یک متد بگه اسم فایل رو میخواد، شما بهش یه اشاره گر بدید، و انتظار داشته باشید کار کنه! اگر اون کتابخانه مکانیزمی برای لود کردن داده ها از طریق Stream ارائه میکنه، اون وقت می تونید از TResourceStream استفاده کنید.

sajioo
دوشنبه 25 مهر 1390, 12:19 عصر
خوب آیا کامپوننتی نیست که من بتونم فایل pdf رو با یک اشارهگر نشون بدم؟ این که نمیشه گویا
راستی آقای کشاورز مگه این اشاره گر یک آدرس نیست؟ چطور نمیشه از او استفاده کرد؟
توی تابع sndPlaySound نوع اول PAnsiChar است اما از یک pointer استفاده شده و جواب داد. چطور این موضوع را میشه تفسیر کرد؟:متفکر:

vcldeveloper
دوشنبه 25 مهر 1390, 14:44 عصر
راستی آقای کشاورز مگه این اشاره گر یک آدرس نیست؟ چطور نمیشه از او استفاده کرد؟
چون اینها ارتباطی با هم ندارند؛ اون کتابخونه میگه یک آدرس فایل بهش بدید، بعدش خودش فایل رو از اون آدرس لود میکنه. پس انتظار آدرس یک فایل در قالب string را از شما داره. چیزی که شما بهش میدید، آدرس یک خانه از حافظه است، که نه ارتباطی با آدرس فایل داره و نه نوع اش string هست. پس طبیعی هست که همچین چیزی کار نکنه. بر فرض هم اگر کامپایلر اجازه نوشتن همچین کدی را می داد، اون کتابخانه باهاش کار نمی کرد، چون به جای آدرس فایل برای لود شدن، شما دارید فایل لود شده رو بهش تحویل میدید.



توی تابع sndPlaySound نوع اول PAnsiChar است اما از یک pointer استفاده شده و جواب داد. چطور این موضوع را میشه تفسیر کرد؟
PAnsiChar یعنی یک اشاره گر به یک کارکتر؛ پس PAnsiChar نوعی از اشاره گر هست. Pointer یعنی یک اشاره گر به داده ایی که نوع اش مشخص نیست؛ پس هر دو اشاره گر هستند.

mohsen24000
سه شنبه 26 مهر 1390, 09:49 صبح
برای اینکه بتونید به روشی که مد نظرتون هست فایل پی دی اف رو نمایش بدید کامپوننت xpdf به کارتون میاد.
بنده با همین کامپوننت کتابخانه الکترونیکی نوشتم که فایلهای پی دی اف رو از بانک اطلاعات به صورت stream میخونه و نمایش میده.