اذهب إلى المحتوى

E.Nourddine

الأعضاء
  • المساهمات

    1458
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    18

كل منشورات العضو E.Nourddine

  1. لنضع في الحسبان أن أي شركة كيفما كان مجال تخصصها تُركز على الاتقان في العمل والخبرة السابقة للموظف -المستقل-، ذلك أن هذه المعايير من شأنها أن تعزز الاختيار الصائب للمستخدم الجديد، ولتطرح السؤال التالي على نفسك، ماهي المعايير التي ستركز عليها في حال كنت مدير شركة وتريد توظيف أحدهم؟ هل ستقبل بأول متقدم للوظيفة؟ هل ستضع شروطا من شأنها فلترة و إحصاء المتمييزين منهم؟ في نظري معرض الأعمال هو الشئ الأساسي الذي يحكم في خبرة المستقل، ويعكس نسبة قبوله الأولي واستدعاءه لمقابلة من لدن الشركة. ستطرح السؤال التالي: أنا مبتدئ وليس لدي معرض أعمال، ما العمل؟ الجواب: اِعمل مشاريع بشكل تطوعي واكتسب الخبرة. اِْعمل على المشاريع المفتوحة المصدر. اِبق على اطلاع بالجديد في تخصصك. وهكذ مع الوقت ستتراكم مشاريع -وإن كانت صغيرة- في معرض أعمالك. اِحرص على التميز في مجال محدد، ولا تشتت التركيز؟
  2. يحيى دعنا نتفق على بعض الأساسيات لنكون على توافق في المفاهيم، لغة #C هي كأي لغة أخرى، ولعل أحد المميزات التي تتمز بها هذه اللغة، والتي تأتي ضمن لغات الفيجوال بيسيك من قبل مايكروسوفت، حيث يمكنك بناء تطبيقات سطح مكتب، تطبيقات ويب... بالاعتماد على نفس اللغة والتي هي #C في هذه الحالة، أي أنك ستستخدم نفس الأدوات: textbox، label،Radiobutton...مع بعض الإضافات البسيطة والأدوات الجديدة. كما أن البرمجة على الويب تمتاز ببعض الخصوصية، حيث ستتم برمجة الواجهات بلغة html5 سواء اعتمدت على mode designer أو الكود، بالاضافة إلى Javascript،jQuery،Css والتي تعتبر تكميلا أساسيا في بناء تطبيقات الويب، على أن يكون التعامل مع البيانات، التحكم في الأدوات واستخراج قيمها عن طريق لغة #C، نطلق على البرمجة في الويب بـ #C برمجة ASP.Net بلغة #C. هذه دورة فيديو بـ ASP.Net ِ#C:
  3. يحب التأكد منن ربط التطبيق وَ قاعدة البيانات بشكل صحيح، لأنه يوجد خلل ما في التطبيق -من خلال شرحك في السؤال-، شخصيا أقوم بربط التطبيق بقواعد بيانات access بواسطة الكود: Dim Conn As New ADODB.Connection Dim Rec As New ADODB.Recordset Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & "dbase1.mdb" Conn.Open() End Sub أمثلة تطبيقية يمكنك الاستفادة منها: VB.Net - Database Access How to: Connect to Data in an Access Database يمكنك الاستعانة بالفيديو:
  4. يمكن استعمال المثال التالي كنموذج، وأظنه يصب في نفس ما تصبو إليه: Set ws = Sheets("Sheet1") ws.Range(ws.Range("J1:K1"), ws.Range("J1:K1").End(xlDown)).Copy Sheets("Sheet2").Range("A1").End(xlDown).Offset(1,0).Paste حيث: Sheet1: هي الصفحة أو جدول إكسل. المجال (J1:K1) حيث خصصت الكلمة Rang لتعيين المجال الذي نريد تحديده لنسخه باستعمال الوظيفة Copy. ثم ننسخه في الصفحة الثانية Sheet2 ابتداءً من الخانة A1. المصدر: Dynamic range of data to paste into another sheet Copy Data to Another Worksheet with Advanced Filter
  5. أُرشدك إلى عدو مواقع تعمل أونلاين وبشكل مجاني، حيث ستتبع الخطوات التالية: تختار ملف الفلاش من خلال زر التصفح الموجود بالموقع. تختار نوع الملف المستخرج لإى آخر التحويل. قد تحتاج إلى ادخال بريدك الالكتروني لاستقبال الملف على شكل رسالة تبعث لك. ضغط زر convert لبدء عملية التحويل. المواقع: موقع zamzar video.online-convert. Convert Files جل المواقع لها نفس الاستراتيجية في عملية التحويل.
  6. يمكن ايجاد الفرق بين عنصري property وّ attribute في برمجة الويب، خصوصا عند التحدث عن DOM. بخصوص property يمكن الحصول على قيم مختلف الخصائص properties المتعلقة بوسوم html، حيث نحصل على أنواع مختلف من القيم: boolean، string... من خلال استعمال خاصية prop علىjQuery كما هو موضح أسفله: لديناوسم الرابط <a href='page2.html' class='link classes' name='linkName' id='linkID'>Hi</a> property لاستخراج قيم jQueryعند استعمال كود $('#linkID').prop('href'); // returns "http://example.com/page2.html" $('#linkID').prop('name'); // returns "linkName" $('#linkID').prop('id'); // returns "linkID" $('#linkID').prop('className'); // returns "link classes" يمكن تغيير و تحديث قيم Prop من خلال jQuery بواسط الكود: <a href='page2.html'>Hi</a> $('#linkID').prop('href', 'page1.html'); $('#linkID').prop('href'); // returns "http://example.com/page1.html" بالنسبة لـattribute تتعلق بلغة html اكثر منDOM، ويمكن ملاحظة الفرق مع خاصية property من خلال الكود التالي: <input type="checkbox" checked=true/> $('input').prop('checked'); // returns true $('input').attr('checked'); // returns "checked" تتميز خاصية attribute بحفاظها على القيم الافتراضية التي أخذها الوسم (default value)، ويمكن اعتبارها ميزة في بعض الأحيان، كما قد تعطي القيمة الخطأ للمبرمج في حين تم تحيين قيمة الوسم، كمثال لذلك: <input type="text" name="username" value="user123"> $('input').prop('value', '456user'); $('input').prop('value'); // returns "456user" $('input').attr('value'); // returns "user123"
  7. هذه التقنية تدعى بـ Clipping Mask وهي من بين التقنيات الأساسية التي يعتمد عليها المصمم أثناء بناء تصاميمه، حيث تركز هذه التقنية على مزج طبقتين فيما بينهما ومع امكانية التحكم في إضاءة كل طبقة، يمكن التوصل إلى النتيجة المرغوب بها. الشرح المقدم في الرابط ستحصل على النتيجة التالية: وذلك من خلال عملية Clipping Mask للصورة المبينة أسفله: الفيديو التالي يقدم شرحا مبسطا للعملية: مقالات ذات صلة بالموضوع: طريقة عمل تأثير نصي على صورة باستخدام فوتوشوب. طريقة عمل رسمة شبه حقيقية باستخدام فوتوشوب. تحويل صورة فوتوغرافية إلى مخطط رسم بقلم رصاص في فوتوشوب
  8. الطريقة الأنسب هي أن توظف مبرمجاً ملماً ومتقناً لعمله، على أن يتم الاتفاق بينكما في بادئ الأمر على كيفية العمل، حيث من الممكن أن يكون الاتفاق بشكل عام على أحد الشكلين: توظيف المستقل للقيام بإنجاز المهام المنوط به عملها، دون إدخاله في حيثيات الربح من التطبيق، نجاحه أو فشله، وفي هذه الحالة ستنتهي مهمته بعد إتمام البرمجة. الطريقة الثانية التي من الممكن أن يتعاقد معك بها المستقل، أن يكون شريكا بشكل جزئي في المشروع، حيث تضمن استمراريته معك، وأيضًا تأجيل مقابل أتعابه إلى حين نجاح المشروع والربح منه. أرجو أن تطلّع على المقالين التاليين، لأنهما يصبان في صلب موضوع سؤالك: كيف تبدأ مشروعا تجاريا تقنيا إن كنت لا تحسن البرمجة؟ "سرقة الأفكار" في عالم ريادة الأعمال، وهم أم حقيقة؟
  9. لغة #C أصبحت من اللغات المهمة والمطلوبة في الوقت الراهن، ذلك أن مايكروسوفت ومن خلال visual studio اصبحت توفر أدوات سهلة الاستعمال وضرورية لكل مبرمج بهذه اللغة، مما جعل العديد من محترفي البرمجة بـ#C يبدعون في إنشاء دورات تعليمية، وأخص بالذكر المجانية منها أي المتاحةوسهلة النهل، والتي في الغالب ما ستجدها بالانجليزية لكثرة المصادر بهذه اللغة. إليك لائحة بأجود الدورات في البرمجة بلغة #C: سلسلة دروس سي شارب على أكاديمية حسوب. سلسلة من الدروس في #C. أساسيات #C. درس من 6 ساعات على يوتيوب:
  10. لتفادي مثل هذه المشاكل البسيطة اثناء كتابة الأكودا البرمجية أدعوك إلى استعمال: Sublime Text 3: محرر نص مخصص لكتابة الأكواد البرمجية، وهو جيد جداُ، حيث يتيح لك التكويد بيسر مع إظهار الكود بشكل ملوّن، مفرقاً بين الوسوم، الخصائص، المتغيرات... لتسهيل عملية المراجعة عند حدوث الخطأ. sublime text 3 emmet : إضافة على subblimetext ومحررات نص أخرى، يتيح لك اختصارات مدهشة لكتابة كود برمجي بسرعة جيدة، مثلا عوض كتابتك لـ: <div> <ul> <li></li> </ul> </div> ستكتفي بكتابة: div>ul>li مع الضغط على رز Tab لينتج عنه الكود الأول، وهذا فقط مثال بسيط، كما يمكنك الاطلاع على لائحة بأهم الاختصارات الأكثر استعمالاً من هنا. كيفية تنصيب Sublime Text:
  11. الطريقة المستعملة عند المبرمجين، لجعل الزر ذي تأثير بيضاوي أو بزوايا خارجية دائرية -border radius-، هي باستعمال مكتبة Drawin2D، حيث ننشئ شكل بيضوي وزوايا دائرية ليتم بعد ذلك تطبيق التأثير على الزر أثناء بناء الواجهة أي عند حدث Form1_Load، بواسط الكود التالي: Dim p As New Drawing2D.GraphicsPath p.StartFigure() p.AddArc(New Rectangle(0, 0, 40, 40), 180, 90) p.AddLine(40, 0, Button1.Width - 40, 0) p.AddArc(New Rectangle(Button1.Width - 40, 0, 40, 40), -90, 90) p.AddLine(Button1.Width, 40, Button1.Width, Button1.Height - 40) p.AddArc(New Rectangle(Button1.Width - 40, Button1.Height - 40, 40, 40), 0, 90) p.AddLine(Button1.Width - 40, Button1.Height, 40, Button1.Height) p.AddArc(New Rectangle(0, Button1.Height - 40, 40, 40), 90, 90) p.CloseFigure() Button1.Region = New Region(p) أيضا يمكن استعمال الطريقة المبينة في الرابط حيث تم استعمال مكتبة Microsoft Visual Basic PowerPacks. لنحصل على : الفيديوالتالي يتضمن شرحاً مفصلا للعملية:
  12. الفروق الجلية هي كالآتي: Xamarin: يوفر إمكانية البرمجة لثلاث بيئات: Android،iOS وَWidows. أصبح مجاني مؤخرًا بعد تضمينه مع Visual Studio لغة البرمجة هي #C. Android Studio: مخصص لبرمجة تطبيقات أندرويد فقط. مجاني. لغة Java هي لغة البرمجة. مصادر أخرى: Eclipse vs. Android Studio vs. Xamarin What are the pros and cons of using Xamarin for Android development?
  13. كتعريف لـ class linked list على لغة ++C، هي مصفوفة مكونة من بنيات بيانات تُخزّن يها بيانات لا يُشترط أن تكون من نفس النوع، وتربط بينها مؤشرات Pointersبطريقة متسلسلة. صورة موضحة لبنية class Linked list: أيضا: linkedlist.bmp الفرق بين linked list وَ مصفوفة array: array: محدودة الطول. الحذف والاضافة تتطلب وقت. قراءة العناصر يتم عن طريقindex. Linked Lists: طول قابل للتغيير. الحذف والاضافة فعالة. قراءة العناصر بالتتابع. مثال: #include <iostream> using namespace std; struct Node { int data; Node* next; }; // only for the 1st Node void initNode(struct Node *head,int n){ head->data = n; head->next =NULL; } // apending void addNode(struct Node *head, int n) { Node *newNode = new Node; newNode->data = n; newNode->next = NULL; Node *cur = head; while(cur) { if(cur->next == NULL) { cur->next = newNode; return; } cur = cur->next; } } void insertFront(struct Node **head, int n) { Node *newNode = new Node; newNode->data = n; newNode->next = *head; *head = newNode; } struct Node *searchNode(struct Node *head, int n) { Node *cur = head; while(cur) { if(cur->data == n) return cur; cur = cur->next; } cout << "No Node " << n << " in list.\n"; } bool deleteNode(struct Node **head, Node *ptrDel) { Node *cur = *head; if(ptrDel == *head) { *head = cur->next; delete ptrDel; return true; } while(cur) { if(cur->next == ptrDel) { cur->next = ptrDel->next; delete ptrDel; return true; } cur = cur->next; } return false; } /* reverse the list */ struct Node* reverse(struct Node** head) { Node *parent = *head; Node *me = parent->next; Node *child = me->next; /* make parent as tail */ parent->next = NULL; while(child) { me->next = parent; parent = me; me = child; child = child->next; } me->next = parent; *head = me; return *head; } /* Creating a copy of a linked list */ void copyLinkedList(struct Node *node, struct Node **pNew) { if(node != NULL) { *pNew = new Node; (*pNew)->data = node->data; (*pNew)->next = NULL; copyLinkedList(node->next, &((*pNew)->next)); } } /* Compare two linked list */ /* return value: same(1), different(0) */ int compareLinkedList(struct Node *node1, struct Node *node2) { static int flag; /* both lists are NULL */ if(node1 == NULL && node2 == NULL) { flag = 1; } else { if(node1 == NULL || node2 == NULL) flag = 0; else if(node1->data != node2->data) flag = 0; else compareLinkedList(node1->next, node2->next); } return flag; } void deleteLinkedList(struct Node **node) { struct Node *tmpNode; while(*node) { tmpNode = *node; *node = tmpNode->next; delete tmpNode; } } void display(struct Node *head) { Node *list = head; while(list) { cout << list->data << " "; list = list->next; } cout << endl; cout << endl; } int main() { struct Node *newHead; struct Node *head = new Node; initNode(head,10); display(head); addNode(head,20); display(head); addNode(head,30); display(head); addNode(head,35); display(head); addNode(head,40); display(head); insertFront(&head,5); display(head); int numDel = 5; Node *ptrDelete = searchNode(head,numDel); if(deleteNode(&head,ptrDelete)) cout << "Node "<< numDel << " deleted!\n"; display(head); cout << "The list is reversed\n"; reverse(&head); display(head); cout << "The list is copied\n"; copyLinkedList(head,&newHead); display(newHead); cout << "Comparing the two lists...\n"; cout << "Are the two lists same?\n"; if(compareLinkedList(head,newHead)) cout << "Yes, they are same!\n"; else cout << "No, they are different!\n"; cout << endl; numDel = 35; ptrDelete = searchNode(newHead,numDel); if(deleteNode(&newHead,ptrDelete)) { cout << "Node "<< numDel << " deleted!\n"; cout << "The new list after the delete is\n"; display(newHead); } cout << "Comparing the two lists again...\n"; cout << "Are the two lists same?\n"; if(compareLinkedList(head,newHead)) cout << "Yes, they are same!\n"; else cout << "No, they are different!\n"; cout << endl; cout << "Deleting the copied list\n"; deleteLinkedList(&newHead); display(newHead); return 0; } النتيجة: 10 10 20 10 20 30 10 20 30 35 10 20 30 35 40 5 10 20 30 35 40 Node 5 deleted! 10 20 30 35 40 The list is reversed 40 35 30 20 10 The list is copied 40 35 30 20 10 Comparing the two lists... Are the two lists same? Yes, they are same! Node 35 deleted! The new list after the delete is 40 30 20 10 Comparing the two lists again... Are the two lists same? No, they are different! Deleting the copied list هناك دورة فيديو على موقع youtube: مصادر أخرى: C++ Tutorial: Intro to Linked Lists Linked Lists C++ Tutorial - Linked List Examples - 2016
  14. الطريقة المتبعة في هذه التقنية هي كالآتي: الاعتماد على جدول ثنائي الأبعاد Table 2D، ليتم الاعتماد عليه كهيكل للشكل المُراد رسمه، حيث نملأ خانات محددة ونترك أخرى فارغة، حسب طبيعة الشكل. مثلا في حالة الحصول على شكل مثلث: * *** ***** ******* ********* نستعمل الكود التالي، حيث نستعمل حلقتي تكرار من نوع For loop، نملأ خانات ونترك خانات أخرى فارغة، بالشكل المبين في الكود: #include <stdio.h> int main() { int row, c, n, temp; printf("أدخل رقم الأسطر المُراد إدراجها في المثلث "); scanf("%d",&n); temp = n; for ( row = 1 ; row <= n ; row++ ) { for ( c = 1 ; c < temp ; c++ ) printf(" "); temp--; for ( c = 1 ; c <= 2*row - 1 ; c++ ) printf("*"); printf("\n"); } return 0; } نحصل على الشكل: يمكن أيضا طباعة ورسم مثلث بأرقام عوض النجوم: #include<stdio.h> main() { int n, c, d, num = 1, space; scanf("%d",&n); space = n - 1; for ( d = 1 ; d <= n ; d++ ) { num = d; for ( c = 1 ; c <= space ; c++ ) printf(" "); space--; for ( c = 1 ; c <= d ; c++ ) { printf("%d", num); num++; } num--; num--; for ( c = 1 ; c < d ; c++) { printf("%d", num); num--; } printf("\n"); } return 0; } لتكون النتيجة: 1 232 34543 4567654 567898765 مصادر: C program to print patterns of numbers and stars C program to print diamond pattern
  15. Visual FoxPro أو كما يطبق عليه (VFP) هو أداة جد قوية لشركة Microsoft، حيث ظهر هذا البرنامج منذ سنة 1995، ويحتوي لغة برمجة ومحرك قواعد بيانات علائقية، حسث يتيح امكانية البرمجة مع ربط التطبيق بقاعدة البيانات الخاصة به، دون اللجوء إلى اضافة خارجية. بعض الدروس: Foxpro Tutorial and Programs Learning Visual FoxPro Videos رابط فيديو تعليمي، يمكنك تفعيل الترجمة الفورية للاستفادة وتخطي مشكل اللغة:
  16. تعتمد مثل هذه المواقع على سكريبت مكون بالأساس من تقنية Html5 التي توفر أدوات جد متطورةمثل Canvas، بالاضافة إلى Javascrip التي تمكن من توفير خاصية السحب والجر Drag and Drop. توفر المكتب التالية على موقع github إمكانية تضمين هذه الخدمة على موقعك، المكتبة باسم miniPaint. هذه صورة من Demo السكريبت: أيضا يمكنك اقتناء السكريبت التالي من موقع http://codecanyon.net بسعر 10 دولار فقط.
  17. جرب الكود التالي: #include <stdio.h> char buffer[128]; /* عدد أحرف السطر المبحوث عنه */ FILE * in, * out; in = fopen( "input.txt", "r" ); out = fopen( "output.txt", "w" ); if ( in == NULL || out == NULL ) { perror( "fopen" ); } while ( ! feof( in )) { if ( fgets( buffer, 128, in ) == NULL ) { perror( "fgets" ); } if ( goodline( buffer )) { fputs( buffer, out ); } } fclose( in ); fclose( out ); if ( rename( "output.txt", "input.txt" ) != 0 ) { perror( "rename" ); } حيث سيقوم السكريبت بما يلي: ستقوم بادخال نص السطر المبحوث عنه. يفتح السكريبت الملف النصي، ويقوم بالبحث عن السطر المبحوث عنه سطراً سطراً. هناك احتمالين عند تصفح كل سطر: عدم توافق السطر الحالي مع السطر المبحوث عنه: في هذه الحالة سيتم نسخ السطر الحالي في ملف آخر output.txt في حال توافق السطر الحالي مع السطر المبحوث عنه سيتم تجاوز هذه المرحلة دون نسخ السطر في الملف الجديد. يغلف الملفين معا input.txt وَ الملف المحصل عليه output.txt تغيير اسم output;txt إلى input.txt وبالتي نحصل على ملف خالي من السطر المبحوث عنه والمُراد حذفه.
  18. رغم ان محترفي البرمجة لا ينصحون بتخزين ملفات الفيديو داخل قاعدةالبيانات، لما لها من تأثير سلبي على سرعة الخادم، حيث سيصبح من الصعب جلب البيانات بالسرعة المعهودة، والطريقة الأصح هي تخزين رابط الفيديو داخل قاعدة البيانات مع وصفه، ونقل الملف إلى مجلد مخصص للفيديوهات، لكن على أيٍ سأرشدك إلى موقع يعرض طريقة تخزين الفيديو على شكلbinary data. store video in database using C# and SQL أيضا لتستفيد من بعض الآراء حول الموضوع: What type of database should I store video files for a website?
  19. تشترك حلقتي التكرار For وَWhile في تنفيذهما لحلقة واحدة أو أكثر- يعني أن كلتا الحلقتين ستنفذ أمراً على الأقل-، و من حيث الاختلافات نجد: طريقة الكتابة: While: while(condtion) { //condition تنفيذ الأوامر البرمجية داخل الحلقة عند تحقق الشرط } For: for(intialization; condition; Increment or decrement){ // intialization قيمة البدء //condition تنفيذ الأوامر البرمجية داخل الحلقة عند تحقق الشرط //decrement أو تنازلياIncrement الانتقال تصاعديا } مثال: for(i =0,i<20;i++){ } في While يتم التأكد أول من صحة الشرط ليتم الدخول إلى الحلقة وتنفيذ ما بها من أوامر برمجية. في For قيمة البدء تنفذ ليتم فيما بعد توالي قيم Index i، أي أنه لن يتم تنفيذ قيمة i مرتين. الاستعمال: While: تستعمل عند جهل -عدم تمكننا من معرفة- عدد المرات التي ستتكرر خلالها الحلقة. For: تستعمل عند العلم المسبق بعدد مرات تكرار الحلقة. الفيديو التالي يعرض الطريقة بشكل طريف:
  20. تجدر الاشارة إلى أن كود منع الدخول على الملفات الموجودة في تفرّع ما يشبه في المثال المقدّم هنا "text.\" : <Files ~ "\.txt$"> Order allow,deny Deny from all </Files> هي Regular expression الخاصة بـ Appache التي مكن الممكن أن تطلّع عليها من خلال الرابط. كما يمكنك تحويل المتصفح إلى صفحة 404 بالشكل التالي: RedirectMatch 404 \.txt$
  21. يمكنك الاعتماد على Google Cloud Messaging لإرسال رسائل عبر تطبيق أندرويد، وذلك من خلال خدمة خادم داخلي موجود على جميع أجهزة أندرويد. سأقدم لك درس بناء نظام دردشة بالاعتماد على : GMC PHP وَ MySQL هذا الدرس تحت عنوان "Android Building Realtime Chat App using GCM, PHP & MySQL" وهو مقسم إلى 3 أجزاء هي كالآتي: الجزء الأول. الجزء الثاني. الجزء الثالث. مثال الثاني هو درس مقسم إلى دروس مصورة، ستعطيك فكرة على المنهجية المتبعة في بناء تطبيقات الدردشة: Simple Android Chat App Tutorial with Parse Integration
  22. هناك العديد من المواقع والبرامج التي تساعد على تنسيق المهام بين مجموعة العمل: Trello. Asana. basecamp. والتي يستعملها أغلب مديري المشاريع، بالاضافة إلى أن هناك من يفضل استعمال برامج التواصل لفعل ذلك بشكل مباشر، حيث نجدSkype أو أحد مواقع التواصل الاجتماعية. مصادر مفيدة: تطبيقًا وخدمة أساسية لإدارة شركتك الناشئة دليل مختصر لتحسين المحادثات الثنائية مع الموظفين في شركتك
  23. من الجيد ذلك-كتابة مقالة بعدد كلمات أكبر من المتفق عليه- إذا كان المحتوى يلزمه عدد كلمات أكبر من العدد المتفق عليه، فأرى أنه لا بأس في فعل ذلك، حيث أنك ستعطي للعميل إنطباع جيداً، وأنك تتقن عملك، بخلاف إذا كانت الزيادة مجرد حشو فقط، هنا أرى أنه يجب تجنب ذلك، حتى لا يشعر القارئ بملل وهو يطالع مقالتك. كما أنصحك في حال زِدت عن عدد الأسطر المتفق عليه، أن تطلع العميل على سبب فعلك لذلك، لأنه سيُعجَب بوجهة نظرك -أن الموضوع لا تكفيه 800كلمة مثلاً-، مع التعليل طبعا. أفكار خاطئة حول الكتابة الحرة وكيفية تصحيحها خطوات لضمان عدم انقطاع مشاريع الكتابة التي تعمل عليها ككاتب مُستقل
  24. عادة ما يلجأ المصمم في حالة التصاميم الكبيرة إلى تخفيضResolution، ذلك أن ارتفاع هذه الأخيرة وكبر حجم الملف يخلق للحاسوب صعوبات كبيرة في التعامل، مما يكسب بطء كبير في النعامل مع البرنامج، شخصيا ألجأُ إلى resolution بقيمة150 عند تصميم ملف كبير -1 متر فما فوق- . لكن قيمة الدقةResolustion في المقاسات الاعتيادية عادة ما تكون: 72 بالنسبة للويب. 300 بالنسبة للمطبوعات. يمكنك الاستعانة بالمصادر التالية: دروس التصميم Large-Format Printing
  25. يمكنك استعمال glassPane، كما هو مبين في المثال التالي: import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test extends JFrame implements MouseListener { private JPanel panel = new JPanel(); public Test() { ConnectTheDots dots = new ConnectTheDots(); setGlassPane(dots); dots.setVisible(true); panel.setLayout(new GridLayout(2, 2)); panel.add(createLabel(Color.RED)); panel.add(createLabel(Color.BLUE)); panel.add(createLabel(Color.GREEN)); panel.add(createLabel(Color.ORANGE)); panel.addMouseListener(this); this.add(panel); } private Component pressComponent; private Component releaseComponent; public void mousePressed(MouseEvent e) { pressComponent = panel.getComponentAt(new Point(e.getX(), e.getY())); } public void mouseReleased(MouseEvent e) { releaseComponent = panel.getComponentAt(new Point(e.getX(), e.getY())); joinTheDots(); } @Override public void mouseClicked(MouseEvent arg0) { } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } protected void joinTheDots() { Rectangle bounds = pressComponent.getBounds(); Point startPoint = centerOf(bounds); bounds = releaseComponent.getBounds(); Point endPoint = centerOf(bounds); ((ConnectTheDots) getGlassPane()).drawLine(startPoint, endPoint); } protected Point centerOf(Rectangle bounds) { return new Point( bounds.x + (bounds.width / 2), bounds.y + (bounds.height / 2)); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } Test frame = new Test(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected JLabel createLabel(Color background) { JLabel label = new JLabel() { @Override public Dimension getPreferredSize() { return new Dimension(100, 100); } }; label.setOpaque(true); label.setBackground(background); return label; } public class ConnectTheDots extends JPanel { private Point startPoint; private Point endPoint; public ConnectTheDots() { setOpaque(false); } public void drawLine(Point startPoint, Point endPoint) { this.startPoint = startPoint; this.endPoint = endPoint; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (startPoint != null && endPoint != null) { Graphics2D g2d = (Graphics2D) g.create(); Line2D line = new Line2D.Double(startPoint, endPoint); g2d.setColor(Color.BLACK); g2d.draw(line); g2d.dispose(); } } } } نحصل على النتيجة التالية: مثال آخر: import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.border.*; import java.util.*; class Pair { JLabel label1 ; JLabel label2 ; private Pair(){} public Pair(JLabel label1, JLabel label2) { this.label1 = label1; this.label2 = label2; } @Override public String toString() { return "{"+label1.getLocation()+","+label2.getLocation()+"}"; } public int howToDraw() { Point point1 = label1.getLocation(); Point point2 = label2.getLocation(); if (point1.x > point2.x) { return 1; } else if (point1.x < point2.x) { return 2; } else if (point1.y > point2.y) { return 3; } else if (point1.y < point2.y) { return 4; } else return 5; } public JLabel getLabel1() { return label1; } public JLabel getLabel2() { return label2; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof Pair) { Pair temp = (Pair)obj; if ((temp.toString()).equalsIgnoreCase(this.toString())) { return true; } } return false; } } public class SimulatorGUI extends JFrame { private JPanel contentPane; JPanel southPanel; JPanel centerPanel; JPanel eastPanel; JPanel westPanel; int clickCount = 0; ArrayList<Pair> listOfPairs;//Added for storing pairs of nodes Map <String,Point> map;//Stores Jlabel added on center panel and its location. ByteArrayOutputStream baos; ByteArrayInputStream bais; int counter = 0;//To know the number of routers pasted on center panel public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { SimulatorGUI frame = new SimulatorGUI(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public SimulatorGUI() { contentPane = new JPanel(); listOfPairs = new ArrayList<Pair>(); map = new LinkedHashMap<String,Point>(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); setTitle("Network Simulator Prototype"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 800, 600); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu mnFile = new JMenu("File"); menuBar.add(mnFile); JMenuItem mntmNew = new JMenuItem("New"); mnFile.add(mntmNew); JMenuItem mntmOpen = new JMenuItem("Open"); mnFile.add(mntmOpen); JMenuItem mntmSave = new JMenuItem("Save"); mnFile.add(mntmSave); JMenuItem mntmSaveAs = new JMenuItem("Save As"); mnFile.add(mntmSaveAs); JSeparator separator = new JSeparator(); mnFile.add(separator); JMenuItem mntmExit = new JMenuItem("Exit"); mnFile.add(mntmExit); JMenu mnEdit = new JMenu("Edit"); menuBar.add(mnEdit); JMenuItem mntmCopy = new JMenuItem("Copy"); mnEdit.add(mntmCopy); JMenuItem mntmPaste = new JMenuItem("Paste"); mnEdit.add(mntmPaste); JSeparator separator_1 = new JSeparator(); mnEdit.add(separator_1); JMenuItem mntmNewMenuItem = new JMenuItem("Undo"); mnEdit.add(mntmNewMenuItem); JMenuItem mntmRedo = new JMenuItem("Redo"); mnEdit.add(mntmRedo); JMenu mnOptions = new JMenu("Options"); menuBar.add(mnOptions); JMenu mnView = new JMenu("View"); menuBar.add(mnView); JMenu mnTools = new JMenu("Tools"); menuBar.add(mnTools); JMenu mnExtentions = new JMenu("Extentions"); menuBar.add(mnExtentions); JMenu mnHelp = new JMenu("Help"); menuBar.add(mnHelp); southPanel = new JPanel(); JLabel lblNode = new JLabel("Router Label"); lblNode.setBorder(BorderFactory.createLineBorder(Color.black,1)); southPanel.add(lblNode); JLabel lblWire = new JLabel("Wire.png");//You don't need this now. southPanel.add(lblWire); class MyMouseAdapter extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { clickCount = 1; try { copy((JLabel) e.getSource()); } catch (Exception ex) { } } } lblNode.addMouseListener(new MyMouseAdapter()); southPanel.setBorder(BorderFactory.createTitledBorder("Nodes")); contentPane.add(southPanel, BorderLayout.SOUTH); //centerPanel = new JPanel(); centerPanel = new MyJPanel(); centerPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createRaisedBevelBorder(), "Work Space", TitledBorder.CENTER, TitledBorder.TOP)); centerPanel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (clickCount == 1) { try { pasteLabel(e.getX(), e.getY()); } catch (Exception ex) { } } } }); contentPane.add(centerPanel, BorderLayout.CENTER); centerPanel.setLayout(null); eastPanel = new JPanel(); contentPane.add(eastPanel, BorderLayout.EAST); eastPanel.setBorder(BorderFactory.createTitledBorder("Configuration")); JButton btnSetting = new JButton("Settings"); btnSetting.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { GUI gui = new GUI(); } }); eastPanel.add(btnSetting); westPanel = new JPanel(); contentPane.add(westPanel, BorderLayout.WEST); westPanel.setBorder(BorderFactory.createTitledBorder("Reset")); JButton btnClear = new JButton("Clear"); btnClear.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { centerPanel.removeAll(); centerPanel.validate(); centerPanel.repaint(); listOfPairs.clear();map.clear(); counter = 0; } }); westPanel.add(btnClear); JButton button = new JButton("DrawString"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { String[] nodes = showGUIForNodeSelection(); if (nodes == null || nodes[0]==null || nodes.length == 0 ) {} else if (!nodes[0].equals(nodes[1])) { String split[] = nodes[0].split(","); Point p1 = new Point(Integer.valueOf(split[0]),Integer.valueOf(split[1])); split = nodes[1].split(","); Point p2 = new Point(Integer.valueOf(split[0]),Integer.valueOf(split[1])); JLabel label1 = (JLabel)centerPanel.getComponentAt(p1); JLabel label2 = (JLabel)centerPanel.getComponentAt(p2); Pair pair = new Pair(label1,label2); listOfPairs.add(pair); centerPanel.repaint(); } else { JOptionPane.showMessageDialog(SimulatorGUI.this,"Nodes can't be same","Error",JOptionPane.ERROR_MESSAGE); } } }); westPanel.add(button); } private String[] showGUIForNodeSelection() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(map.size(),2)); ButtonGroup group1 = new ButtonGroup(); ButtonGroup group2 = new ButtonGroup(); final String nodes[] = new String[2]; Set<String> keySet = map.keySet(); for (String name : keySet) { JRadioButton rButton = new JRadioButton(name); rButton.setActionCommand(map.get(name).x+","+map.get(name).y); rButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { nodes[0] = ((JRadioButton)evt.getSource()).getActionCommand(); } }); group1.add(rButton); panel.add(rButton); JRadioButton rButton1 = new JRadioButton(name); rButton1.setActionCommand(map.get(name).x+","+map.get(name).y); rButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { nodes[1] = ((JRadioButton)evt.getSource()).getActionCommand(); } }); group2.add(rButton1); panel.add(rButton1); } JOptionPane.showMessageDialog(SimulatorGUI.this,panel,"Choose the nodes pair",JOptionPane.INFORMATION_MESSAGE); return nodes; } private class MyJPanel extends JPanel//Creater your own JPanel and override paintComponentMethod. { @Override public void paintComponent(Graphics g) { super.paintComponent(g); for (Pair pair : listOfPairs ) { JLabel label1 = pair.getLabel1(); JLabel label2 = pair.getLabel2(); Point point1 = label1.getLocation(); Point point2 = label2.getLocation(); int i = pair.howToDraw(); if ( i == 1) { g.drawLine(point1.x , point1.y + label1.getHeight() / 2 , point2.x + label2.getWidth() , point2.y + label2.getHeight() / 2); } else if (i == 2) { g.drawLine(point2.x , point2.y + label2.getHeight() / 2 , point1.x + label1.getWidth() , point1.y + label1.getHeight() / 2); } else if (i == 3) { g.drawLine(point1.x + label1.getWidth() / 2 , point1.y , point2.x + label2.getWidth() / 2, point2.y + label2.getHeight()); } else if (i == 4) { g.drawLine(point2.x + label2.getWidth() / 2 , point2.y , point1.x + label1.getWidth() / 2, point1.y + label1.getHeight()); } } } } public void copy(JLabel label) throws Exception { baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(label); oos.close(); } public void pasteLabel(int x, int y) throws Exception { if (clickCount == 1) { bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); JLabel obj = (JLabel) ois.readObject(); MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); obj.addMouseListener(myMouseAdapter); obj.addMouseMotionListener(myMouseAdapter); centerPanel.add(obj); obj.setText("Router"+counter); //obj.setBounds(x, y, obj.getWidth(), obj.getHeight()); obj.setLocation(x,y); clickCount = 0; ois.close(); map.put("Router"+counter , obj.getLocation()); counter++; } } class MyMouseAdapter extends MouseAdapter { private Point initialLoc; private Point initialLocOnScreen; @Override public void mousePressed(MouseEvent e) { Component comp = (Component) e.getSource(); initialLoc = comp.getLocation(); initialLocOnScreen = e.getLocationOnScreen(); } @Override public void mouseReleased(MouseEvent e) { Component comp = (Component) e.getSource(); Point locOnScreen = e.getLocationOnScreen(); int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x; int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y; comp.setLocation(x, y); map.put(((JLabel)comp).getText(),new Point(x,y)); centerPanel.repaint(); } @Override public void mouseDragged(MouseEvent e) { Component comp = (Component) e.getSource(); Point locOnScreen = e.getLocationOnScreen(); int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x; int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y; comp.setLocation(x, y); map.put(((JLabel)comp).getText(),new Point(x,y)); centerPanel.repaint(); } } } class GUI extends JFrame { private JPanel contentPane; JPanel centerPanel; JPanel southPanel; public GUI() { setVisible(true); setResizable(false); setTitle("Settings"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 280, 167); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); centerPanel = new JPanel(new BorderLayout(3, 3)); contentPane.add(centerPanel, BorderLayout.CENTER); JComboBox comboBoxConnection = new JComboBox(); comboBoxConnection.setModel(new DefaultComboBoxModel(new String[] { "Wired", "Wireless" })); JComboBox comboBoxTransmission = new JComboBox(); comboBoxTransmission.setModel(new DefaultComboBoxModel(new String[] { "UDP", "TCP" })); JComboBox comboBoxOrdering = new JComboBox(); comboBoxOrdering.setModel(new DefaultComboBoxModel(new String[] { "FIFO" })); JTextField selectTrafficAns = new JTextField(); JPanel labels = new JPanel(new GridLayout(0, 1)); JPanel controls = new JPanel(new GridLayout(0, 1)); centerPanel.add(labels, BorderLayout.WEST); centerPanel.add(controls, BorderLayout.CENTER); labels.add(new JLabel("Connection Type:")); controls.add(comboBoxConnection); labels.add(new JLabel("Transmission Type:")); controls.add(comboBoxTransmission); labels.add(new JLabel("Ordering:")); controls.add(comboBoxOrdering); labels.add(new JLabel("Amount of Traffic:")); controls.add(selectTrafficAns); southPanel = new JPanel(); contentPane.add(southPanel, BorderLayout.SOUTH); JButton btnOk = new JButton("Ok"); btnOk.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { dispose(); } }); southPanel.add(btnOk); JButton btnCancel = new JButton("Cancel"); btnCancel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { dispose(); } }); southPanel.add(btnCancel); } } لنحصل على الشكل: المصدر: Connecting 2 or more JLabels with a line
×
×
  • أضف...