PDA

View Full Version : سوال در ReadComponentRes و WriteComponentRes



AbiriAmir
یک شنبه 26 مهر 1388, 20:18 عصر
سلام
من یه فرم دارم که یه سری Object ها رو به صورت Run Time ایجاد میکنم و برای ذخیره و لود کردن اونا از WriteComponentRes و ReadComponentRes استفاده میکنم...
ولی تمام ماجرا این نیست
مشکل اینه که توی اون فرم همه Object ها در زمان اجرا ایجاد نمیشن و یه چندتا شی هم هست که تو سورس برنامه هست
خب وقتی من با این روش ذخیره میکنم و میخوام لودش کنم میگه که توی فرمت این اشیا(Object هایی که در زمان اجرا ساخته نمیشن و از قبل هستن) هستند و دیگه نمیتونه لودش کنه و ارور میده
من فکر کردم که میشه قبل از لود کردنشون همه چیزایی که تو فرم هستن رو پاک کنم و با بقیه چیزا لودشون کنم...
پس کد زیر رو استفاده کردم ولی ارور میده:

for a := 0 to form1.ComponentCount-1 do
form1.RemoveComponent(Form1.Components[a]);

ارورش:

List index out of bounds (2)

vcldeveloper
یک شنبه 26 مهر 1388, 21:13 عصر
برای حذف کردن، بجای اینکه در حلقه از صفر به آخر حرکت کنید، از آخر به سمت صفر حرکت کنید.

merced
یک شنبه 26 مهر 1388, 21:54 عصر
اينجوري هم ميش


While form1.ComponentCount > 1 do
form1.RemoveComponent(Form1.Components[0]);

AbiriAmir
دوشنبه 27 مهر 1388, 19:03 عصر
اينجوري هم ميش


While form1.ComponentCount > 1 do
form1.RemoveComponent(Form1.Components[0]);
ولی مثل این که اصلا کار نمیکنه چون بازم همون اروری میده که میگه همچین شیی وجود داره


برای حذف کردن، بجای اینکه در حلقه از صفر به آخر حرکت کنید، از آخر به سمت صفر حرکت کنید.

پس روشم درسته...؟؟؟

ولی با روش شما هم همون مشکلی که با روش جناب merced وجود داره هست...
انگار که اصلا پاک نمیشه...

young_man1365
دوشنبه 27 مهر 1388, 19:31 عصر
ببین این به کار برنامت میاد؟



for a := form1.ComponentCount - 1 downto 0 do
form1.Components[a].Destroy;

Felony
دوشنبه 27 مهر 1388, 19:53 عصر
از این کد استفاده کن :

for i:=Form1.ComponentCount-1 downto 0 do
Form1.Components[0].Free;

Felony
دوشنبه 27 مهر 1388, 20:00 عصر
کدی قبلی رو ندیدم ، اون هم کارت رو راه میندازه .

vcldeveloper
سه شنبه 28 مهر 1388, 02:09 صبح
ببین این به کار برنامت میاد؟
هیچوقت Destroy را مستقیما فراخوانی نکنید، همیشه از Free یا FreeAndNil استفاده کنید.


پس روشم درسته...؟؟؟
کد شما فقط اون کامپوننت رو از لیست کامپوننت های فرزند Form مربوطه خارج میکنه، ولی کامپوننت را از بین نمیبره.

young_man1365
سه شنبه 28 مهر 1388, 12:18 عصر
هیچوقت Destroy را مستقیما فراخوانی نکنید، همیشه از Free یا FreeAndNil استفاده کنید.


با سلام خدمت آقای کشاورز و ممنون از راهنماییتون . اما تا جایی که من میدونم واسه کامپوننت هایی که با create ساخته میشن نباید از destroy استفاده کرد و باید اونا رو free کرد. با توضیحاتی که دوستمون دادند استفاده از destroy نباید مشکلی پیش بیاره.:متفکر: اگه تا حالا اشتباها" از destroy استفاده میکردم لطفا" راهنمایی کنید. با تشکر

AbiriAmir
سه شنبه 28 مهر 1388, 15:02 عصر
بازم همون مشکل...
میگه همچین شیی وجود داره

Felony
سه شنبه 28 مهر 1388, 15:05 عصر
بازم همون مشکل...
میگه همچین شیی وجود داره

کدی که باهاش کامپوننت ها رو ذخیره و بارگزاری میکنید رو قرار بدید .

AbiriAmir
سه شنبه 28 مهر 1388, 15:32 عصر
یه نمونشو اینجا آپلود کردم...
اول ذخیره کنید و بعد سعی کنید از همونجا لود کنین...

Felony
سه شنبه 28 مهر 1388, 16:25 عصر
مشکل از همون قسمت ذخیره و بارگزاری شما بود که کدهاتون رو تصحیح کردم ، فایل ضمیمه رو ببینید .

Felony
سه شنبه 28 مهر 1388, 16:58 عصر
مثل اینکه دلفی شما مشکل داره یا ... ، من چندین بار تست کردم ، این هم فایل اجراییش که ضمیمه کردم .

AbiriAmir
سه شنبه 28 مهر 1388, 17:05 عصر
نه
ببخشید
مشکل از یه جای دیگه بود
البته از برنامه بود ولی خیلی راحت حل شد
به هر حال ممنون

vcldeveloper
سه شنبه 28 مهر 1388, 20:59 عصر
اما تا جایی که من میدونم واسه کامپوننت هایی که با create ساخته میشن نباید از destroy استفاده کرد و باید اونا رو free کرد. با توضیحاتی که دوستمون دادند استفاده از destroy نباید مشکلی پیش بیاره.:متفکر: اگه تا حالا اشتباها" از destroy استفاده میکردم لطفا" راهنمایی کنید.
کلا هیچ وقت نباید از Destroy بطور مستقیم استفاده کنید. Free همیشه اول چک میکنه که آیا شی مورد نظر nil هست یا نه، اگر nil نبود، Destroy را فراخوانی میکنه. در صورت استفاده از Destroy، اگر شی nil شده باشه، Access Violation می گیرید.