PDA

View Full Version : سوال: اجرا شدن دوباره دستورات



batman1
سه شنبه 13 مرداد 1394, 16:22 عصر
سلام به همه.
من برنامه ای دارم که شامل 2تا فرم هست.
حالا وقتی که کاربر برنامه رو باز میکنه،دکمه ای داره که میتونه به وسیله اون به فرم دوم دست پیدا کنه و در داخل فرم دوم هم دکمه ای برای بازگشت به فرم اول وجود داره.
فرم اول،وقتی اجرا میشه،نوشته های روی فرم به صورت متحرک،نمایان میشن.وقتی کاربر به فرم دوم میره و به داخل فرم اول برمیگرده،بازهم این نوشته های انیمیشنی اجرا میشن،اما من میخوام که دیگه اجرا نشن.فقط برای بار اول که کاربر برنامه را بازکرد،نوشته ها به صورت متحرک اجرا بشن و دیگه متحرک نباشن.حتی وقتی که از فرم دوم به فرم اول اومد.
ممنون میشم کمکم کنید.

rg_BlackRose
سه شنبه 13 مرداد 1394, 16:59 عصر
سلام

متنتون رو چطوری متحرک میکنید؟
اگر از تایمر استفاده کردید، کافیه تایمر رو غیر فعال کنید.

Timer.Enabled = false
در غیر اینصورت کدتون رو قرار بدید. تا بهتر راهنمایی بشید

موفق باشید

sabz12
سه شنبه 13 مرداد 1394, 17:44 عصر
بجاي رويداد load از رویداد activated استفاده كن ببين درست نميشه

مهرداد صفا
سه شنبه 13 مرداد 1394, 20:01 عصر
سلام.ض
وقتی که فرم2 رو نمایش میدید باید فرم1 رو مخفی کنید و در برگشت مجدد از متود Show استفاده کنید. نیاز به Close کردن و ساخت مجدد فرم نیست.
اگر جواب نگرفتید، با یک فلگ مشخص کنید که فرم تا به حال لود شده یا نه.

batman1
چهارشنبه 14 مرداد 1394, 09:47 صبح
سلام

متنتون رو چطوری متحرک میکنید؟
اگر از تایمر استفاده کردید، کافیه تایمر رو غیر فعال کنید.

Timer.Enabled = false
در غیر اینصورت کدتون رو قرار بدید. تا بهتر راهنمایی بشید

موفق باشید
ببینید،من این دستورات رو برای رویداد load یا activate فرم مینویسم:

timer1.Start();
if (label3.Left > 128)
{
label3.Left -= 2;
}
timer2.Start();
if (label4.Left < 261)
{
label4.Left -= 2;
}

و این دستورات را برای دو تایمر:

if (label3.Left > 128)
{
label3.Left -=2;
}
//----------------------------
if (label4.Left < 261)
{
label4.Left += 2;
}

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

batman1
چهارشنبه 14 مرداد 1394, 09:48 صبح
سلام.ض
وقتی که فرم2 رو نمایش میدید باید فرم1 رو مخفی کنید و در برگشت مجدد از متود Show استفاده کنید. نیاز به Close کردن و ساخت مجدد فرم نیست.
اگر جواب نگرفتید، با یک فلگ مشخص کنید که فرم تا به حال لود شده یا نه.
فلگ چیه؟!!

محمد رضا فاتحی
چهارشنبه 14 مرداد 1394, 12:47 عصر
فلگ؟؟ یه متغیر... که مثلا صفر برای جلوگیری از یه کاری یک برای شروع یه عملیاتی....

مهرداد صفا
چهارشنبه 14 مرداد 1394, 15:14 عصر
فلگ چیه؟!!

همونطور که جناب فاتحی اشاره کردند، می تونید یک متغیر سراسری تعریف کنید و در ابتدا مقدار false داشته باشه و وقتی که شما برای اولین بار کدهای مورد نظرتون رو اجرا کردید مقدار اون رو true می کنید. قبل از اجرای کدها هم چک کنید که اگر مقدار این متغیر flase بود کد ها اجرا بشن.

batman1
جمعه 16 مرداد 1394, 12:07 عصر
همونطور که جناب فاتحی اشاره کردند، می تونید یک متغیر سراسری تعریف کنید و در ابتدا مقدار false داشته باشه و وقتی که شما برای اولین بار کدهای مورد نظرتون رو اجرا کردید مقدار اون رو true می کنید. قبل از اجرای کدها هم چک کنید که اگر مقدار این متغیر flase بود کد ها اجرا بشن.
دوست عزیز،میشه یه ذره بیشتر درمورد این مسئله توضیح بدید.
من متوجه نشدم!!:متفکر:

aliebrahimi1900
جمعه 16 مرداد 1394, 12:58 عصر
توی دکمه ای فورم 2 رو نشون میده تایمرتو غیر فعال کن و ویزیبل لیبلتو رو هم مخفیش کن
که دوباره وقت برگشت کار نکنه

rg_BlackRose
یک شنبه 18 مرداد 1394, 20:34 عصر
ببینید،من این دستورات رو برای رویداد load یا activate فرم مینویسم:

timer1.Start();
if (label3.Left > 128)
{
label3.Left -= 2;
}
timer2.Start();
if (label4.Left < 261)
{
label4.Left -= 2;
}

و این دستورات را برای دو تایمر:

if (label3.Left > 128)
{
label3.Left -=2;
}
//----------------------------
if (label4.Left < 261)
{
label4.Left += 2;
}

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

سلام

کدهایی که در رویداد Load فرم قرار دادید درسته.

timer1.Start();
if (label3.Left > 128)
{
label3.Left -= 2;
}
timer2.Start();
if (label4.Left < 261)
{
label4.Left -= 2;
}


