ورود

View Full Version : ایجاد فرم در زمان اجرا



FirstLine
دوشنبه 12 بهمن 1383, 18:33 عصر
با سلام
یک برنامه با 10 فرم دارم که با بانک DBISAM ارتباط دارد و در حال حاضر همه فرمها در ابتدای برنامه Create میشود.
فکر میکنم برای بهینه سازی و بالا بردن سرعت باید فرمها را در زمان اجرا ایجاد کنم و پس از استفاده آن را از حافظه خارج و حافظه اشغال شده را آزاد کنم.
برای اینکه این کار را بصورت صحیح انجام بدهم لطفا راهنمایی کنید.
از Try..finaly استفاده کنم؟! آیا از form2.Destroy استفاده کنم یا Free ؟! و...
بصورت کلی میخوام یه فرم جدید را ایجاد و بصورت ShowModal نمایش و پس از بستن فرم از داخل فرم ، این فرم از بین رفته و حافظه اختصاص داده شده آزاد شود. :flower:
با تشکر

دوشنبه 12 بهمن 1383, 18:54 عصر
سلام
از فایل پروژت یونیت مربوط به اون فرم رو حذفش کن حالا تو هر فرمی که میخوای این فرم show بشه در قسمت uses اسم اون یونیت رو اضافه کن حالا هر جا که بخوای میتونی هر چند تا که بخوای متغیر از نام اون فرم create کنی. امتحان کن و در taskmaneger میزان حافظه اشغال شده قبل از show شدن اون فرم و بعدش رو ببین متوجه میشی.

:موفق:

vcldeveloper
سه شنبه 13 بهمن 1383, 02:54 صبح
آیا از form2.Destroy استفاده کنم یا Free ؟!
همیشه از Free استفاده کنید. Free خودش به موقع اش Destroy رو فراخونی میکنه.

برای فراخونی دینامیک یک فرم باید اول اسم فرم رو از Menu Project\Option\Forms\Auto Create Forms حذف کنی بعد می تونی با کدی مثل این فرم رو ایجاد کنی و نمایش بدی:




Application.CreateForm(TForm2,Form2);
try
Form2.ShowModal;
finally
Form2.Free;
end;



اگر می خوای از Form2.Show f بجای ShowModal استفاده کنی، اونوقت نباید فرم رو در بخش finally آزاد کنی، بلکه باید در رویداد OnClose فرم مورد نظر بنویسی:


Action := caFree;

pinacle
سه شنبه 13 بهمن 1383, 11:04 صبح
Application.CreateForm(TForm2,Form2);
Form2.ShowModal;
Form2.Free;


از کد بالا هر وقت که خواستی فرم تشکیل شود استفاده کن.

vcldeveloper
چهارشنبه 14 بهمن 1383, 02:42 صبح
از کد بالا هر وقت که خواستی فرم تشکیل شود استفاده کن.
باید در کدتون از بلوک try-finally استفاده کنید تا همیشه مطمپن باشید که فرم بعد از استفاده از حافظه خارج میشه! در غیر اینصورت با بوجود اومدن یک استثناء در داخل فرم مورد نظر یا در هنگام نمایش آن، احتمال داره که فرم هیچ وقت آزاد نشه!

V60
شنبه 23 دی 1385, 18:59 عصر
سلام
می خواستم ببینم وقتی از برنامه بر روی شبکه استفاده می شود ، اینکار که هر فرم را زمانیکه می خواهیم ببینیم ایجاد کنیم در سرعت برنامه تاثیر منفی ندارد ، یعنی برای اینکه بخواهیم هر فرم را ایجاد کنیم یک ارتباط با سرور ایجاد کنیم باعث کم شدن سرعت نمی شود ؟

MNosouhi
شنبه 23 دی 1385, 20:43 عصر
هر فرم را ایجاد کنیم یک ارتباط با سرور ایجاد کنیم باعث کم شدن سرعت نمی شود ؟
این کار اصلا درست نیست ، فکر سرور بیچاره رو هم بکنید ، کل برنامه باید یک یا حداکثر دو conection با سرور برقرار کند و نه بیشتر.

