PDA

View Full Version : سوال: گذاشتن عکس بر روی فرم



kamran749
یک شنبه 18 مرداد 1394, 12:13 عصر
سلام بر اساتید و دوستان عزیزی که در این سایت عالی ، زحمت می کشند.
من چند مشکل دارم که امیدوارم با کمک و راهنمایی شما اساتید محترم ، کاملا بر طرف شود. لازم به توضیح است که این سایت و بسیاری از سایتها را زیر و رو کرذه ام ؛ اما آن نتیجه دلخواه را بدست نیاورده ام و امیدوارم این بابی شود که در اینجا این مشکلات برای همه تازه کارانی مثل من برای همیشه حل شود و دیگر سئوالی باقی نماند.
ضمنا اگر این سئوالات و مشکلات باید در جای دیگری بازگو شود به بزرگواری خودتان ببخشید و بگویید تا به آن جا منتقل نمایم.
مواردی که می خواهم در جواب سئوالاتم در نظر گرفته شود اینکه: بانک اطلاعاتمSQLite است و میخواهم در راهنمایی از دستورات SQL استفاده نمایید. برای اتصال به بانک هم از ADOConnection و ADOQuery و DataSource استفاده شود.
اما سئوال اول:
مشکل اولم گذاشتن عکس بر روی فرم است. میخواهم یک پوشه به نام Image کنار برنامه داشته باشم و تمام عکسها با فرمتهای مختلف مانند ,jpg, png bmp و ... را داخل آن بریزم و آدرس آنها در بانک اط ذخیره شود و عکس بر روی فرم نشان داده شود.

لطفا برنامه کوچکی طراحی کنید که روی آن دو EditBox نام و فامیل باشد و یک کادر Image داشته باشد و با توجه به مطالب بالا بتوان عکس را در کادر نمایش داد و سه دکمه وجود داشته باشد که بتوان به آن عکس اضافه نمود یا عکس را حذف نمود یا عکس را تغییر داد و دوباره آنرا ذخیره نمود. (مانند برنامه دفتر تلفن)
عزیزان از همه شما که دلسوزانه راهنمایی میکنید با تمام وجود سپاسگذارم و برایتان سلامتی و طول عمر ، از خداوند تقاضا دارم.
باز هم ممنون و متشکر

idehrayan
جمعه 23 مرداد 1394, 10:57 صبح
سلام
چن وقت پیش واسه یکی از برنامه هام این قطعه کد رو نوشتم تقریبا همون چیزیه که شما میخواهید
البته واسه تصاویر jpg هستش
کد زیر برای ذخیره تصاویر در پوشه picture

procedure TForm4.img4Click(Sender: TObject);
Var
S, T: TFileStream;
Begin
if dbedt3.Text='' then showmessage('لطفاَ مقدار فیلد نام را وارد نمائید .تصویر با این نام ذخیره می گردد.')
else
if dlgOpen1.Execute then
begin

