Mageed

أموت ويبقى كل ماقد كتبته … فياليت من يقرأ مقالي دعا ليا
 لعل إلهي أن يمن بلطفه … ويرحم َ تقصيري وسوء فعاليا

mcqتم بحمد الله تدشين الموقع الجديد لبرامج الاسئلة الطبيه والذي هو نتاج جهود مشتركه مع الاخ سليمان وابن العم الدكتور داوود.
الفكره كانت من ابن العم الدكتور داوود حيث رأى الحاجة الملحه لمصدر سهل وقريب لاستذكار الاسئله الطبية والتي يحتاجها الاطباء كثيرا للتحضير للشهادات حيث ان الكتب والاوراق مزعجه بعض الشئ في حملها وليست مناسبة للقراءة في كل مكان. من هنا بدات الفكره بتصميم تطبيق يعمل على اجهزة الهاتف الجوال واختير الجوال حيث انه اصبح اداه ضرورية ملازمه لكثير من الناس.

لكسر الجمود واضفاء شئ من التحدي والمتعه صمم البرنامج على شكل مسابقة مكونه من اسئله ذات اختيارات متعدده للاجوبه مع وجود مساعده بطريقة مشابهة للعبة من سيربح المليون.

البرامج تعمل على نظام تشغيل سيمبيان وويندوز CE واتمنى ان تطرح قريبا لنظام تشغيل الجافا.

  • Share/Save/Bookmark
أضف تعليقك

بعد سنوات طوال مع الجافا قررت التجديد  فانخت الرحال في  تقنيات مايكروسوفت و c# تحديدا لقربها من الجافا

حقيقة مايكروسوفت ابدعت ابداع كبير في فيجول ستوديو 2008 فلم تبق شئ للمبرمج ليعمله … خطوات بسيطه ويكون التطبيق جاهز

يمكنكم تحميل نسخة تجريبية لـ VS.net 2008 لمده 90 يوم من هنا (حجم الملف تقريبا 3 قيقا ) 

قمت بعمل تطبيق اضاف لي الكثير  حيث لم يكن بالتطبيق البسيط بل كان يحوي عدة اجزاء مهمه فالبيانات يتم جلبها من قاعدة بيانات اوراكل و Microsoft Active Directory لقراءة معلومات المستخدمين وتقارير ديناميكية حسب رغبة المستخدم … كل هذا جعل من التجربة رائعه وممتعه لكثرة التعقيد والتجارب وخصوصا على مبتدئ مثلي فتعلمت الكثير في ايام قليلة … مع خالص التحية و التقدير للعم قوقل على مساعداته الجباره

كانت هناك مشاكل استعصت علي ووجدت حلول لها بحمد الله واضعها هنا للفائده

1- الاتصال باوراكل

كما هو معروف ان معلومات الاتصال بقواعد البيانات في اوراكل تخزن في الملف tnsnames.ora لكن مالعمل ان كانت معلومات قاعدة البيانات التي يتصل بها برنامجك غير معده عند المستخدم؟ طبعا انت لاتريد ان تشغل المستخدمين باعدادات معقده لاسيما ان بعضهم ليس عنده خبره كافيه فاليك الحل

معلومات الاتصال المخزنه في tnsnames.ora هي بهذه الصيغه

myserver.server.com = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host=

myserver.server.com)(Port= yourPort#))(CONNECT_DATA = (SID = yourSID)) )

كل ماعليك هو وضع نفس الصيغه في الكود الخاص بالاتصال بقاعده البيانات ليصبح كالتالي

1
private static string CONNECTION_STRING = "User Id=myUserID;Password=myPassword;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver.server.com)(PORT=yourPort#))(CONNECT_DATA=(SID=yourSID)));";

وهذا كود كامل يشرح طريقة الاتصال

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Data.OracleClient;   static private string GetConnectionString()
{ 
 
   return "User Id=myUserID;Password=myPassword;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver.server.com)(PORT=yourPort#))(CONNECT_DATA=(SID=yourSID)));";
}
 
// This will open the connection and query the database
static private void ConnectAndQuery()
{
  string connectionString = GetConnectionString();
  using (OracleConnection connection = new OracleConnection())
  {
    connection.ConnectionString = connectionString;
    connection.Open(); 
 
    OracleCommand command = connection.CreateCommand();
    string sql = "SELECT * FROM MYTABLE";
    command.CommandText = sql; 
 
    OracleDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
      string myField = (string)reader["MYFIELD"];
      Console.WriteLine(myField);
    }
  }
}

