PDA

View Full Version : سوال: نحوه قرار دادن تصاویر داخل Image list در یک کنترل Image



hadisalahi2
چهارشنبه 11 اردیبهشت 1387, 08:06 صبح
سلام به همگی دوستان.
چطوری میشه تصاویر یک ImageList رو داخل یک کنترل Image قرار داد؟

B-Vedadian
چهارشنبه 11 اردیبهشت 1387, 09:28 صبح
ABMP := TBitmap.Create;
ImageList1.GetBitmap(ABMP, 0);
Image1.Picture.Graphic.Assign(ABMP);
ABMP.Free;

hadisalahi2
چهارشنبه 11 اردیبهشت 1387, 09:35 صبح
متغیر ABMP رو از چه نوعی تعریف کنم؟
من از نوع Tbitmap تعریف کردم ، ولی در خط دوم خطای تبدیل نوع میده
نمیتونه Integer رو به Tbitmap تبدیل کنه
؟؟؟؟؟؟؟؟؟؟؟؟؟

vcldeveloper
چهارشنبه 11 اردیبهشت 1387, 10:26 صبح
من از نوع Tbitmap تعریف کردم ، ولی در خط دوم خطای تبدیل نوع میده
ترتیب پارامترها اشتباه نوشته شده بود:


ImageList1.GetBitmap(0,ABMP);

hadisalahi2
چهارشنبه 11 اردیبهشت 1387, 13:15 عصر
procedure TForm1.Button1Click(Sender: TObject);
var ABMP:TBitmap;
begin
ABMP := TBitmap.Create;
ImageList1.GetBitmap(0,ABMP);
Image1.Picture.Graphic.Assign(ABMP);
ABMP.Free;
end;//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

این کد رو نشوشتم ولی خطای زیر رو میده.
[Validation at Address 00450846 in module project.exe

B-Vedadian
چهارشنبه 11 اردیبهشت 1387, 14:52 عصر
حق با شماست

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap := TBitmap.Create;
ImageList1.GetBitmap(0,Image1.Picture.Bitmap);
end;



دقت کنید که اگر بعد از اولین بار ساختن Bitmap دیگر نباید آن را بسازید

hadisalahi2
چهارشنبه 11 اردیبهشت 1387, 15:18 عصر
ممنون از لطفتون
ولی این حالت عکس داخل ImageList رو خیلی کوچک میندازه داخل Image
اگه بخوام عکسهایی رو که به ImageList اضافه کردم به همون سای اصلی در Image قرار بگیرند باید چی کار کنم؟

vcldeveloper
چهارشنبه 11 اردیبهشت 1387, 15:38 عصر
اگه بخوام عکسهایی رو که به ImageList اضافه کردم به همون سای اصلی در Image قرار بگیرند باید چی کار کنم؟
ImageList عکس های بزرگ قبول نمیکنه. در نتیجه هر عکسی که در ImageList ذخیرخ کنید، اندازه اش کوچک هست. فکر کنم حداکثر اندازه تصویر برای ImageList باید 32x32 باشه.

B-Vedadian
چهارشنبه 11 اردیبهشت 1387, 19:43 عصر
آقاي کشاورز

تا 256 در 256 که من امتحان کردم، اشکالي ايجاد نشد. MSDN هم چيزي از محدوديتش نگفته.

آقاي صلاحي

اين کامپوننت براي نگاهداري تصاوير به اندازه هاي بزرگ مناسب نيست. محتويات تصوير بصورت رشته هگزادسيمال ذخيره ميشن که اندازه Resource رو خيلي بزرگ و بارگذاري رو کند ميکنه. بعضي وقتها ديگه بالا نميآد!

براي اينکه تصوير رو تو برنامه نگه داريد اونو تو مستقيما تو رسورس بذاريد.

اول يک فايل به نام مثلا Pics.rc درست کنيد که تو اون مينويسيد

MyPic1 RCDATA "C:\test1\mypic.jpg"


بعدش با brcc32ي بورلند همين رو کامپايل کنيد. در نهايت تو رويداد OnCreate فرمتون


var
x: TResourceStream;
y: TJPEGImage;
begin
x := TResourceStream.Create(HInstance, 'MyPic', RT_RCDATA);
y := TJPEGImage.Create;
y.LoadFromStream(x);
Image1.Picture.Bitmap := TBitmap.Create;
Image1.Picture.Graphic.Assign(y);
y.Free;
x.Free;
end;

vcldeveloper
پنج شنبه 12 اردیبهشت 1387, 02:25 صبح
تا 256 در 256 که من امتحان کردم، اشکالي ايجاد نشد. من نتونستم با استفاده از متدهای Add و GetBitmap عکس بزرگی رو درش ذخیره کنم. عکس رو میگیره، ولی اونو Stretch یا Crop میکنه به سایز کوچیک. Help دلفی هم میگه که باید همه عکس ها یک سایز باشند.


procedure TForm1.Button1Click(Sender: TObject);
var
Index : integer;
begin
ImageList1.Clear;
//Import an image from Image1 control.
Index := ImageList1.Add(Image1.Picture.Bitmap,nil);
//Export an image from ImageList to Image2 control.
ImageList1.GetBitmap(Index,Image2.Picture.Bitmap);
Image2.Refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.Fil eName);
end;