کدهایی که در تایمرها قرار دادید هم تا حدودی درسته(فقط در پایان عمل جابجای لیبلها، تایمرها باید غیر فعال بش(کدها در زیر اصلاح شدن))
تایمر اول:

if (label3.Left > 128)
{
label3.Left -= 2;
}
else
timer1.Stop();


و تایمر دوم:

if (label4.Left < 261)
{
label4.Left += 2;
}
else
timer2.Stop();


و اما در مورد مشکل اجرای دوباره کدها:
1. اگر کدهای زیر رو در رویداد Load فرم قرار بدید، در صورتی که فرم اول رو Close و دوباره Load نکنید، در هر صورت یکبار اجرا و تایمر ها فعال شده و لیبلها تا زمان صحیح بودن شرط جابجا میشن(حتی اگر فرم شماره دو باز و بسته بشه.). یعنی باز و بسته شدن فرم دوم تاثیری در کدهای فرم اول نمیذاره.

timer1.Start();
if (label3.Left > 128)
{
label3.Left -= 2;
}
timer2.Start();
if (label4.Left < 261)
{
label4.Left -= 2;
}


2. اگر کدهای بالا رو در رویداد Activated فرم قرار بدید، باز هم لیبلها تا زمان درست بودن شرط تایمرها اجرا شده و در یکجایی متوقف میشن.(حتی اگر فرم اول رو بار ها و بارها Active یا DeActive کنید.).
چرا؟. چون در پایان کار تایمرها لیبیلها در جایی قرار دارن که در صورت اجرای دوباره کدهای تایمرها شرطها نقض میشن.
مثلا:
در تایمر اول وقتی لیبل شماره سه، در محور افقی و در محدوده 128 و یا کمتر از اون قرار بگیره، شرط نقض میشه و بعد از اون لیبل 3 دیگه جابجا نمیشه. لیبل چهار هم به همون صورت وقتی در محور افقی و در محدوده 261 و بیشتر از اون قرار بگیره جابجایی لیبل 4 متوقف میشه.

کدها و توضیخاتیکه قرار دادید بیانگر همین توضیحاتی بود که عرض کردم.(یعنی مشکل کار شما در جایی به غیر از این کدها هست).

اگر درجای دیگری به غیر از کدهایی که گذاشتید خاصیت Left لیبلها رو تغییر میدید، بررسی کنید یا کدهاشو بذارید تا راهنمایی بشید.

کدهای شما رو در قالب نمونه برنامه براتون قرار میدم.
134097

برنامه فوق در VS 2015 و دات نت 3 نوشته شده.


موفق باشید

batman1
دوشنبه 19 مرداد 1394, 09:31 صبح
عزیز،دستت دردنکنه که اینقدر واضح توضیح دادی،حتما مشکل من حل میشه.
اما کاش از طریق تعریف کردن یک متغیر استاتیک توضیح می دادید.من میخوام اونم یاد بگیرم.
ممنون میشم اگه توضیح بدید.

rg_BlackRose
دوشنبه 19 مرداد 1394, 19:29 عصر
عزیز،دستت دردنکنه که اینقدر واضح توضیح دادی،حتما مشکل من حل میشه.
اما کاش از طریق تعریف کردن یک متغیر استاتیک توضیح می دادید.من میخوام اونم یاد بگیرم.
ممنون میشم اگه توضیح بدید.

سلام

اول تعریف متغیر استاتیک:
متغیر استاتیک، به متغیری گفته میشه از اول اجرا تا پایان برنامه در حافظه قرار میگیره و از هر کجای برنامه با داشتن NameSpace و نام کلاس میشه بهش دسترسی داشت.(با کلمه کلیدی static تعریف میشه.).
مثال:

static bool isLoaded;

میشه مثل هر متغیری موقع تعریف مقداردهی هم کرد.

static bool isLoaded = false;


مزیتش: از هزجای برنامه قابل دسترسه.
عیبش: از اول اجرا تا پایان برنامه در حافظه قرار میگیره و فضا اشغال میکنه.(برای همین گفته میشه فقط در صورت نیاز تعریف کنید.).

شما برای استفاده از این متغیر، یک کلاس جدید(به صورت static و سطح دسترسی public) ایجاد کنید و کدهای زیر رو درونش قرار بدید.

public static class FormStatus
{
private static bool isloadedform = false;

public static bool isLoadedForm
{
get { return isloadedform = false; }
set { isloadedform = value; }
}
}


کلاس بالا رو به این صورت هم میشه تعریف کرد.(ولی برای رعایت اصول شی گرایی به روش بالا تعریف کنید.).

public static class FormStatus
{
public static bool isLoadedForm = false;
}


و کدهای درون رویداد Load فرم اول رو به این صورت تغییر بدید.

if (FormStatus.isLoadedForm)
return;

timer1.Start();
if (label3.Left > 128)
{
label3.Left -= 2;
}
timer2.Start();
if (label4.Left < 261)
{
label4.Left -= 2;
}

FormStatus.isLoadedForm = true;


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

نمونه برنامه با تغییرات اعمال شده.
134122
ایجاد شده با VS2015 و دات نت 3

موفق باشید.

batman1
سه شنبه 20 مرداد 1394, 19:12 عصر
عزیز،به این تکه کد،خطا میده:
FormStatus.isLoadedForm = true;
قسمت FormStatus

rg_BlackRose
چهارشنبه 21 مرداد 1394, 07:25 صبح
عزیز،به این تکه کد،خطا میده:
FormStatus.isLoadedForm = true;
قسمت FormStatus


سلام

نمونه برنامه رو دوباره از لینک پست 13 دانلود و تست کردم. مشکلی نداشت.

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

تشکر.