V60
شنبه 23 دی 1385, 23:08 عصر
ببخشید متوجه منظورتان نمی شوم ؟؟ یعنی به نظر شما من در همان ابتدا که برنامه ام باز می شود تمام فرمهایم را create بکنم؟

MNosouhi
شنبه 23 دی 1385, 23:53 عصر
ببخشید متوجه منظورتان نمی شوم ؟؟ یعنی به نظر شما من در همان ابتدا که برنامه ام باز می شود تمام فرمهایم را create بکنم؟
نه منظورم این نبود ، این که فرمهاتون رو کی و چگونه create کنید بستگی به برنامتون داره ، معمولا وقتی برنامه بزرگ باشه مسائل مربوط به مدیریت حافظه اهمیت پیدا میکنه و در مورد برنامه های معمولی که می نویسیم خیلی لزوم نداره ، اگرچه بهتره عادت کنیم که در همه برنامه ها چه کوچک و چه بزرگ از منابع سیستم درست و بهینه استفاده کنیم.
شما فرموده بودید که هر بار فرمی ایجاد میشه یه ارتباط با سرور برقرار بشه که این نوع ارتباط اشتباهه.
برنامه باید در همون ابتدا یه ارتباط(connection) با سرور برقرار کنه و همه جداول برنامه از طریق همان connection با سرور رابطه داشته باشن، و اطلاعات را دریافت یا ارسال کنند.

V60
یک شنبه 24 دی 1385, 00:14 صبح
جناب نصوحی
من باز هم جواب سوالم را نگرفتم، یکی از دلایلش این بود که در سوالم از کلمات صحیحی استفاده نکرده بودم، سوالم را اینگونه بیان می کنم: من برنامه ای با حدود 120 فرم دارم و بر روی سرور قرار داده ام و حدود 6 کلاینت از این برنامه استفاده می کنند، آیا صحیح است که هر کاربر هنگامیکه می خواهد فرمی را باز کند من آن را ایجاد کنم ، یا بهتر است همان ابتدای برنامه ، تمام فرم ها بر روی سیستم کلاینت بارگذاری شود؟
در ضمن اصولا این کار چه تاثیری در سرعت برنامه خواهد داشت؟ ایا ایجاد کردن فرم در زمانیکه ان را لازم داریم سرعت نرم افزار را پایین نمی اورد؟
و این عمل تاثیر در سرعت استفاده از بانک اطلاعاتی دارد یا خیر
متشکر

vcldeveloper
یک شنبه 24 دی 1385, 07:21 صبح
برای اتصال به بانک اطلاعاتی در سرتاسر برنامه، کامپوننت های دسترسی به بانک را در یک Data Module قرار بدید، تا تمام برنامه از این ماجول به بانک دسترسی داشته باشه. به این ترتیب فرم های برنامه شما فقط با این ماجول ارتباط برقرار می کنند و با هر بار ایجاد/حذف شون، اتصال بانک اطلاعاتی جدیدی ایجاد نمیشه.
خودتون به عنوان برنامه نویس باید تصمیم بگیرید که چه فرم هایی در برنامه زیاد استفاده میشند و ایجاد مکرر اونها باعث کاهش سرعت برنامه میشه، و چه فرم هایی کمتر استفاده میشند و ایجاد اونها از اول، باعث افزایش حافظه مصرفی برنامه میشه.

حرفه ای
یک شنبه 24 دی 1385, 10:20 صبح
خوب یک جمع بندی و نظر بنده :
دوست خوبم آقای کشاورز درست می فرمایند تمامی Connectio های خود را داخل یک Data Madule قرار دهید که این امر در سرعت برنامه شما تاثیر دارد
اما راجع به فرماهای داینامیک کارهای زیر را انجام دهید
1) کلید Shift+Ctrl+F11 را با هم فشار دهید
2) در قسمت فرمها تمامی فرمها منهای فرم اول و فرم دیتا ماجول در قسمت Avaiable Forms درگ کنید
3) فرم دیتاماجول خود را در ابتدا قرار دهید ( البته حتماً از Data Madule استفاده کنید چون در زمان Create شدن نمایش داده نمی شود )
4) در زمان نمایش یک فرم دستور زیر را به عنوان مثال بنویسید :


