PDA

View Full Version : سوال: حذف کنترهای ایجاد شده در حالت RunTime



hadisalahi2
پنج شنبه 05 دی 1392, 17:52 عصر
سلام به همگی دوستان.

من یک AdvSmoothPageSlider از سری مجموعه کامپوننت های Tms دارم .

حالا روی این کامپوننت میام و چند تا صفحه ایجاد میکنم و روی این صفحات با استفاده از کد نویسی و در حالت RunTime تعدادی کنترل ایجاد میکنم . (البته صفحات هم با کد ایجاد میشن)

حالا قصد دارم این صفحاتی رو که ایجاد کردم رو پاک کنم و دوباره صفحات رو از نو بسازم.

اما با هر روشی که بگید استفاده کردم ، اما صفحات حذف نمی شند.
:عصبانی++:
از این دستورات استفاده کردم :



(FindComponent('Page'+IntToStr(i))as TAdvSmoothPage).Free;

ReportPages.Pages[i].Destroying;

ReportPages.RemovePage(ReportPages.Pages[i]);

(FindComponent('Page'+IntToStr(i))as TAdvSmoothPage).Destroying;


جالب اینجاست که هنگام استفاده از متد RemovePage در جایی این پیام رو میده :

A component named Page4 already exists

و میگه فلان صفحه وجود داره ، اما من که نمیخوام صفحه جدید بسازم که میگه این صفحه وجود داره.

این کامپوننت ، متدی برای حذف صفحات نداره :متعجب:

یا اگه داره من نمیدونم چیه ؟ :متفکر:

دیگه کلافه شدم ، یکی به داد ما برسه :عصبانی++: :افسرده:

یوسف زالی
جمعه 06 دی 1392, 16:18 عصر
با این کامپوننت کار نکردم ولی به نظر می رسه شما دارید در حلقه این کار رو می کنید. اگر این طوره باید از downto استفاده کنید.
اگر می تونید اشاره گری به شیی منسوب کنید پس می تونید اون رو فری هم کنید. (البته نه همیشه)

hadisalahi2
شنبه 07 دی 1392, 10:27 صبح
آره توی حلقه استفاده میکنم
این راه رو هم تست میکنم

در ضمن آیا لازمه تا قبل از حذف یک مثلا پنل ، آیتم های ایجاد شده داخل اون رو هم پاک کنم؟

یوسف زالی
شنبه 07 دی 1392, 11:41 صبح
بستگی داره به این که هنگام ساخت Owner رو روش تنظیم کرده باشید یا نه.

hadisalahi2
شنبه 07 دی 1392, 12:21 عصر
نوع شمارنده حلقه رو برعکس کردم
بازهم نشد :افسرده:

جالبه که بقیه کنترل های روی صفحات با استفاده از کد زیر پاک میشند : اما خود صفحات پاک نمیشند


if ReportPages.PageCount = 0 then Exit;
for I := ReportPages.PageCount-1 downto 0 do begin
z:=ReportPages.Pages[i].ControlCount - 1;
for j := z downto 0 do
ReportPages.Pages[i].Controls[j].Destroy;
end;



من یک صفحه رو با این روش ایجاد میکنم :


NewPage:=TAdvSmoothPage.Create(Self);
NewPage.SetComponentStyle(tsOffice2010Blue);
NewPage.Name:=ObjName;
NewPage.Header:='';NewPage.Footer:='';
NewPage.HeaderHeight:=70;NewPage.FooterHeight:=30;
NewPage.MinimumWidth:=50;
// (Parent as TAdvSmoothPageSlider).AddPage(NewPage);
ReportPages.AddPage(NewPage);



آیا هنگام ساختن ، نکته خاصی داره که باید انجام بدم ؟

واقعا که دیگه کلافه شدم :عصبانی++:
هر کدی که بگید رو نوشتم ، اما بازم کار نمیکنه :عصبانی:
اگه امکان داره شما یه تستی بکنید

یوسف زالی
شنبه 07 دی 1392, 13:40 عصر
با نوشتن اسمشون می تونید از بین ببرینش؟
اگر بله؛ کد شما اشکال داره و به کنترل هاتون اشاره نمی کنه.
اگر نه؛ باید ببینید شرکت سازنده کامپوننت چه راهکاری براش پیشنهاد کرده. خیلی بعید می دونم نوع نوشتن کامپوننت شرکت طوری باشه که جلوی فری شدنش رو بگیره.

hadisalahi2
شنبه 07 دی 1392, 16:27 عصر
با نوشتن اسمشون می تونید از بین ببرینش؟

در واقع هنگام حذف ، هیچ خطایی نداره و به ظاهر حذف میکنه ، اما وقتی باز میخوای صفحات رو دوباره برای یک گزارش دیگه ایجاد کنی ، پیام میده که مثلا Page1 وجود داره.
به همین خاطر من خیلی کلافه شدم.


اگر بله؛ کد شما اشکال داره و به کنترل هاتون اشاره نمی کنه.