S := TFileStream.Create( dlgOpen1.FileName, fmOpenRead );
try
T := TFileStream.Create( ExtractFilePath(Application.ExeName)+'picture\'+db edt3.Text+'.jpg',fmOpenWrite or fmCreate );
try
T.CopyFrom(S, S.Size ) ;
finally
T.Free;
end;
finally
S.Free;
end;
end;


این هم برای بارگذاری تصویر و خواندن از پوشه picture

procedure TForm4.dbedt3Change(Sender: TObject);
begin

if fileexists(ExtractFilePath(Application.ExeName)+'p icture\'+dbedt3.Text+'.jpg')=true then
img4.Picture.LoadFromFile(ExtractFilePath(Applicat ion.ExeName)+'picture\'+dbedt3.Text+'.jpg');

end;

kamran749
جمعه 13 شهریور 1394, 08:17 صبح
سلام
از اینکه پاسخ دادی ممنونم. اما یکبار دیگر سئوال بنده را مطالعه بفرمایید.
ما پوشه عکسها را در کنار برنامه داریم و عکسها از قبل در آن ذخیره شده اند و حالا ما فقط می خواهیم عکسها را به کنترل Timge متصل نماییم و بعد با مرور دبی گرید ، عکس هر فرد به همراه مشخصاتش نمایش داده شود.
اگر لطف نمایید و با بانک اکسس یک برنامه کوچک مثل دفترچه تلفن بنویسی ، خیلی محبت نموده اید(با دستورات Sql و فقط آدرس عکسها در بانک ذخیره شود نه خود عکس). باز هم متشکر :تشویق:

hamedjim
جمعه 13 شهریور 1394, 10:29 صبح
من برای یه برنامه که فیلد یونیک و مشخصی نداشت این کار رو کردم:
لحظه‌ای که عکس انتخاب میشد تازیخ و زمان رو به عنوان اسم منحصر بفردی (مثلا 940613111025) در متغیری می‌ریختم و پسوند عکس هم با توجه به نوع عکس انتخاب شده تعیین می‌شد و در ادامه عنوان عکس قرار می‌گرفت (940613111025.jpg) و عکس رو با این اسم به محل فولدر تصاویر کپی می‌کردم. و بعد این متغیر رو در فیلد مربوط به تصویر فرد ( که البته یک فیلد رشته‌ای بود) می‌ریختم.
هر زمان هم که نیاز به فراخوانی اطلاعات بود، همه مشخصات در DBGrid نمایش داده می‌شد و عنوان عکس مربوطه از طریق فیلد تصویر مشخص و در TImage مربوط به خودش نمایش داده مبشد.

hp1361
جمعه 13 شهریور 1394, 11:01 صبح
سلام

برنامه شما شامل دو قسمت میشه
1- ذخیره اطلاعات جدید (شامل نام و نام خانوادگی)در دیتابیس و عکس مربوطه در پوشه
2- نمایش تصاویر مربوط به نام و نام خانوادگی(تصاویری که در پوشه قرار دارند و نام و نام خانوادگی ای که در دیتابیس ذخیره شده اند)

ذخیره سازی از اطلاعات فردی که کار خاصی نست و براحتی می تونی انجام بدی. نکته مهم نحوه تعیین نامگذاری عکس ها ست. شما میتونید از ترکیب نام و نام خانوادگی و یا یک شماره یونیک مثلا شماره رکورد استفاده کنید. اما پیشنهاد من استفاده از کدملی ست. یعنی هر رکورد جدیدی که ایجاد شد عکس مربوطه با شماره ملی نامگذاری بشه و در پوشه عکس ها ذخیره بشه. به طبع شما باید کد ملی رو نیز در دیتابیستون ذخیره کنید. برای ذخیره عکس هم میتونید از روشی که دوستمون idehrayan گفتند استفاده کنی

برای نمایش هم در زمان درخواست کاربر(مثلا فشردن یک دکمه) کدملی اون فرد رو از بانک داشته باشید و عکس رو در کنترل ایمیج نمایش بدید.(اینکه اسامی افراد چطور لیست بشن به ایده شما بستگی داره. میتونید از DBGrid یا ComboBox ووو استفاده کنید)

موفق باشیم

kamran749
شنبه 14 شهریور 1394, 09:30 صبح
سلام
از هر سه شما بزرگواران که وقت گذاشتید و جواب دادید، متشکرم. کد ملی ایده خوبی است. البته من در مورد ثبت مشخصات فردی در جدول و نشان دادن آن در دبی گرید مشکلی ندارم. من می خواهم بعد از اینکه عکس را در پوشه کنار برنامه ذخیره کردم ؛ آدرس عکس را در فیلد مربوطه که رشته ای است ، ذخیره کنم و روی کنترل Timage فرم شخص نشان دهم. کدهای این قسمت را بلد نیستم. اگر محبت نمایید و کدها یا برنامه ای بنویسید که عکسهای با فرمت jpg, png, bmp را بتوانم در پوشه ریخته و روی فرم نشان دهم خیلی ممنون می شوم. با داشتن یک دکمه حذف عکس و یکی هم برای ویرایش یا تعویض عکس. :لبخندساده:

hamedjim
شنبه 14 شهریور 1394, 15:59 عصر
خب اگر در برنامه شما وارد کردن کد ملی اجباری هست، این کد رو میشه به این شکل نوشت:

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


uses
..., Jpeg, pngimage, GIFImg;


بعد در Button مربوط به دریافت عکس (رویداد OnClick) این کد:


var
Path1, Path2: String;
begin
OpenDialogImage.Execute();
if OpenDialogImage.FileName<>'' then
begin
PictureName:= EditNationalID.Text + ExtractFileExt(OpenDialogImage.FileName);
Path1:= OpenDialogImage.FileName;
Path2:= 'Images\' + PictureName;
CopyFile(PChar(Path1),PChar(Path2), False);
Image1.Picture.LoadFromFile(Path2);
end;
end;


و در نهایت زمان ذخیره اطلاعات در دیتابیس :



with ADO do
begin
FieldByName('Name').Value:= EditName.Text;
FieldByName('SName').Value:= EditSName.Text;
FieldByName('NationalID').Value:= EditNationalID.Text;
FieldByName('Picture').Value:= PictureName;
end;


متغیر PictureName به صورت رشته ای و پابلیک در فرم تعریف میشه.

هر زمان هم که نیاز به نمایش عکس داشتی، با خوندن اطلاعات مربوط به فیلد Picture در متغیر PictureName، تصویر رو از مسیر 'Image\' + PictureName ننشون میدی.


البته شرط‌هایی مثل بررسی وارد شدن کد ملی قبل از دریافت عکس، یا بررسی صحت کپی شدن عکس در مسیر مورد نظر رو هم به برنامه اضافه کن.

ابوالفضل عباسی
یک شنبه 15 شهریور 1394, 15:07 عصر
با سلام خدمت شما دوست عزیز
در بانک access یک فیلد رو تعریف کن فقط نوعش رو بگذار OLE Object بعد هر چیزی قبول میکنه با این تفاوت که باید با برنامه نویسی بهش بگی که این فیلد رو چه طوری نمایش بده
به نظر بنده بهتره از نمونه کد های دوستان استفاده کنی چون این روش خیلی پیچیدگی داره:اشتباه:

kamran749
دوشنبه 16 شهریور 1394, 16:38 عصر
دوست عزیز آقای hamedjim سلام
از لطف شما متشکرم. با کدهای شما کارم راه افتاد ؛ اما برخی موارد هست که در حین کار پیش می آید که امیدوارم مرا راهنمایی کنید. از جمله:
1- وقتی کد ملی را وارد و OpenDialogImage را باز و عکس را اوپن می کنم ، قبل از ذخیره کردن مشخصات و ناخواسته ، عکس با کد ملی در پوشه Images ذخیره می شود. با اینکه برایش شرط هم گذاشته ام. کد را می گذارم ، لطفا بررسی و راهنمایی بفرمایید یا کامل کنید.

procedure TForm_Moshakhsat.ButtonLoad_PicClick(Sender: TObject);
var
Path1, Path2: String;
begin
OpenDialogImage.Execute();
if OpenDialogImage.FileName <>'' then
begin
PictureName:= EditNationalID.Text + ExtractFileExt(OpenDialogImage.FileName);
Path1:= OpenDialogImage.FileName;
if (EditNationalID.Text <> '')then //در صورتی که کد ملی خالی نباشد
begin
Path2 := 'Images\' + PictureName;
CopyFile(PChar(Path1),PChar(Path2), False);
Image1.Picture.LoadFromFile(Path2);
end
else
begin
ShowMessage('کد ملی نباید خالی باشد');
EditNationalID.SetFocus;
end;
end;
end;



2- کد نمایش عکسها ، در فرم اصلی و هنگام مرور دبی گرید را نیز در DataSource1DataChange نوشتم که مشکلی ندارد و عکسها را نمایش می دهد ؛ ولی وقتی توسط فرم مشخصات ، اطلاعات و عکس جدیدی را وارد و ذخیره می کنم، دیگر Timage عکسها را نشان نمی دهد و باید یکبار برنامه را ببندم و باز کنم که درست شود. ریفرش ADOQuery هم گذاشتم که تاثیری نداشت. لطفا راهنمایی کنید یا اگر کد نمایش عکس بهتری سراغ دارید ، برایم بنویسید. خیلی ممنون :لبخندساده:

kamran749
دوشنبه 16 شهریور 1394, 16:45 عصر
با سلام خدمت شما دوست عزیز
در بانک access یک فیلد رو تعریف کن فقط نوعش رو بگذار OLE Object بعد هر چیزی قبول میکنه با این تفاوت که باید با برنامه نویسی بهش بگی که این فیلد رو چه طوری نمایش بده
به نظر بنده بهتره از نمونه کد های دوستان استفاده کنی چون این روش خیلی پیچیدگی داره:اشتباه:

سلام
این روش را بلدم. در این روش عکسها داخل بانک ذخیره می شوند و بانک سنگین و کند می شود. به هر حال ممنون

hamedjim
دوشنبه 16 شهریور 1394, 19:58 عصر
در مورد سوال اول، این کاملا طبیعه هست که تصویر در پوشه Image ذخیره بشه.
برای اون چیزی که مدنظرت هست، باید Path1 رو به صورت پابلیک تعریف کنی و دستور If رو به محل ذخیره منتقل کنی. در واقع دستور CopyFile ، فایل رو از مسیر Path1 که توسط ImageDialog تعیین شده، به مسیر Path2 که در پوشه Image هست منتقل می کنه.


منظورت از سوال دوم رو هم به خوبی متوجه نشدم.

kamran749
سه شنبه 17 شهریور 1394, 06:02 صبح
سلام
در مورد سوال اول: در محل ذخیره If گذاشته ام ، اما عکس ناخواسته و به محض وارد شدن کد ملی در پوشه Images ذخیره می شود.
سوال دوم: من یک فرم اصلی دارم که درآن یک دبی گرید دارم و مشخصات همه افراد را نشان می دهد از جمله عکس فرد ؛ وقتی فردی را از طریق فرم جدیدی به لیست اضافه میکنم ؛ دیگر عکس افراد نمایش داده نمی شود و باید برنامه را باز و بست نمایم. کد نمایش عکسها را در زیر می گذارم ، بررسی و راهنمایی بفرما. خیلی ممنون



procedure TFormMain.DataSource1DataChange(Sender: TObject; Field: TField);
begin
Try
if (ADOQuery1.State <> dsinsert) then
ImagePreview.Picture.LoadFromFile('Images\' + PictureName
+ ADOQuery1.FieldByName('Picture').AsString);
Except
ImagePreview.Picture := nil;
end;
end;

kamran749
چهارشنبه 18 شهریور 1394, 16:08 عصر
دوست عزیز آقای hamedjim سلام
مشکل دومم حل شد. ولی مشکل اولم هنوز پا برجاست. عکس هنوز ناخواسته در پوشه Images ذخیره می شود. گفته بودی که if را بردار و در محل ذخیره اطلاعات بگذار. من هم همین کار را کردم ؛ ولی مشکل بدتر شد ؛ چون این بار عکس ناخواسته و بدون اسم در پوشه ذخیره می شود.
لطفا راهنمایی کن یا کد را برایم اصلاح نما. :گیج: واقعا ازت ممنونم. :تشویق:

hamedjim
پنج شنبه 26 شهریور 1394, 10:57 صبح
چند روزی نبودم.
همون‌طور که گفتم می‌تونی دستور CopyFile رو از اون کد حذف کنی و بیاریش تو قسمت ذخیره در ADO
اگه هنوز مشکلت رفع نشده، کدهات رو بذار با هم چک کنیم