Application.CreateForm(TForm1, Form1);
Form1.ShowModal;

5) در رویداد OnClose به عنوان مثال Form1 دستور زیر را اضافه کنید


Action:=caFree;


اگر یکی از گزینه ها را رعایت نکیند برنامه شما با اشکال مواجه می شوید .

در صورت برخورد با مشکل در خدمت شما هستم ! :لبخندساده: :لبخندساده: :لبخندساده:

MNosouhi
یک شنبه 24 دی 1385, 11:00 صبح
من برنامه ای با حدود 120 فرم دارم و بر روی سرور قرار داده ام
ببینید هر برنامه نویسی تحت شبکه حداقل 3 قسمت داره ، یکی دیتابیس که می تونه sqlserver یا اوراکل یا هر بانک دیگه ای باشه ، دوم نرم افزار کلاینت که در دسترس کاربران قرار میگیره و کاربران باهش کار میکنن و سوم نرم افزار سرور ، که روی کامپیوتر سرور قرار میگیره وبیشتر نقش یک رابط را ایفا می کنه ، یعنی اینکه کلاینت ها مستقیما درخواست هاشون رو به دیتابیس نمی فرستن ، بلکه درخواست عملیات رو به نرم افزار سرور می فرستن ، نرم افزار سرور با پایگاه داده رابطه برقرار کرده و عملیات مورد نظر کلاینت ها رو انجام داده و در صورت نیاز نتیجه رو به کلاینت ها بر می گردونه (به هر کدوم از این قسمت ها اصطلاحا یک لایه (Tier) و در مجموع این نوع برنامه نویسی رو mutitier میگن) . با توجه به توضیحاتی که دادم باید متوجه شده باشید که نرم افزار سرور بیشتر نقش کنترلی داره و اینکه 120 فرم داشته باشه خیلی منطقی نیست ، این فرم ها باید در سمت برنامه کلاینت قرار بگیره .

آیا صحیح است که هر کاربر هنگامیکه می خواهد فرمی را باز کند من آن را ایجاد کنم ، یا بهتر است همان ابتدای برنامه ، تمام فرم ها بر روی سیستم کلاینت بارگذاری شود؟
همانطوری که دوستان توضیح دادن ، معمولا فرم هایی که زیاد استفاده میشه رو در همون ابتدا create میکنن و دیگه آزادشون هم نمی کنن ، مثلا شما ممکنه یک فرم جستجو داشته باشید که از اون زیاد استفاده کنید ، بنابراین منطقی نیست که هر بار به اون احتیاج داشتید اون رو ایجاد و سپس free کنید . اما در مورد فرم هایی که زیاد ازشون استفاده نمیشه بهتر که فقط در مواقعی که بهشون احتیاجه ایجاد و سپس آزاد بشن.