ايضا يمكن وضع هذا المتغير في الملف app.config  لتتمكن من الوصول اليه في اي وقت عن طريق

1
string connectionSting = ConfigurationManager.ConnectionStrings["Your_var_Name"].ConnectionString;

2- تحديث جدول البيانات من نافذه اخرى

قمت بانشاء نافذه تحوي DataGridView فيها بعض الاسماء وعندما يريد المستخدم اضافة اسم جديد للقائمة تظهر نافذه جديده ومن خلالها يبحث عن المستخدم في دليل الشركه (MS Active Directory)

image

كان الاشكال كيف اضيف الاسم الجديد الى DataGridView في الفورم الاصلي من الفورم الحالي بدون ان يشعر المستخدم ؟ كان هناك عده حلول لكن الحل الذي عمل معي بشكل رائع هو ان اضيف حدث في الفورم الاصلي ليستمع الى اغلاق الفورم المفتوح وعندها يقوم باجراء التحديث وكان الكود بهذا الشكل

1
2
3
4
5
6
7
Form2 childForm = new Form2();
childForm.FormClosed += newFormClosedEventHandler(childForm_FormClosed);
childForm.Show();
void childForm_FormClosed(object sender,FormClosedEventArgs e)
{
//Your logic to refresh the DataGridView goes here
}

وهذا الكود الخاص بقراءة الاسم من مايكروسوفت(ActiveDirectory)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 public static string GetFullName(string strLogin)
        {
            strLogin = "aramco\\" + strLogin;
            string str = "";
            string strDomain;
            string strName;
 
            // Parse the string to check if domain name is present.
            int idx = strLogin.IndexOf('\\');
            if (idx == -1)
            {
                idx = strLogin.IndexOf('@');
            }
 
            if (idx != -1)
            {
                strDomain = strLogin.Substring(0, idx);
                strName = strLogin.Substring(idx + 1);
            }
            else
            {
                strDomain = Environment.MachineName;
                strName = strLogin;
            }
 
            DirectoryEntry obDirEntry = null;
            try
            {
                obDirEntry = new DirectoryEntry("WinNT://" + strDomain + "/" + strName);
                System.DirectoryServices.PropertyCollection coll = obDirEntry.Properties;
                object obVal = coll["FullName"].Value;
                str = obVal.ToString();
            }
            catch (Exception ex)
            {
                str = ex.Message;
            }
            return str;
        }

3- تحديث التقارير

من ضمن التطبيق كان هناك جزء خاص بالتقارير وكان انشاء التقارير سهلا وبسيطا حيث قام الفيجول ستوديو بعمل جميع المهام وربط التقارير بجداول البيانات وانشاء الاكواد تلقائيا بضغطات ازرار بسيطه … لكن انا لا اريد تقريرا ثابتا لكن اريد تقرير حسب رغبة المستخدم فهو الذي يحدد مثلا المدة الزمنية للمعلومات التي يريدها فما الحل؟

الحل كان البحث عن الدوال التي توفر المعلومه للتقرير بعدها ياتي دور انشاء الاستعلام من جديد وتحديث جدول البياناتTableAdapter المربوطه في التقرير

1
2
3
YourTableAdapter._commandCollection = this.YourTableAdapter.CommandCollection;
this.YourTableAdapter._commandCollection[0].CommandText = &quot;Select * From.......&quot;;<p></p>
<p></p>

_commandCollection تلقائيا هي private  فغيرها الى public لتستطيع الوصول اليها  

بعدها قم باعادة ربطها من جديد بالتقرير

1
2
3
4
5
Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource();
reportDataSource1.Name = &quot;Name_OF_Your_Data_Source&quot;;
reportDataSource1.Value = this.YourBindingSource;
this.reportViewer1.LocalReport.DataSources.Add(reportDataSource1);
this.reportViewer1.RefreshReport();