B-Vedadian
پنج شنبه 12 اردیبهشت 1387, 07:56 صبح
من که بعد تغییر propertyهای عرض(Width) و ارتفاع(Height) به 256 و بعدش استفاده از خود ImageListEditor بدون مشکل این کار رو انجام دادم.

البته اگه نخواهید تو Design Time بهش تصویر اضافه کنید، من چک کردم و با مقادیر بزرگ تر هم مشکلی نداره. در عین حال باید اندازه تمامی تصاویر یکسان باشه.

hadisalahi2
پنج شنبه 12 اردیبهشت 1387, 08:30 صبح
ممنون از لطف شما
آقای ودادیان اگه من مثلا 200 عکس داشته باشم ، همه رو باید به همین روش داخل فایل resource بذارم.
در ضمن توی این خط
x := TResourceStream.Create(HInstance, 'MyPic', RT_RCDATA);

"My pic " اسم همون فایلی که توی فایل rs گذاشتید؟

hadisalahi2
پنج شنبه 12 اردیبهشت 1387, 08:34 صبح
جناب استاد کشاورز ، من یه برنامه با دلفی دارم که باید یک محیط مالتی مدیا مثل نرم افزارهای Director یا Falsh رو باید شبیه سازی کنه. تقریبا باید 500 تا عکس رو برای منوها و دکمه ها و سایر قسمتها وارد دلفی کنم ، حالا به نظر شما بهتره عکسها رو چه جوری داخل برنامه قرار بدم؟

B-Vedadian
پنج شنبه 12 اردیبهشت 1387, 08:42 صبح
نه؛ اشتباه لپی بود:بامزه:، باید بجای MyPic همون MyPic1 یعنی عنوان resource رو بذارید. برای درست کردن رسورس از تعداد زیادی فایل، بورلند امکانی نذاشته ولی تو VisualStudio می تونید همه فایلهاتون رو یکجا به یک resource اضافه و اون رو کامپایل کنید.

hadisalahi2
پنج شنبه 12 اردیبهشت 1387, 09:03 صبح
پس این طوری یعنی باید برای هر عکس یه فایل rs ایجاد کنم ؟
شما راه بهتری پیشنهاد نمیکنید؟

B-Vedadian
پنج شنبه 12 اردیبهشت 1387, 10:19 صبح
گفتم که، چند تا فایل .rc لازم نیست. تو یک فایل، برای همه تصاویر رکورد مشابه ایجاد کنید.

vcldeveloper
پنج شنبه 12 اردیبهشت 1387, 15:04 عصر
من که بعد تغییر propertyهای عرض(Width) و ارتفاع(Height) به 256 و بعدش استفاده از خود ImageListEditor بدون مشکل این کار رو انجام دادم.
جالبه، تا حالا فکر می کردم که چون کامپوننت non-visual هست، اصلا Height و Width براش معنی نداره و بهش توجه نمی کردم.


من یه برنامه با دلفی دارم که باید یک محیط مالتی مدیا مثل نرم افزارهای Director یا Falsh رو باید شبیه سازی کنه. تقریبا باید 500 تا عکس رو برای منوها و دکمه ها و سایر قسمتها وارد دلفی کنم ، حالا به نظر شما بهتره عکسها رو چه جوری داخل برنامه قرار بدم؟
برای دکمه ها و تصاویر منوها همین ImageList خوبه بخصوص که Toolbar ها، ActionManager و Menu ها راحت باهاش کار می کنند. برای عکس های دیگه می تونید از Resource هم استفاده کنید.

hadisalahi2
پنج شنبه 12 اردیبهشت 1387, 18:16 عصر
از لطف دوستان خیلی ممنونم
ولی منظور من برای استفاده از Image List این بود که میخواستم دکمه هایی بسازم که دو حالت Up , Over داشته باشه ، مثل دکمه های فلش.
راه های پیشنهادی شما بسیار عالی بود ولی مشکل اینه که چون باید سریع این تعویض تصاویر انجام بگیره استفاده از Resource کنده و ImageList هم عکسها رو به اندازه دلخواهی که من میخوام نمیتونه ذخیره کنه . ممنون میشم اگه راه دیگه ای برای این کار به من پیشنهاد کنید.
به هر حال از لطفتون ممنونم