ورود

View Full Version : سوال: چاپ عکس پرسنلی درگزارشات



amirkazem
جمعه 26 تیر 1394, 01:53 صبح
باسلام وآرزوی قبولی طاعات وعرض تبریک فرارسیدن عیدفطر،
دربرنامه موردنظر، برای هرفرد، یک عکس پرسنلی ذخیره شده است.بادستوراتی به این ترتیب که نام عکس به کدملّی شخص تغییرداده میشه(rename) (عکس بافرمت ب ام پی دریک پوشه به نام pic ونام عکس به کدملی فردموردنظرتغییریافته وذخیره میشه)
حالامیخواهیم درگزارشاتی که مربوط به افرادهستش یاهرمورداختصاصی دیگر، درهنگام طراحی وچاپ گزارش،(بااستفاده از فست ریپورت(FastReport)) عکس فردموردنظررانیزدرگزارش داشته باشیم.
لطفاً راهنمایی بفرمایید.
متشکرم

hp1361
جمعه 26 تیر 1394, 04:14 صبح
سلام

اگر گزارش شما مربوط به یک نفر باشه می تونی عکس مربوطه رو بصورت متغیر به Fast-Report ارسال کنی:

برای اینکار:

1- ابتدا وارد گزارش ساز فست ریپورت شده و یک شیئ Picture که از نوع TfrxPictureView خواهد بود درون گزارشت قرار میدی

2- در محلی که کد نمایش گزارش رو می نویسی، یک متغیر از نوع TfrxPictureView و هم نام با شیئ ای که در مرحله قبل درون گزارش تعریف کرده بودی ایجاد میکنی

3- با استفاده از متد FindObject متغیر رو به شیئ درون گزارش مرتبط می کنی

4- به خاصیت Picture متغیر تعریف شده آدرس عکس رو میدی


procedure TForm1.Button_ShowReportClick(Sender: TObject);
var
Person_Picture: TfrxPictureView;
PersonId: Integer;
begin
Person_Picture := frxReport1.FindObject('Person_Picture') as TfrxPictureView;
Person_Picture.Picture.LoadFromFile(ExtractFilePat h(ParamStr(0)) + 'pic\' +
PersonId + '.bmp');
frxReport1.ShowReport();
end;


در اینجا Person_Picture نام متغیر ما و نیز نام شیئ Pucture ای که درون گزارش قرارداده ایم می باشد(هم نام بودن)
در اینجا PersonId شماره ملی فرد درنظر گرفته شده که شما باید خودت شماره رو اختصاص بدی
در اینجا با استفاده از ExtractFilePath(ParamStr(0)) آدرس جاری برنامه رو پیدا کرده و آدرس پوشه pic که در کنار برنامه قرارداده رو بهش اضافه کردیم


اگر هم که گزارش مربوط به چندین نفره و قصد نمایش عکس چندین نفر بصورت هم زمان رو داری که می تونی عکس ها رو در دیتابیس ذخیره کنی فست ریپورت عکس ها رو از دیتا بیس واکشی خواهد کرد(البته از دیتا ست مربوطه)


موفق باشیم.

amirkazem
شنبه 27 تیر 1394, 00:46 صبح
دوست گرامی، hp1361 باسلام وآرزوی قبولی طاعات وتبریک فرارسیدن عیدسعیدفطر،
1.طبق فرمایش شما درمحیط طراحی گزارش یک (Picture Object) اضافه کردم.
2.سپس دررویداد(onclick) باتن مربوط به نمایش گزارش، کدزیرراقراردادم.

var Person_Picture: TfrxPictureView;
PersonId: string;
begin
PersonId:=ADOQuery3['melli_code'];
Person_Picture := frxReport1.FindObject('Person_Picture') as TfrxPictureView;
Person_Picture.Picture.LoadFromFile('G:\Programing \Projects\Manager\Win32\Debug\Pics h(ParamStr(0))' + 'pics\' +
ADOQuery3['melli_code'] + '.bmp');
frxReport1.ShowReport();