حرفه ای
یک شنبه 24 دی 1385, 11:47 صبح
بحثی را تحت عنوان : آموزش لایه میانی ( +COM ) در سبک (http://barnamenevis.org/forum/showthread.php?t=59232) MultiTier در قسمت مقالات مربوط قرار د اده و در حال تکمیل آن هستم
می تونید از اون استفاده کنید !

برنامه نویسی در سبک Multitier امر نسبتاً پیچیده و سخت برای مبتدیان است .
اگر شما مبتدی هستید پیشنهاد می کنم Client/Server کار کرده و سپس به سراغ Multitier بیایید اما این یک واقعیت است که سبک Multitier در حال حاضر بهترین سبک در برنامه نویسی تحت شبکه است

MNosouhi
یک شنبه 24 دی 1385, 12:26 عصر
اگر شما مبتدی هستید پیشنهاد می کنم Client/Server کار کرده و سپس به سراغ Multitier بیایید
این که گفتید یعنی چی؟
خب برنامه نویسی Client/Server همون Multitier هستش دیگه. اگه اشتباه میکنم بگید.

حرفه ای
یک شنبه 24 دی 1385, 16:26 عصر
دوست خوبم نسوحی

برنامه نویسی Multitier سبک تکمیل یافته تری نسبت به client/ server می باشد

در یک برنامه Client/Server برنامه از یک application که بر روی کامپیوتر کاربر run میشه و یک پایگاه داده مثل Oracle یا SQLServer بر روی سرور تشکیل شده است .
البته این سبک نیز دارای انواع مختلفی است اما رایجترین آن این است که پایگاه داده خود وظیفه share شدن را به عهده می گیرد و در این میان کاربر به طور مستقیم با پایگاه داده در ارتباط است .

در سبک Multitier برنامه از سه لایه مجزا application بر روی کامپیوتر کلاینت پایگاه داده بر روی سرور و لایه میانی و یا تجاری (+Com ) بر روی سیستم عامل سرور تشکیل شده است .

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

پیشنهاد می کنم بحث من را تحت عنوان آموزش لایه میانی ( +COM ) در سبک MultiTier (http://barnamenevis.org/forum/showthread.php?t=59232) دنبال کنید

با عرض پوزش ، البته برای آماتورها فعالاً پیشنهاد نمی گردد

MNosouhi
یک شنبه 24 دی 1385, 18:14 عصر
ممنون از جوابتون .

نسوحی
اینطوری مینویسن : نصوحی


در یک برنامه Client/Server برنامه از یک application که بر روی کامپیوتر کاربر run میشه و یک پایگاه داده مثل Oracle یا SQLServer بر روی سرور تشکیل شده است .
البته این سبک نیز دارای انواع مختلفی است اما رایجترین آن این است که پایگاه داده خود وظیفه share شدن را به عهده می گیرد و در این میان کاربر به طور مستقیم با پایگاه داده در ارتباط است .
تا حالا فکر می کردم که هر برنامه Client/Server حتما یه نرم افزار سرور و حتما یه نرم افزار کلاینت باید داشته باشه که نرم افزار سرور باید مجزا از پایگاه داده باشه.

حرفه ای
دوشنبه 25 دی 1385, 08:14 صبح
دوست خوبم ! آقای نصوحی عزیز

از اینکه نام شما را اشتباه تایپ کردم عذر خواهی می کنم .
برای اینکه با سبک Client\Server بیشتر آشنا شویم تولید یک برنامه Client\Server را با بانک اطلاعاتی SqlServer برای شما توضیح می دهم .
ابتدا نیازمند یک سیستم عامل سرور مثل ویندوز 2000 و یا 2003 هستید . البته نصب Active Directory فراموش نشه
سپس بر روی کامپیوتر خود پایگاه داده SQL Server ویرایش Server Edition را نصب کنید
پایگاه داده خود را بسازید و یا Database موجود خود را attach کنید
حال بر روی server registration ر است کلیک کرده و گزینه Properties را انتخاب کنید و در تب Active Directory بر روی دکمه Add کلیک کرده و OK را کلیک کنید
بر روی کلاینت تنها کافی است SQL Server نسخه Client و یا Desktop Edition را نصب کرده
اگر نسخه Client را نصب کنید کاربر Enterprise Manager را ندارد و اگر Desktop Edition را نصب کنید کاربر Enterprise Manager ر ا داشته و می تواند فارغ از محدودیت های کاربرش در برنامه تمام فیلدها و رکوردها را دیده و بدون رد پایی آنها را حذف ، اصلاح و یا اضافه نماید
حال کافی است شما یک برنامه با کانکشن Ado داشته باشید

آری . اکنون شما یک برنامه تحت شبکه تحت سبک Client\Server نوشته اید .

به دنیای برنامه نویسان تحت شبکه خوش آمدید اما زیاد دلخوش نباشید چون سبک برنامه نویسی شما برای یک کاربر نیمه حرفه ای هیچگونه امنیتی ندارد

V60
سه شنبه 26 دی 1385, 00:54 صبح
سلام
صبر کنید
من که فکر کنم با این توضیحاتی که اساتید دادند ، جزوه کشک و بادمجان حساب می شوم و به حد آماتور هم نمی رسم
من برنامه ای که می نوشتم معمولا با دیتابیس اکسس بود و به این صورت می نوشتم که فایل اجرایی و همچنین دیتابیس را بر روی سرور قرار می دادم و فولدری را که برنامه و دیتابیس در ان قرار داشت را به صورت share قرار می دادم
کاربران از هر سیستمی که به این دستگاه دسترسی داشتند می توانستند با آن ارتباط برقرار کنند و برنامه را اجرا کنند و از آن استفاده کنند.
حالا لطف کنید بگویید این برنامه همان client/server است یا چیز دیگری؟
این برنامه ای که من گفتم و باید بگویم بیش از اینها فرم دارد یعنی 180 عدد، تا به حال که 4 سال می گذرد خوب کار می کند .
ولی از نوع برنامه نویسی که گفتید بسیار خوشم آمد و سعی می کنم آن را ادامه بدهم
حتما مقاله شما را هم در آدرسی که داده اید دنبال می کنم.
ولی جواب سوال من را هم بدهید؟ این سبک من کدام سبک است؟

V60
سه شنبه 26 دی 1385, 02:03 صبح
خوب یک جمع بندی و نظر بنده :
دوست خوبم آقای کشاورز درست می فرمایند تمامی Connectio های خود را داخل یک Data Madule قرار دهید که این امر در سرعت برنامه شما تاثیر دارد
اما راجع به فرماهای داینامیک کارهای زیر را انجام دهید
1) کلید Shift+Ctrl+F11 را با هم فشار دهید
2) در قسمت فرمها تمامی فرمها منهای فرم اول و فرم دیتا ماجول در قسمت Avaiable Forms درگ کنید
3) فرم دیتاماجول خود را در ابتدا قرار دهید ( البته حتماً از Data Madule استفاده کنید چون در زمان Create شدن نمایش داده نمی شود )
4) در زمان نمایش یک فرم دستور زیر را به عنوان مثال بنویسید :