4- عامود الوقت في جدول البيانات

في جدول البيانات وتسهيلا على المستخدم يفضل ان تجعله يختار الوقت والتاريخ عن طريق dateTimePicker حتى تكون الفورمات متناسقه والاختيار بلا شك اسهل من الكتابة اليدويه للمستخدم

image

للحصول على هذه اضف هذا الكلاس في مشروعك ومن ثم اعمل له Build وبعدها ستجد نوع من الاعمده اسمه microsoftDateTimePicker

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
using System;
using System.Collections.Generic;
using System.Text;
 
namespace YourAppNameSpace
{
    using System;
    using System.Windows.Forms;
 
    public class MicrosoftDateTimePicker : DataGridViewColumn
    {
        public MicrosoftDateTimePicker()
            : base(new CalendarCell())
        {
        }
 
        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                // Ensure that the cell used for the template is a CalendarCell.
                if (value != null &amp;&amp;
                    !value.GetType().IsAssignableFrom(typeof(CalendarCell)))
                {
                    throw new InvalidCastException(&quot;Must be a CalendarCell&quot;);
                }
                base.CellTemplate = value;
            }
        }
    }
 
    public class CalendarCell : DataGridViewTextBoxCell
    {
 
        public CalendarCell()
            : base()
        {
            // Use the short date format.
            this.Style.Format = &quot;d&quot;;
        }
 
        public override void InitializeEditingControl(int rowIndex, object
            initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            // Set the value of the editing control to the current cell value.
            base.InitializeEditingControl(rowIndex, initialFormattedValue,
                dataGridViewCellStyle);
            CalendarEditingControl ctl =
                DataGridView.EditingControl as CalendarEditingControl;
            ctl.Value = (DateTime)this.Value;
        }
 
        public override Type EditType
        {
            get
            {
                // Return the type of the editing contol that CalendarCell uses.
                return typeof(CalendarEditingControl);
            }
        }
 
        public override Type ValueType
        {
            get
            {
                // Return the type of the value that CalendarCell contains.
                return typeof(DateTime);
            }
        }
 
        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return DateTime.Now;
            }
        }
    }
 
    class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;
 
        public CalendarEditingControl()
        {
            this.Format = DateTimePickerFormat.Short;
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
        // property.
        public object EditingControlFormattedValue
        {
            get
            {
                return this.Value.ToShortDateString();
            }
            set
            {
                if (value is String)
                {
                    this.Value = DateTime.Parse((String)value);
                }
            }
        }
 
        // Implements the 
        // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
        public object GetEditingControlFormattedValue(
            DataGridViewDataErrorContexts context)
        {
            return EditingControlFormattedValue;
        }
 
        // Implements the 
        // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
        public void ApplyCellStyleToEditingControl(
            DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
            this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlRowIndex 
        // property.
        public int EditingControlRowIndex
        {
            get
            {
                return rowIndex;
            }
            set
            {
                rowIndex = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey 
        // method.
        public bool EditingControlWantsInputKey(
            Keys key, bool dataGridViewWantsInputKey)
        {
            // Let the DateTimePicker handle the keys listed.
            switch (key &amp; Keys.KeyCode)
            {
                case Keys.Left:
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Home:
                case Keys.End:
                case Keys.PageDown:
                case Keys.PageUp:
                    return true;
                default:
                    return false;
            }
        }
 
        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
        // method.
        public void PrepareEditingControlForEdit(bool selectAll)
        {
            // No preparation needs to be done.
        }
 
        // Implements the IDataGridViewEditingControl
        // .RepositionEditingControlOnValueChange property.
        public bool RepositionEditingControlOnValueChange
        {
            get
            {
                return false;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // .EditingControlDataGridView property.
        public DataGridView EditingControlDataGridView
        {
            get
            {
                return dataGridView;
            }
            set
            {
                dataGridView = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // .EditingControlValueChanged property.
        public bool EditingControlValueChanged
        {
            get
            {
                return valueChanged;
            }
            set
            {
                valueChanged = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // .EditingPanelCursor property.
        public Cursor EditingPanelCursor
        {
            get
            {
                return base.Cursor;
            }
        }
 
        protected override void OnValueChanged(EventArgs eventargs)
        {
            // Notify the DataGridView that the contents of the cell
            // have changed.
            valueChanged = true;
            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            base.OnValueChanged(eventargs);
        }
    }
}
  • Share/Save/Bookmark
أضف تعليقك

هذه الايام استمتع بالعمل على تطوير بعض التطبيقات بتقنية .net والتي بسطت الكثير للمبرمج فاخراج التطبيق المتكامل لم يعد يحتاج ذلك العناء.

في احد التطبيقات استخدمت Reportviewer لعرض تقارير من قاعدة بيانات اوراكل لكن كان من ضمن الحقول حقل للوقت وهو بصيغة UTC وهي عدد صحيح طويل يمثل الثواني من تاريخ معين. عموما كان عمل داله لتقوم بالتحويل في ReportViewer فلم طويل ونهايته غير معروفه بالنسبة لي لاني بدات ارى اخطاء غريبه تحتاج لعمليات ترقيع طويله

بحثت عن البديل فكان البديل سهل ومريح جدا حيث اقوم بالتحويل من خلال دوال اوراكل في الاستعلام عن البيانات وعرضها كما هي في التقرير …للتحويل يكون الاستعلام بالشكل التالي

select to_char(to_date('01-JAN-1970','DD-MON-YYYY')+(create_time/ (60 * 60 * 24) ),'DD-MON-YYYY HH24:MI:SS') as create_time from .....

create_time هو اسم الحقل الذي تريد تحويله من قاعدة البيانات

  • Share/Save/Bookmark
أضف تعليقك

هذا الموضوع موجه لمطوري البلاك بيري ممن يمتلكون خلفيه كافيه عن بيئة تطوير البرامج لهذه الاجهزه وساورد فيه حلول لبعض الاشكالات التي واجهتها والتي قد تواجه غيري من المطورين والغرض من ذلك هو توفير وقت البحث عن حلول هذه الاشكالات وجمعها في مكان واحد

  • اعداد simulator للعمل مع بروكسي

اذا كنت تعمل خلف بروكسي كحالي في الشركه واردت ان يعمل المحاكي(ٍSimulator) مع هذا البروكسي للدخول للانترنت فكل ماعليك هو:

اذهب الى هذا المجلد Program Files\Research In Motion\BlackBerry JDE #.#\MDS\config
حرر الملف المسمى rimpublic.property وذلك باضافه هذه الاسطر في القسم [HTTP HANDLER]
application.handler.http.proxyEnabled = true
application.handler.http.proxyHost=Your_proxy_host
application.handler.http.proxyPort=Your_proxy_port

  • التصريح باستخدام الدوال المحميه

تقوم بلاك بيري بحمايه بعض الدوال الخاصه بالتشفير والجهاز وغيرها (يمكنك معرفه الدوال المحميه بوجود رمز القفل الى جوارها في مكتبة الدوال API Document) ولذلك يتطلب منك وجود تصريح للتمكن من تشغيل برنامجك الذي يستخدم هذه الدوال على جهاز بلاك بيري لكن في المحاكي يمكنك تجربه البرنامج بدون مشاكل.
للحصول على تصريح يجب عليك تعبئة نموذج الطلب والذي يتطلب منك وجود بطاقه ائتمانيه لدفع الرسوم وهي 20 دولار وهذا التصريح يخولك الحصول على عدد كبير من تصاريح التوثيق للبرنامج (بالنسبه لي حصلت على 2147483647 تصريح :) )

عند تعبئة الطلب هناك حقل لـ PIN وهو رقم من عشر خانات تختاره انت ويجب ان تتذكره جيدا حتى تتمكن من تفعيل طلبك عند قبوله.
عند قبول طلبك سيصلك على بريدك ثلاث ملفات RRTو RCRوRBB وهي الملفات الخاصه بالتسجيل
حمل هذه الملفات على جهازك

  1. اضغط على كل ملف مرتين وستظهر لك نافذه تطلب موافقتك على انشاء مفتاح تشفير اذا لم يكن موجودا لديك مسبقا … اختر موافق
  2. ستظهر لك نافذه جديده تطلب منك ادخال رمز مرور والذي يجب ان تتذكره جيدا لانك ستحتاجه دائما عند طلب اي تصريح لبرامجك
  3. ستظهر لك نافذه جديده قم بتحريك الفاره لانشاء رمز التشفير واضغط موافق عند الانتهاء
  4. ستظهر لك نافذه تطلب منك ادخال رقم PIN الذي اخترته في نموذج الطلب
  5. سيطلب منك ادخال رمز المرور الذي اخترته في الخطوه 2
  6. اختر تسجيل

هذه الخطوات ستظهر لك عند تسجيل اول ملف فقط والملفات الباقيه سيطلب منك فقط رمز المرور الذي اخترته

قد تواجه مشكله بعدم عمل الملفات عند الضغط عليها فعندئذ يمكنك عمل الخطوات يدويا من خلال سطر الاوامر بعمل التالي

  1. احفظ الملفات الثلاث في هذا المجلد C:\Program Files\Research In Motion\BlackBerry JDE [version]\bin
  2. افتح موجه الدوس واذهب الى المجلد الذي في الاعلى
  3. اكتب هذا الامر javaw -jar SignatureTool.jar [your file name].csi
  4. اتبع الخطوات التي ذكرتها سابقا

بعد هذا اذا كان برنامجك يستخدم دوال محميه وارد عمل ترخيص له فقم بالاتي:

  1. في محرر الكود JDE اذهب الى Build > Request Signature
  2. ستظهر لك نافذه تخبرك بالتصاريح المطلوبه اختر Request
  3. سيطلب منك رمز المرور للحصول على التصريح … طبعا لاننسى انه لابد ان تكون متصلا بالانترنت لعمل ذلك
  • اضافه مكتبات خارجيه الى برنامجك

اذا كنت تستخدم في برنامجك مكتبه jar فيجب عليك استخدام هذه الطريقه لاضافتها الى مشروعك لان الطرق الاعتياديه لنا كمطورين وهي اضافه المكتبه الى خصائص المشروع لن تجدي في بلاك بيري الاعند عمل compile للكود فقط لانك ستتفاجا بالاخطاء عند تركيب البرنامج على الجهاز لعدم وجود المكتبه فيه… فلحل هذا الاشكال يجب عليك الاتي:

  1. انشء مشروع جديد في workspace الذي تعمل فيه
  2. اضغط باليمين على المشروع واختر properties > Application واختر library من قائمه project type
  3. اضف ملفات jar التي تريدها الى المشروع
  4. في المشروع الاصلي والذي ستكتب فيه الكود الذي سيستخدم هذه المكتبات اضغط باليمين على المشروع واختر properties > Project Dependinces
  5. حدد من القائمه اسم المشروع الذي يحوي ملفات المكتبات الذي انشاءته في الخطوه 1
  6. عند بناء التطبيق سيظهر لك ملف cod باسم المشروع الاصلي وملف اخر ايضا باسم مشروع المكتبه يجب ان يكونوا في نفس المجلد الذي يحوي الملف alx عند تركيب البرنامج بالجهاز

قد تواجه الخطأ “Missing stack map ” بسبب بعض المكتبات وحل ذلك ان تعمل لها preverify قبل اداراجها بالمشروع

  • Share/Save/Bookmark
2 تعليقات

شهادة مطور معتمد لتطبيقات جافا لاجهزة الهاتف الجوال Sun Certified Mobile Application Developer (SCMAD)

للحصول على هذه الشهاده لابد من اجتياز الاختبار والذي يحوي 68 سؤالا ويلزمك الاجابة على 55% من الاسئلة اي 38 اجابه صحيحه لتتمكن من الحصول على الشهاده.

تغطي اسئله الاختبار 11 فرعا مهما وهي:

1- JTWI وهو المعيار القياسي للتطبيقات

2- CLCD(1.0 &1.1)

3- الحماية والامن

4- الشبكات والاتصال

5- تصميم التطبيقات

6- وحدة تخزين البيانات

7- Push Registry

8- دوال تصميم الواجهات الرسوميه

9- دوال تصميم الالعاب

10- دوال الملتميديا

11- دوال الرسائل

لقراءة بقية التدوينة »

  • Share/Save/Bookmark
تعليق واحد