آدرس عکسهای افراددربرنامه بنده (G:\Programing\Projects\Manager\Win32\Debug\Pics) ستش که درکدبرنامه هم مشاهده میشه.
ولی ابتدای ورودبه برنامه ارور زیر را میده.
133348
وپس ازورودبه بخش مربوطه نیز خطای دومی رامیده.
133349
لطفاً راهنمایی بفرمایید.قابل ذکراست که ازطریق یک (Adoquery)مشخصات دانش آموز وازطریق 2 (adoquery)دیگرمشخصات پدرومادردانش آموزرااستخراج می کنیم.
personidکه شمافرمودیدرابرابر( ['Adoquery3['melli-code') که همان کدملّی دانش آموز وهمان نام عکس موجوددرپوشه(pics)هستش قرارداده ایم.

hp1361
یک شنبه 28 تیر 1394, 09:36 صبح
سلام

اینکه در ابتدای ورود به برنامه ارور اول رو نمایش میده مربوط می شه به کدهای خودت. باید ببینی کجای کدهات دسترسی به بانک اطلاعاتی اجرا کردی در حالی که قبلش دیتاست رو Open نکردی.

در مورد کدهایی که نوشتی
1- همونطور که در بالا هم اشاره کردم، دستور زیر برای استخراج آدرس جاری برنامه است. به این معنا که برنامه Exe خودتون رو هر جای ویندوز در هر درایوی که بگذارید با این کد آدرس این محل بطور صحیح محاسبه خاهد شد

ExtractFilePath(ParamStr(0))


یعنی اگر برنامه شما در آدرس زیر قرار داشته باشه :

G:\Programing\Projects\Manager\Win32\Debug\


دقیقاً همین آدرس رو بر خواهند گرداند. دلیل استفاده از این روش اینه که ممکنه که شما برنامه رو در جاهای مختلف استفاده کنید و قرار نیست همیشه دقیقاً در آدرس ثابت G:\Programing\Projects\Manager\Win32\Debug\ قرار بگیره. لذا با این کار از بروز مشکلات بعدی جلوگیری کردیم.

چون عکس ها در پوشه Pic زیرمجموعه ادرس G:\Programing\Projects\Manager\Win32\Debug\ قرار داره با دریافت آدرس محل جاری برنامه که G:\Programing\Projects\Manager\Win32\Debug\ باشه بعلاوه Pic میرسیم به پوشه مورد نظر. اما حالا نیاز داریم که به شماره کدملی فرد که نام عکس باشه برسیم. در خط زیر کدملی رو از دیتابیس میگیریم:

PersonId:=ADOQuery3['melli_code'];


و حالا کدملی رو به انتهای ادرس قبلی اضافه می کنیم:

Person_Picture.Picture.LoadFromFile(ExtractFilePat h(ParamStr(0)) + 'pic\' +
PersonId + '.bmp');


امیدوارم متوجه روش کار شده باشید

موفق باشیم

amirkazem
سه شنبه 30 تیر 1394, 01:52 صبح
دوست گرامی ضمن تشکربینهایت ازشما،
تمام مراحلی راکه فرمودیدرامتوجه شدم ودقیقاً خطای اولی که فرمودیدمربوط به قسمت دیگری ازبرنامه هستش.ولی پس ازانجام اصلاحات(حذف آدرس برنامه)ازقسمت کدها، وجایگزینی کد:
(( ExtractFilePath(ParamStr(0)
به جای آن، درهنگام اجرای(دسترسی به گزارش مربوطه ومشاهده آن) برنامه بازهم خطای دوم(اشاره شده درفوق) ظاهرمیشه.
ضمناً؛
آیانیازی هست که درقسمت طراحی گزارش کدخاصی نوشته شودیااینکه به آبجکت (picture)آدرس خاصی داده شده یاپیشفرض تصویری ازپوشه ی (pics) انتخاب شود؟
سپاسگزارم اگرراهنمایی بفرمایید.:خجالت:

hp1361
سه شنبه 30 تیر 1394, 05:10 صبح
سلام

آیا شیئ Picture ای که درون گزارشت قرار دادی(درون دیزاینر فست ریپورت) که قاعدتا از نوع TfrxPictureView است، درون خود دیزاینر فست ریپرت خاصیت نام(Name) اش رو به Person_Picture تغییر دادی؟

در بالا هم اشاره کردم که باید آنچه در کد به گزارش مرتبط میشه هم نام باشند

amirkazem
جمعه 02 مرداد 1394, 00:34 صبح
نه متأسفانه الان تغییرمیدم ببینم چه میشه!

amirkazem
جمعه 02 مرداد 1394, 00:39 صبح
دوست بزرگوارhp1361 مشکل حل شد.
بازهم مثل همیشه لطف کردید.
بسیارسپاسگزارم

amirkazem
دوشنبه 05 مرداد 1394, 00:55 صبح
دوست عزیزhp1361ضمن تشکرمجدد، به عرض برسونم که درهنگام جستجوی دانش آموزان ویاتکمیل مشخصات، اگردانش آموزی عکس پرسنلی نداشته باشد، درهنگام جستجوهاوکوئری ها، کدی نوشته ایم

procedure TForm5.DBGrid1CellClick(Column: TColumn);beginADOTable1.Filter:='melli_code ='+QuotedStr(ADOQuery6['melli_code']);ADOTable1.Filtered := True;beginif (FileExists('pics/'+ADOTable1['melli_code']+'.bmp')) thenImage6.Picture.LoadFromFile('pics/'+ADOTable1['melli_code']+'.bmp')elseImage6.Picture.LoadFromFile('pics/no pic.png');end;end;


که فقط عکس(no pic)که درهمان پوشه ی (pics)هستش رانمایش میده وهیچ مشکلی دراین زمینه نداریم.
ولی بااین زحمتی که شماکشیدید و راهنمایی فرمودید، فقط درگزارشات عکس دانش آموزانی که برای آنان عکس اختصاص(همان بانام کدملّی که ذخیره شده است)داده شده رانمایش میدهد. واگرگزارش مربوط به دانش آموزی باشدکه تصویرندارد، بازنمیشود و خطای زیرنمایش داده می شود.
ولی درگزارشات هم می خواهیم درصورت عدم وجودعکس اختصاصی برای یک فرد، همان تصویر (no pic)در گزارش چاپ شود.

قبلاً ازمساعدت شماصمیمانه سپاسگزاری می کنم.
آرزوی توفیق

hp1361
دوشنبه 05 مرداد 1394, 11:22 صبح
سلام مجدد

برای این مشکل باید از ایده هایی که به ذهنتون میاد استفاده کنید. برنامه نویسی به غیر از Syntax که استاندارد خودش رو داره و BestPractice ها که پیشنهادات برای کدنویسی بهتره، بقیش مهندسیه. مهندسی هم یعنی خلق ایده.

شما در بالا بر اساس کددانش آموزی برای فست ریپورت مشخص می کنید که چه عکسی رو نمایش بده. همونطور که در متن هم اشاره کردید "اگر" دانش آموزی عکس نداشت عکس پیش فرضی با محتوای "فاقد تصویر" نمایش بده!

این به این معنیه که شما یه دستور if بزارید که چک کنه "اگر" اون عکسی با آن شماره دانش آموز در پوشه Pic بود پس همون شماره رو به تصویر فست ریپورت اختصاص بده و "اگر نبود" آنگاه تصویر پیش فرض "No Pic.png" رو نمایش بده.

-برای چک کردن وجود فایل هم از دستور

if FileExists(fileName)

استفاده میکنیم که filename برای شما میشه آدرس فایل+اسم فایل(که همون شماره دانش آموزه+پسوندفایل(مثلاً "png."). نحوه بدست آوردن آدرس فایل رو هم که بالاتر توضیح دادم و آشنایی(Extract....)

موفق باشیم

amirkazem
دوشنبه 19 مرداد 1394, 23:05 عصر
دوست عزیزhp1361 باسلام واحترام
بااستفاده ازکدزیز وبه کمک حضرتعالی درگزارشات متعدد، عکس پرسنلی افراد، قرارداده شد.واما مسأله ای که داریم این هستش که اگربرای فردی درهنگام ثبت نام یا هنگام ویرایش مشخصات تصویری اختصاص دادیم که نام تصویرهمان کدملی شخص می باشد، درگزارشات هم بدون خطا، عکس اختصاصی فردموردنظرنمایش داده می‌شود.ومشکل اینجاست که اگرفردی دارای عکس پرسنلی نباشدباکدزیر جای عکس فرددرگزارشات بایدخالی باشد ویاحداقل تصویری که بانام no pic ساخته شده وآنهم درهمان پوشه(pics)موجوداست، نمایش داده شود.ولی درگزارشات ما، تازمانی که افراددارای عکس هستند، عکس اختصاصی آنها نمایش داده می شود ولی برای افرادی که تصویرپرسنلی ندارند، تصویر(no pic یا همان تصویر عکس ندارد)نمایش داده نمیشود، بلکه تصویرآخرین فردی که عکس پرسنلی داردوماآن راجستجوکرده ایم، نشان داده می شودتااینکه به فردی برسیم که عکس پرسنلی داردوتصویراختصاصی نامبرده نمایش داده شود وتصویرتکراری ازبین برود.
امیدورام منظورم را خوب رسانده باشم.
ممنون میشم اگرمثل همیشه محبت بفرمایید.

sin900
دوشنبه 20 مهر 1394, 20:09 عصر
با سلام چطور میشه یک عکس را از #C به fast report ارسال کرد؟