کد ایجاد صفحه رو نوشتم ، بقیه کنترلهای روی صفحات ، مثل لیبل و ادیت و ... رو به همین روش ایجاد میکنم. (در ضمن کدها داخل یک یونیت دیگه هستتند و من Parent ها رو به پرسیجر مربوطه پاس میدم)

همه کنترلهای دیگه که با همین روش ایجاد میشند ، به راحتی حذف میشند ، اما این صفحات نه.


اگر نه؛ باید ببینید شرکت سازنده کامپوننت چه راهکاری براش پیشنهاد کرده. خیلی بعید می دونم نوع نوشتن کامپوننت شرکت طوری باشه که جلوی فری شدنش رو بگیره.

منم واقعا تعجب میکنم از این شرکت TMS که همچین مشکلی توی کامپوننتش وجود داره (البته اگه فرض بر کد نویسی صحیح ما باشه)


ReportPages.RemovePage(ReportPages.Pages[i]);

این کدی هستش که خود کامپوننت برای حذف صفحات داره ، اما همین هم در ظاهر حزف میکنه ، ولی صفحات با هم وجود دارند

اگه این کامپوننت را دارید ، ممنون میشم ، یک تست کوچولو روی اون انجام بدید :افسرده:

یوسف زالی
شنبه 07 دی 1392, 16:49 عصر
بعد از ساخت کامپوننت هاتون، اونها رو با نام و نام کلاس لیست کنید ببینید همونی هست که می خواستید؟ بعد یکی رو حذف کنید ببینید چی در لیست تغییر کرد؟ یا اصلا تغییر کرد یا نه.

hadisalahi2
یک شنبه 08 دی 1392, 10:12 صبح
بعد از ساخت کامپوننت هاتون، اونها رو با نام و نام کلاس لیست کنید

من کدهای ساخت کنترل ها رو توی کلاس ننوشتم ، فقط توی یک یونیت ساده ، به صورت پروسیجر تعریف کردم ، آیا با نوشتن توی کلاس فرقی داره؟
یا اینکه حتما باید توی کلاس بزارم کدها رو ؟

یوسف زالی
یک شنبه 08 دی 1392, 10:45 صبح
فرقی نداره ولی کاری که گفتم رو تست کن ببین کنترلهات در چه وضعی هستن.

hadisalahi2
دوشنبه 09 دی 1392, 12:41 عصر
بعد از ساخت کامپوننت هاتون، اونها رو با نام و نام کلاس لیست کنید ببینید همونی هست که می خواستید؟ بعد یکی رو حذف کنید ببینید چی در لیست تغییر کرد؟ یا اصلا تغییر کرد یا نه

این کار رو انجام دادم

آیتم های لیست با هر بار زدن دکمه حذف ، کم میشه و صفحه مورد نظر حذف میشه

اما وقتی صفحه آخر رو حذف میکنی و لیست خالی میشه
برنامه قفل میکنه و دیگه نمیشه کاری انجام داد

اول فکر میکردم مشکل برنامه منه ، یا اینکه جایی کدی اجرا میکنم که این اتفاق میوفته
اما بعد از اینکه یک پروژه جدید ایجاد کردم و همون کدها رو اونجا تست کردم ، دیدم پروژه جدید هم همین مشکل رو داره

بعد از حذف آخرین صفحه ، برنامه در حالتی مشابه قفل یا افتادن در یک حلقه بینهایت به خودش میگیره.

حدس میزنم ، یا مشکل از کامپوننته ، یا روش حذف ما اشتباهه

نظر شما چیه؟

یوسف زالی
دوشنبه 09 دی 1392, 15:48 عصر
نمونه برنامتون رو بگذارید ببینم.

hadisalahi2
دوشنبه 16 دی 1392, 12:32 عصر
کامپوننت های TMS رو دارید؟
نمونه برنامه رو با همون کامپووننت ها بزارم؟

hadisalahi2
سه شنبه 17 دی 1392, 18:07 عصر
یوسف جان ، جواب سوال من رو ندادی
کامپوننت های TMS رو داری دیگه؟
با همون کنترل بزارم نمونه کد رو؟

یوسف زالی
سه شنبه 17 دی 1392, 20:39 عصر
نه راستش اصلا سیستم ندارم. حتی دلفی.
می خواستم سورس رو ببینم شاید بتونم کمکی کنم.

hadisalahi2
چهارشنبه 18 دی 1392, 10:48 صبح
واقعا ممنونت میشم اگه راهنمایی کنی
باور کن کلافه شدم دیگه :عصبانی++:

فایل ها رو برات آپلود کردم
ProjectReportUnit : یونیتی که کامپوننت PageSlider داخلشه و پروسیجر اصلیش ، AddPage هستش
CreatObjectUnit : این هم همون یونیتی هستش که کنترل ها رو با پروسیجرهای داخلش ایجاد میکنم.

اجرکم عند ا... باشه ان شاء ا...