Application.CreateForm(TForm1, Form1);
Form1.ShowModal;

5) در رویداد OnClose به عنوان مثال Form1 دستور زیر را اضافه کنید


Action:=caFree;


اگر یکی از گزینه ها را رعایت نکیند برنامه شما با اشکال مواجه می شوید .

در صورت برخورد با مشکل در خدمت شما هستم ! :لبخندساده: :لبخندساده: :لبخندساده:
جناب حرفه ای ، اگر این کارها را بکنیم دیگر نیازی نیست که کدهایی را که درون فایل سورس خود پروژه ایجاد می شود را پاک کنیم ؟ یا آن کدها خود به خود باید پاک شود ؟
من چون برنامه ام را دارم اصلاح می کنم ، وقتی این کار را کردم و برنامه را کمپایل کردم تغییری ندیدم ، ممکنه علتش استفاده از اسپلش باشد؟

حرفه ای
سه شنبه 26 دی 1385, 08:00 صبح
سلام
صبر کنید
من که فکر کنم با این توضیحاتی که اساتید دادند ، جزوه کشک و بادمجان حساب می شوم و به حد آماتور هم نمی رسم
من برنامه ای که می نوشتم معمولا با دیتابیس اکسس بود و به این صورت می نوشتم که فایل اجرایی و همچنین دیتابیس را بر روی سرور قرار می دادم و فولدری را که برنامه و دیتابیس در ان قرار داشت را به صورت share قرار می دادم
کاربران از هر سیستمی که به این دستگاه دسترسی داشتند می توانستند با آن ارتباط برقرار کنند و برنامه را اجرا کنند و از آن استفاده کنند.
حالا لطف کنید بگویید این برنامه همان client/server است یا چیز دیگری؟
این برنامه ای که من گفتم و باید بگویم بیش از اینها فرم دارد یعنی 180 عدد، تا به حال که 4 سال می گذرد خوب کار می کند .
ولی از نوع برنامه نویسی که گفتید بسیار خوشم آمد و سعی می کنم آن را ادامه بدهم
حتما مقاله شما را هم در آدرسی که داده اید دنبال می کنم.
ولی جواب سوال من را هم بدهید؟ این سبک من کدام سبک است؟

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

