فى هذه الجزئية سنتحدث عن الأحداث
مكتبة GTK# يتم هى نظام يتم تسييره بالأحداث، كل التطبيقات الرسومية تعتمد على الأحداث، التطبيق يبدأ بحلقة تختبر الأحداث اللتى يتم توليدها... وفى حال عدم حدوث اى شئ ينتظر التطبيق ولايفعل شئ
فى المثال التالى سنشرح كيفية التفاعل مع نوعين بسيطين من الأحداث
quitbutton.cs using Gtk; using System; class SharpApp : Window { public SharpApp() : base ("Button") { SetDefaultSize(250, 200); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Fixed fix = new Fixed(); Button quit = new Button("Quit"); quit.Clicked += OnClick; quit.SetSizeRequest(80, 35); fix.Put(quit, 50, 50); Add(fix); ShowAll(); } void OnClick(object sender, EventArgs args) { Application.Quit(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى مثالنا، سنتفاعل مع الحدثين Delete, Click .. يتم اطلاق الحدث delete عندما نغلق النافذة.. لايحدث شئ افتراضيا
DeleteEvent += delegate { Application.Quit(); };عندما نستخدم الكلمة delegate، نستطيع ان نكتب سطرا يتفاعل مع ذلك الحدث
quit.Clicked += OnClick;هنا نحدد اننا نتفاعل مع الحدث Clicked عن طريق الطريقة OnClick
void OnClick(object sender, EventArgs args) { Application.Quit(); }
الطريقة OnClick تأخذ معاملين، المرسل ومعاملات الحدث -يعطى معلومات اضافية عن الحدث- وتعتمد دائما على نوع الحدث.. تستطيع ان تجد توقيع الطريقة فى الوثائق الخاصة ب GTK# هنا http://www.go-mono.com/docs/
فى المثال التالى، سنعرض كيف نتعامل مع احداث التحريك لنافذة فنعرض الموضع الحالى لأعلى يسار النافذة فى شريط العنوان
move.cs using Gtk; using System; class SharpApp : Window { public SharpApp() : base("") { SetDefaultSize(250, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Show(); } protected override bool OnConfigureEvent(Gdk.EventConfigure args) { base.OnConfigureEvent(args); Title = args.X + ", " + args.Y; return true; } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى المثال السابق، ربطنا delegate او طريقة لحدث، فى GTK# الكثير من الأحداث تعالج تلقائيا ولكننا نستطيع ان نغير سلوك معالجتها كما فى ذلك المثال
protected override bool OnConfigureEvent(Gdk.EventConfigure args) { base.OnConfigureEvent(args); Title = args.X + ", " + args.Y; return true; }
هنا نعيد تعريف الطريقة OnConfigureEvent، يتم اطلاق الحدث Configure event عندما نعيد تحديد المساحة او ننقل الويدجت،لاحظ اننا نستدعى معالج الحدث الخاص OnConfigureEvent الخاص بالأب اولا ولا لن يعمل المثال بصورة سليمة، السطر اللذى يليه نضع فيه احداثيات ال س ، ص على عنوان النافذة
Figure: Move event
الحدث EnterNotifyEvent يتم اطلاقه عند دخولنا لمنطقة الزر بمؤشر الفأرة
enter.cs using Gtk; using System; class SharpApp : Window { public SharpApp() : base("Enter") { SetDefaultSize(200, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Button button = new Button("Button"); button.EnterNotifyEvent += OnEnter; Fixed fix = new Fixed(); fix.Put(button, 20, 20); Add(fix); ShowAll(); } void OnEnter(object sender, EnterNotifyEventArgs args) { Button button = (Button) sender; button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220)); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
هنا نغير لون الخلفية للزر عندما يمر عليه مؤشر الفأرة
button.EnterNotifyEvent += OnEnter;نربط الطريقة OnEnter للحدث EnterNotifyEvent
Button button = (Button) sender; button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220));
نحصل على الزر بالتحويل القسرى ونحدد لون الخلفية.
هنا سنقوم بعرض كيفية فصل معالج الحدث -ايقاف عمله-
disconnect.cs using Gtk; using System; class SharpApp : Window { Button button; public SharpApp() : base("Disconnect") { SetDefaultSize(250, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; button = new Button("Button"); CheckButton cb = new CheckButton("connect"); cb.Toggled += OnToggled; Fixed fix = new Fixed(); fix.Put(button, 30, 50); fix.Put(cb, 130, 50); Add(fix); ShowAll(); } void OnClick(object sender, EventArgs args) { Console.WriteLine("Click"); } void OnToggled(object sender, EventArgs args) { CheckButton cb = (CheckButton) sender; if (cb.Active) { button.Clicked += OnClick; } else { button.Clicked -= OnClick; } } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى الأسطر بالأعلى لدينا زر وصندوق اختبار، نظهر كلمة Click فى الكونسول عندما نضغط على الزر اذا كان صندوق الإختبار مفعل ، حيث انه يربط او يفصل معالج الحدث Clicked الخاص بالزر
CheckButton cb = new CheckButton("connect"); cb.Toggled += OnToggled;
لدينا صندوق اختبار، ونقوم بربط حدث عكس الحالة بالطريقة OnToggled
CheckButton cb = (CheckButton) sender; if (cb.Active) { button.Clicked += OnClick; } else { button.Clicked -= OnClick; }
هذه الأسطر تربط او تفصل معالج الحدث بناءا على حالة صندوق الإختبار
Figure: Disconnect
هذا الفصل كان حول الأحداث فى GTK#
Home Contents Top of Page