| آموزش برنامه نویسی |
![]() |
|
|
معرفی وبلاگ جدید از آنجاییکه از پرشین بلاگ راضی نیستم (علت در پست های قبلی) امیدوارم شما را در آدرس زیر ببینم:
Php installation and configuration برای اطلاعات بیشتر install.txt را در فولدر خود php ملاحظه فرمایید.
# For PHP 5 do something like this: # configure the path to php.ini Notice that we use / slash for addresses like c:/windows instead of c:\windows. راهنمای گذاشتن تصویر یا عکس در وبلاگ ابتدا به یکی از سایت های آپلود عکس رفته مثل : تصویر خود را آپلود کنید سپس در ادیتور وبلاگ خود از قسمت درج و ویرایش تصویر اقدام به گذاشتن آدرس عکسی که آپلود شده نمایید.
و ....
مشکل تراکنش های تودرتو (Nested Transaction) نویسنده : آقای مهندس سعید شکوهی Error message: The operation is not valid for the state of the transaction
} برای حل این مشکل بایستی تراکنش ایجاد شده از نوع TransactionScopeOption.RequiresNew باشد همچنین مدت زمان پایان تراکنش به بیشتر از یک دقیق افزایش پیدا کند تا در صورت بالا بودن حجم اطلاعات زمان کافی موجود باشد یعنی کد بصورت زیر تغییر کند :
دلیل استفاده از RequiresNew بجای Requires این است که که در حالت Requires در صورتیکه حوزه تراکنش جدید مورد نیاز باشد حوزه جدید ایجاد میشود و چون در این حالت تودرتو بودن حوزه ها صریح نیست حوزه جدید ایجاد نمیشود و از حوزه متصل به پایگاه داده سعی دارد که اتصال جدید ایجاد کند که بر خلاف اصول همزمانی است و خطا ایجاد میشود . اما در حالت RequiresNew الزاما حوزه جدید ایجاد میشود . آناهیتا امینی علوی متاسفانه عزیزی که چند وقت پیش به خاطر کامنت هایی که برام گذاشته بود ازش تو یکی از پستها تشکر کردم - خانم آناهیتا امینی علوی - در سانحه هوایی روز چهارشنبه 24/4/88 جان به جان آفرین تسلیم کرد. خداوند روح این عزیز و عزیزان دیگر هموطن که در این حادثه کشته شدند را قرین نعمت قرار داده و به بازماندگانشان صبر و آرامش عنایت فرماید. متاسفانه هواپیمایی که راهی کشور ارمنستان بود با 168 نفر سرنشین در قزوین به زمین خورد و تمام مسافران و پرسنل پرواز از بین رفتند. خبر فوت این عزیزان باور نکردنی است. آناهیتا خانم انسانی با شخصیت، تحصیلکرده، قوی، شجاع، مهربان و با معرفت بود، یکی از ویژگیهای ممتاز ایشان این بود که بسیار محکم و جثور بود طوری که با مشکلات مبارزه می کرد و آنها را از سر راه بر می داشت. خودم شخصا در مراسم ختم این عزیز اجازه ناراحت شدن و گریه کردن به خودم نمی دادم، چون هر وقت به یادش می افتادم احساس می کردم که اون با مسئله مرگ هم به نحوی دست و پنجه نرم کرده و مرگ نبوده که بر آناهیتا غلبه کرده باشد بلکه آناهیتا بوده که طوری مرگ و شکست داده، معلوم نیست شاید الان اگر پیش ما بود با خنده می گفت این (مرگ) بود که همه ازش می ترسیدند... آریا برادر آناهیتا که از دوستان صمیمی من هست بسیار از این موضوع ناراحت بود، می گفت دوست دارم از این به بعد نحوه زندگی کردن آناهیتا را سر لوحه زندگیم قرار بدم و ببینم اون در شرایط مختلف چه تصمیمی می گرفت منم همون کار را بکنم، بنده خدا تو دار دنیا فقط همین یه دونه خواهر را داشت. دکتر و مادر آناهیتا هم خیلی ناراحت بودند طوریکه هر کی می دیدتشون نا خود آگاه می زد زیر گریه. خدا بهشون صبر بده. Event به زبان ساده یک مثال ساده درباره Event پیدا کردم که آموزنده است. در ادامه یادداشت هایی که درباره delegate ها داشتم با دیدن این مثال در یکی از کتاب ها و این که شاید بشه گفت ساده ترین راه نمایش مکانیزم کاری رویدادها از طریق delegate هاست بر آن شدم تا این مثال رو در وبلاگ هم بیارم. using System;
namespace MyEvents { public delegate void MyHandler();
class EventDemo { public event MyHandler SomeEvents;
public void OnSomeEvents() { if (SomeEvents!=null) { SomeEvents(); } } }
public class Program { public static void handler() { Console.WriteLine("Events Occured!"); }
public static void Main() { EventDemo evt = new EventDemo();
evt.SomeEvents+=handler; //Delegate Method Group Conversion evt.OnSomeEvents();
Console.ReadLine(); }
} }
مشکل گریدویو Gridview چند وقتی بود که به یک مشکل بد در مورد حذف و ویرایش یا هر command دیگه ای که فکرش را کنید خورده بودم. مشکل من از این قرار بود که وقتی روی دکمه حذف در یک Gridview کلیک می کردم دو رکورد حذف می شد. بعد از trace کردن متوجه شدم که هر event دوبار داره انجام می شه. بعد از کلی Googling متوجه شدم که این یه باگ در گرید ویو که از imagebutton به عنوان button استفاده کردند. راه حلش اینه که این دکمه ها رو به tempatefield تبدیل کنید.من نمیتونستم (به خاطر یه مشکل دیگه private bool Ok2Delete(int ri) // ri is the record index to be deleted
لوگوی جدید net.
با تشکر از همه دوستانی که پیام گذاشتن آناهیتا از این همه پیامی که گذاشتی متشکر واقعاً تشویق شدم. آموزش Delegate -بخش سوم برنامه های قدیمی که اصطلاحاً به آنها برنامه های تحت کنسول گفته می شد، همیشه منتظر زدن یک کلید یا نوشتن دستوری و سپس فشردن دکمه Enter توسط کاربر بودند. زمانیکه این اتفاق رخ می داد برنامه یا به سر خط می رفت یا اینکه از محیطی خارج می شد و به محیط قبلی بر می گشت. این پروسه جواب می داد اما خیلی دست کاربر در آن باز نبود و کاربران فقط می توانستند در یک مسیر حرکت کنند – مسیری که برنامه نویس برای آنها مقرر کرده بود- از طرف دیگر برنامه های مدرن (اصطلاحاً GUI) در محیطی رویداد گرا عمل می کنند. به این ترتیب که پشت هر رویدادی ماژولی نوشته شده که پس از فعال شدن رویداد آن ماژول به اجرا در می آید. در برنامه های تحت ویندورز یک سیستم polling[1] وجود ندارد همچنین منابعی برای داشتن یک چرخه که وظیفه سرکشی برای ورودی مصرف نمی شود. تمام این کارها با استفاده از سیستم رویداد انجام می شود. یک رویداد C# عضوی از کلاسی است که پس از اتفاق افتادن کاری خاص فعال می شود. هر قسمت از برنامه که علاقه مند به فعال شدن رویدادی است، برای آن ثبت نام می کند تا زمانیکه آن رویداد اتفاق افتاد او را مطلع سازند. هر زمان که رویدادی حادث می شود متدهایی که برای آن رویداد از قبل ثبت نام کرده بودند صدا زده می شوند. رویداد ها و Delegate ها برای بالا بردن کارایی سیستم دست دست هم فعالیت می کنند. شروع این فعالیت تعریف یک رویداد در کلاس می باشد. هر کلاسی که در برگیرنده کلاسی است که رویداد در آن تعریف شده می تواند متد هایش را برای آن رویداد ثبت نام کند. این کار از طریق Delegate صورت می پذیرد به این ترتیب که یک Delegate تعریف می شود تا نشانی از متد را برای رویداد ثبت نماید. این Delegate می تواند یکی از Delegate های از پیش تعریف شده .Net باشد یا یکی که خودتان تعریفش کرده اید. کد زیر چندین روش برای این کار ارائه می دهد:
using System; using System.Drawing; using System.Windows.Forms;
// custom delegate public delegate void Startdelegate();
class Eventdemo : Form { // custom event public event Startdelegate StartEvent;
public Eventdemo() { Button clickMe = new Button();
clickMe.Parent = this; clickMe.Text = "Click Me"; clickMe.Location = new Point( (ClientSize.Width - clickMe.Width) / 2, (ClientSize.Height - clickMe.Height) / 2);
// an EventHandler delegate is assigned // to the button's Click event clickMe.Click += new EventHandler(OnClickMeClicked);
// our custom "Startdelegate" delegate is assigned // to our custom "StartEvent" event. StartEvent += new Startdelegate(OnStartEvent);
// fire our custom event StartEvent(); }
// this method is called when the "clickMe" button is pressed public void OnClickMeClicked(object sender, EventArgs ea) { MessageBox.Show("You Clicked My Button!"); }
// this method is called when the "StartEvent" Event is fired public void OnStartEvent() { MessageBox.Show("I Just Started!"); }
static void Main(string[] args) { Application.Run(new Eventdemo()); } }
نکته: حتما قبل از اجرای این برنامه یک ارجاع به System.Drawing.dll و System.Windows.Forms.dll بدهید.
حتماً متوجه شده اید که کد بالا یک برنامه تحت ویندوز است. اگر چه من در اینجا زیاد درباره برنامه های تحت ویندوز صحبت نکرده ام اما برای آشنایی بیشتر بعضی از قسمت های کد را توضیح می دهم.
کلاس Eventdemo از Form، ارث بری می نماید. پس می تواند از تمام ویژگیهای فرم های ویندوز از قبیل ماکزمایز و مینیمایز شدن داشتن عنوان و ... استفاده نماید. برای اجرا شدن برنامه های دارای فرم باید متد Run() از شیی استاتیک Application صدا زده شود.
حال بهتر است نگاهی به رویداد سفارشی بیاندازیم. در زیر تعریف آن آورده شده است. همانطور که مشاهده می شود یکی از اعضای کلاس Eventdemo می باشد. که شامل کلمه کلیدی event، یک Delegate و نام رویداد میباشد. // custom event public event Startdelegate StartEvent; هر کسی که به این رویداد علاقه مند است می تواند از طریق Delegate به آن اتصال برقرار نماید. در اینجا توسط Delegate به نام StartDelegate که خودمان تعریفش کرده ایم می خواهیم به رویداد متصل شویم. با دستور =+ می توان یک Delegate را برای رویدادی ثبت کرد. برای خارج کردن Delegate از لیست ثبت نامی ها از دستور =- می توان استفاده نمود.
// our custom "Startdelegate" delegate is assigned // to our custom "StartEvent" event. StartEvent += new Startdelegate(OnStartEvent);
برای فعال کردن یک رویداد دقیقاً مثل صدا کردن یک متد رفتار می نماییم: // fire our custom event StartEvent();
روش بالا از ابتدا یک روند اتصال به رویداد را با تعریف Delegate و رویداد به شما نشان داد. ولی در برنامه نویسی معمولاً ما از رویداد ها و Delegate های از پیش تعریف شده استفاده می نماییم. برای مثال خط زیر به ما نحوه اتصال Delegate از پیش تعریف شده EventHandler را به رویداد Button Click نشان می دهد.
clickMe.Click += new EventHandler(OnClickMeClicked);
رویداد Click در کلاس Button نوشته شده است، از طرفی EventHandler هم بعنوان یک Delegate در کتابخانه .Net پیاده سازی گردیده. تنها کاری که ما باید انجام دهیم نوشتن متدی است که به هنگام فعال شدن رویداد باید اجرا شود یعنی OnClickMeClicked.
// this method is called when the "clickMe" button is pressed public void OnClickMeClicked(object sender, EventArgs ea) { MessageBox.Show("You Clicked My Button!"); }
از آنجایی که بسیاری از رویدادها و Delegate ها در کتابخانه .Net موجود می باشند. قبل از اینکه شروع به نوشتن رویداد جدید یا Delegate خاصی کنید بهتر است که یک نگاهی به کتابخانه .Net بیاندازید.
امیدوارم این مجموعه سه قسمتی درباره Delegate ها مفید واقع شده باشد. منبع: http://www.csharp-station.com/Tutorials/Lesson14.aspx
[1] سیستمی که برنامه در یک چرخه مرتباً دیگر برنامه ها را چک می کند تا ببیند حالت آنها تغییر پیدا کرده یا خیر. http://whatis.techtarget.com/definition/0,,sid9_gci214116,00.html و http://www.webopedia.com/TERM/P/polling.html
|
||
|
|