من از خداوند منان برای شما آرزوی موفقیت دارم .
همواره دوست دار تو :چشمک:

حرفه ای
سه شنبه 26 دی 1385, 08:04 صبح
جناب حرفه ای ، اگر این کارها را بکنیم دیگر نیازی نیست که کدهایی را که درون فایل سورس خود پروژه ایجاد می شود را پاک کنیم ؟ یا آن کدها خود به خود باید پاک شود ؟
من چون برنامه ام را دارم اصلاح می کنم ، وقتی این کار را کردم و برنامه را کمپایل کردم تغییری ندیدم ، ممکنه علتش استفاده از اسپلش باشد؟

دوست خوبم شما نیاز به پاک کردن کدی در برنامه تون ندارید تنها باید هر جا که فرمی را نمایش داده اید آن فرم را مانند دستور زیر بسازید


Application.CreateForm(TForm1, Form1);
Form1.ShowModal;

فقط کافی است به جای form1 نام فرم خود را بگذارید و در قسمت OnClose فرم مذکور را آزاد کنید
برای اینکار شاید ساده ترین کار استفاده از منوی Search قسمت Find in Files باشد .
شاید باور نکنید با انجام این کار برنامه شما به قدری سبک می شود که حتی تصورش را هم نمی کردید .

موفق باشید .:تشویق:

V60
سه شنبه 26 دی 1385, 11:49 صبح
خیلی متشکر از راهنماییتان
یک مورد دیگه
من بعضی وقتها هنگام بسته شدن بعضی از فرمهایم چک می کنم که ایا فلان فرم باز است یا خیر
الان با این کاری که شما گفتید بکنم ، چه کدی را می توانم به جدای visible بودن فرم چک کنم؟

V60
سه شنبه 26 دی 1385, 11:59 صبح
راستی آقای حرفه ای
اگر من برنامه ام را روی هر کلاینت نصب کنم و فقط ادرس دهی دیتابیس را از روی سرور انجام بدهم ، تاثیری بر روی سرعت برنامه دارد؟ این کار می تواند بسیار خوب باشد؟

حرفه ای
سه شنبه 26 دی 1385, 12:01 عصر
این چطوره ؟ :چشمک:


If Form1.Showing=True Then
begin
end;

MNosouhi
سه شنبه 26 دی 1385, 12:09 عصر
اگر من برنامه ام را روی هر کلاینت نصب کنم و فقط ادرس دهی دیتابیس را از روی سرور انجام بدهم ، تاثیری بر روی سرعت برنامه دارد؟
فقط روی دریافت و ارسال اطلاعات تاثیر دارد ، البته معمولا محسوس نیست.

حرفه ای
چهارشنبه 27 دی 1385, 07:16 صبح
راستی آقای حرفه ای
اگر من برنامه ام را روی هر کلاینت نصب کنم و فقط ادرس دهی دیتابیس را از روی سرور انجام بدهم ، تاثیری بر روی سرعت برنامه دارد؟ این کار می تواند بسیار خوب باشد؟

دوست خوبم !
جناب آقای نصوحی درست می فرمایند !
سرعت در کاری که شما انجام می دهید شاید به این دو معنا باشد :
1) Client های شما دارای کامپیوتر های قوی نبوده و در زمان لود برنامه دچار مشکل می شوند
راه حل : شما از فرمهای داینامیک استفاده کنید
2) سرعت جستجو در بانک اطلاعاتی شما کم است .
راه حل : بر روی Table ها تون Index مناسب بگذارید و در صورتی که باز ناراضی هستید از دستورات جستجو توسط Index استفاده کنید

موفق باشید:چشمک: