الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لنبدا دورة دلفي

مغلقرائج
بدأه madi في 5 يونيو 2001 · 40 رد · 26,369 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#26

أشكرك أخي على حبك للإفادة

#27

شرح ممتاز بارك الله فيك ولكن أنا نفسى فى مثال يتحدث المجموعات ( الفئات ) أى Sets

من حيث الاتحاد والتقاطع والفرق والاكمال

#28

تابع الجمل Strings

جمل دلفي و PChars في ويندوز

نقطة أخرى مهمة فيما يتعلق باستخدام الجمل الطويلة و هي: أن هذه الجمل منتهية بصفر null-terminated. هذا يعني أنها متوافقة بالكامل مع الجمل المنتهية بصفر في لغة س و المستخدمة في ويندوز. الجمل المنتهية بصفر هي عبارة عن تتابع لأحرف يلحقها حرف بايت قيمته صفر (أو لاشيء). يمكن التعبير عن هذا في دلفي باستخدام مصفوفة أحرف تبدأ بصفر، و هي نوع البيانات المتبع عادة لبناء الجمل في لغة س. هذا ما يشرح سبب أن مصفوفات الأحرف المنتهية بصفر شائعة الإستخدام في وظائف API في ويندوز (و المبنية على لغة س). فحيث أن جمل باسكال الطويلة متوافقة بالكامل مع الجمل المنتهية بصفر في لغة س، يمكنك ببساطة استخدام الجمل الطويلة و تلبيسها لنوع PChar عندما تحتاج إلى تمرير جملة وظيفة API في ويندوز.

مثال ذلك، لنسخ Captionعنوان الفورم Form و وضعها في جملة PChar ثم نسخها لعنوان زر Button1 ،

كالتالي

Button1.Caption:= Form1.Caption

الآن (باستخدام وظيفة API: وهي GetWindowText) يمكنك كتابة التوليف كالتالي:

[l]

procedure TForm1.Button1Click (Sender: TObject);

var

  S1: String;

begin

  SetLength (S1, 100);

  GetWindowText (Handle, PChar (S1), Length (S1));

  Button1.Caption := S1;

End;

[/l]

لاحظ استخدام Handle الخاص بالفورم لكي نسترجع Caption العنوان .

سطر التوليف التالي يقوم بتمرير سمة Caption الخاصة Label كمحدد لوظيفة API، ببساطة بتلبيس نوعها لنوع PChar:

SetWindowText (Handle, PChar (Label1.Caption));

عندما تحتاج لتلبيس جملة عريضة WideString الى نوع يتوافق مع ويندوز، عليك استخدام PWideChar بدلا من PChar لغرض التحويل. الجمل العريضة غالبا ما تستخدم في برامج تستخدم تقنيات OLE و COM.

هناك بعض المشاكل التي يمكن ان تبرز عندما تقوم بتحويل جملة طويلة إلى نوعPChar. بصورة أساسية، المشكلة هي أنه بعد هذا التحويل، ستكون مسؤولا عن الجملة و عن محتواها، و لن تساعدك دلفي بشيء. لاحظ التغيير المحدود التالي لجزء توليف البرنامج الأول

أعلاه، Button1Click:

[l]

procedure TForm1.Button2Click(Sender: TObject);

var

  S1: String;

begin

  SetLength (S1, 100);

  GetWindowText (Handle, PChar (S1), Length (S1));

  S1 := S1 + ' is the title'; // this won't work

  Button1.Caption := S1;

end;

[/l]

هذا البرنامج سيتم تحويله، لكنك عند تشغيله، فستكون أمام مفاجأة: سمة Caption للزر سيكون لها النص الأصلي لعنوان النافذة، بدون نص ثابت الجملة الذي اضفته له. المشكلة هي أن ويندوز عندما قامت بكتابة الجملة من خلال استدعاء GetWindowText، لم تقم بتوصيف طول جملة باسكال الطويلة بطريقة سليمة. لا يزال بمقدور دلفي استخدام هذه الجملة كمخرجات و يمكنها معرفة متى تنتهي هذه الجملة من خلال البحث عن الحرف الصفري المُنهي للجملة، لكنك اذا اتبعتها بأحرف أخري بعد الحرف الصفري، فسوف يتم تخطي هذه الأحرف و اغفالها.

كبف يمكننا تجاوز هذه المشكلة؟ الحل هو في اخبار النظام بأن يقوم باعادة تحويل الجملة المرتجعة من استدعاء GetWindowText الى جملة باسكال. عموما، إذا كتبت التوليف التالي:

[l]

S1 := String (S1);

[/l]

فإن النظام سيتجاهله، لأن تحويل نوع بيانات إلى نفسه عملية غير مجدية. للحصول على جملة باسكال طويلة سليمة، تحتاج إلى إعادة تلبيس الجملة إلى نوع PChar ثم دع دلفي تقوم بالتحويل المناسب ثانية إلى جملة.

[l]

S1 := String (PChar (S1));

[/l]

حقيقة، يمكن تخطي عملية تحويل الجملة، لأن التحويلات من PChar إلى جملة تتم آليا في دلفي. هنا التوليف النهائي:

[l]

procedure TForm1.Button3Click(Sender: TObject);

var

  S1: String;

begin

  SetLength (S1, 100);

  GetWindowText (Handle, PChar (S1), Length (S1));

  S1 := String (PChar (S1));

  S1 := S1 + ' is the title';

  Button3.Caption := S1;

end;

[/l]

بديل أخر و هو إعادة توصيف طول جملة دلفي، باستخدام طول جملة PChar، بكتابة:

[l]

SetLength (S1, StrLen (PChar (S1)));

[/l]

عموما، إذا كنت تريد فقط الوصول إلى عنوان الفورم Form ، يمكنك ببساطة استعمال سمة Caption الخاصة بالفورم Form نفسه. فلا توجد حاجة لكتابة كل هذا التوليف المربك، و الذي كان فقط لأغراض بيان مشاكل تحويل الجملة. هناك حالات عملية تحتاج فيها للإستعانة بوظائف API، و عندها سيكون عليك الأخذ في الإعتبار مثل هذه الحالة المعقدة.

وشكرا

مــــMADIــــدي

#30

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

لدلك أقوم بفتح صفحة تم أكتب الرد في برنامج الورد و بعد نصف ساعة الصقه في الصفحة إن فتحت , و المصيبة بعد أن اكتب و انسق و اضغط اعتماد الرد تكون النتيجة (لا يوجد thread محدد .إذا كنت تتابع عنوان وصلك بواسطة البريد ، فيرجى تنبيه الإدارة )

أما عن موضوع الفئات فسوف اكتب عنه لاحقا بإذن الله ,

تابع الجمل Strings

تشكيل الجمل

باستخدام علامة الموجب (+) و بعض وظائف التحويل (مثل IntToStr) يمكنك بالتأكيد بناء جمل مركبة من القيم الموجودة. عموما توجد عدة وجهات لتشكيل الأرقام، قيم العملة، و جمل أخرى إلى جملة النهائية. يمكنك استخدام وظيفة Format القوية أو واحدة من الوظائف المرافقة لها.

وظيفة Format تتطلب كمحدادات : النص الأساسي مع حواجز مكان placeholders (عادة ما تعلم برمز %) و مصفوفة من القيم، كل قيمة خاصة بحاجز مكان. مثلا، لتشكيل رقمين في جملة يمكنك كتابة:

Format ('First %d, Second %d', [n1, n2]);

حيث n1 و n2 قيمتا عدد صحيح. الحاجز الأول يستبدل بالقيمة الأولى، الثاني يوافق القيمة الثانية، و هكذا. إذا كان نوع المخرجات لحاجز (يشار إليه بحرف بعد رمز %) لا يوافق نوع المحدد ذو العلاقة، سيظهر خطأ وقت تشغيل. إن عدم وجود تفحص للنوع في وقت التجميع يشكل فعلا أكبر عيب في استخدام وظيفة Format.

وظيفة Format تستخدم محدد مصفوفة مفتوحة (محدد يمكنه أن يحوي أي عدد من القيم)، لاحظ الصيغة الشبيهة بالمصفوفة لقائمة القيم التي يتم تمريرها كمحدد ثان.

بجانب استخدام %d، يمكنك استخدام حواجز أخرى معرفة في هذه الوظيفة و التي سيتم سردها فيما يلي , توفر هذه الحواجز مخرجات افتراضية حسب نوع البيانات. عموما يمكنك استخدام معينات تشكيل أخرى لتغيير المخرجات الافتراضية. معين العرض، مثلا، يحدد عددا ثابتا من الأحرف في المخرجات، بينما معين الدقة يشير إلى عدد الخانات العشرية. مثلا،

Format ('%8d', [n1]);

حواجز جملة التشكيل

d - decimal | عشري، قيمة العدد الصحيح يحول إلى جملة من الخانات العشرية.

_____________________________________________

x - hexadecimal | سادس عشر، قيمة الرقم الصحيح تحول إلى جملة من الخانات الستعشرية.

_____________________________________________

p - pointer | مؤشر، قيمة المؤشر يحول إلى جملة معبر عنها بأعداد ستعشرية.

_____________________________________________

s - string | قيمة الجملة، الحرف، أو نوع PChar يتم نسخها في مخرجات الجملة.

_____________________________________________

e - exponential |مرفوع القوة، قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز مرفوع القوة.

_____________________________________________

f - floating point | نقطة عائمة، قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز النقطة العائمة.

_____________________________________________

g - general | عام، قيمة النقطة العائمة تحول إلى جملة عشرية بأقرب ما يمكن مستخدمة إما ترميز النقطة العائمة أو مرفوع القوة.

_____________________________________________

n - number | رقم، قيمة النقطة العائمة تحول إلى جملة نقطة عائمة لكنها أيضا تستخدم فواصل الآلاف.

_____________________________________________

m - money | نقود، قيمة النقطة العائمة تحوّل إلى جملة تمثل مقدار العملة. التحويل يعتمد على التوصيف الإقليمي لبيئة التشغيل- انظر ملف مساعدة دلفي تحت موضوع: Currency and date/time formatting variables

_____________________________________________

أفضل طريقة لرؤية أمثلة عن هذه التحويلات هي في أن تقوم باختبار تشكيل الجمل بنفسك.

وشكرا

مــــMADIــــدي

#31

المصفوفات الحيوية في دلفي

كانت لغة باسكال تملك دائما مصفوفات ثابتة الحجم. عندما تقوم بتعريف نوع بيانات مستخدما بنية مصفوفة، يجب عليك تحديد عدد عناصر المصفوفة. ،و توجد عدد من التقنيات يمكنك استخدامها لتنفيذ المصفوفات الحيوية، أهمها استخدام المؤشرات و تخصيص الذاكرة المطلوبة و تحريرها يدويا ,

أدخلت دلفي طريقة تنفيذ بسيطة جدا للمصفوفات الحيوية، انتظمت بعد نوع الجمل الطويلة الحيوية التي قد ناقشناها سابقا . مثلها مثل الجمل الطويلة، المصفوفات الحيوية يتم تخصيصها و تعدادا إشاراتها آنيا، لكنها تخلو من تقنية النسخ عند الكتابة copy-on-write. هذا لا يشكل مشكلة كبيرة، حيث يمكنك نزع تخصيص deallocate المصفوفة بجعل متغيرها خاليا nil.

يمكنك الآن ببساطة تعريف مصفوفة بدون الحاجة لتحديد عدد عناصرها ثم تقوم بتخصيصها بحجم معين باستخدام إجراء SetLength. يمكن استخدام نفس الإجراء لتغيير حجم المصفوفة دون أن تفقد محتوياتها. توجد أيضا إجرائيات أخري لها علاقة بالجمل، مثل وظيفة Copy ، و التي يمكنك استخدامها مع المصفوفات.

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

[l]

procedure TForm1.Button1Click(Sender: TObject);

var

  Array1: array of Integer;

begin

  Array1 [1] := 100; // error

end;

[/l]

البرنامج السابق خطاء , لأنه يجب أن تقوم بتخصيص الذاكرة للمصفوفة , بحجم معين باستخدام إجراء SetLength. ,

[l]

procedure TForm1.Button1Click(Sender: TObject);

var

  Array1: array of Integer;

begin

  SetLength (Array1, 100);

  Array1 [99] := 100; // OK

  end;

[/l]

حالما تحدد فقط عدد العناصر في المصفوفة، يبدأ فهرس المصفوفة دائما من صفر. المصفوفات عامة في باسكال معروفة بإمكانية أن يكون حدها الأدنى غير الصفر و أن تكون فهارسها ليست أعداد صحيحة، هاتان الخاصيتان لا تدعمهما المصفوفات الحيوية .

المصفوفة الحيوية، يمكنك استخدام وظائف Length و High و Low، كما في أي مصفوفة أخرى. بالنسبة للمصفوفات الحيوية وظيفة Low ترجع دائما قيمة 0، و High ترجع دائما الطول ناقص منه 1. هذا يعني أنه بالنسبة للمصفوفة الفارغة فإن High ترجع –1 , الأمر الذي عندما تتأمل فيه، تجده رقما غريبا، فهو أقل من ذلك المرتجع من Low .

مثال

مثال

بعد هذا التقديم القصير يمكننا أن نجري مثالا بسيطا , سنستخدم المثال أيضا لعرض بعض الأخطاء التي قد يقع فيها المبرمجون.

يعرّف البرنامج مصفوفتين خارجيتين global

[l]

var

  Array1, Array2: array of Integer;

[/l]

و يقوم بتمهيد الأول في الحدث OnCreate :

procedure TForm1.FormCreate(Sender: TObject);

begin

// allocate

SetLength (Array1, 100);

end;

[/l]

هذا يجعل كل القيم صفرا. توليف التمهيد هذا يجعل من الممكن البدء حالا بقراءة و كتابة قيم المصفوفة، دون أي خوف من أخطاء الذاكرة. (طبعا، بافتراض أنك لن تحاول الوصول إلى عناصر خارج الحدّ العلوي للمصفوفة.) و من أجل تمهيد أفضل، لدى البرنامج زرا يقوم بالكتابة داخل كل خلية في المصفوفة:

[l]

procedure TForm1.Button1Click(Sender: TObject);

var

  I: Integer;

begin

  for I := Low (Array1) to High (Array1) do

    Array1  := I;

end;

[/l]

لاحض طريقة الانتقال بين عناصر المصفوفة من بدايتها Low الى نهايتها High ,وتخصيص لقيم للعناصر Array:=I;

لتعديل حجم المصفوفة بدون أن تفقد محتوياتها.

[l]

procedure TForm1.Button2Click(Sender: TObject);

begin

  SetLength (Array1, 200);

end;

يمكنك اختبار العناصر و تتأكد من عدم ضياع البيانات منها 

procedure TForm1.Button3Click(Sender: TObject);

begin

// extract

  Caption := IntToStr (Array1 [99]);

end;

[/l]

يمكن نسخ مصفوفة داخل الأخرى بواسطة العامل :=، فأنه سوف تنشئا متغير جديد يشير إلى نفس المصفوفة في الذاكرة يسمى رديفا Alias. ,و إذا قمت بتعديل أحد المصفوفتين، ستتأثر الأخرى كذلك، بالنظر إلى أن كلتاهما تشيران إلى نفس منطقة الذاكرة:

[l]

begin

  // alias

  Array2 := Array1;

  // change one (both change)

  Array2 [99] := 1000;

  // show the other

  Caption := IntToStr (Array1 [99]);

End;

[/l]

بتغيير العنصر في المصفوفة الثانية فأنه يتغير نفس العنصر في المصفوفة الأولى ,

عملية اختبار تساوي المصفوفتين التالية . هذه العملية لا تختبر العناصر الفعلية للبنيتين و لكن تختبر مناطق الذاكرة التي تشير لها المصفوفتان، فتتفحّص إذا ما كانا المتغيران هما رديفان لنفس المصفوفة في الذاكرة

[l]

  if Array1 = Array2 then

[/l]

الخطوة التالية ليست فقط تنقل البيانات من مصفوفة للأخرى

[l]

Array1 := Copy (Array2, 0, 10);

[/l]

لكنها أيضا تستبدل بالمصفوفة الأولى المصفوفة الجديدة التي تم إنشاؤها بواسطة الوظيفة Copy. التأثير هو أن متغير Array1 الآن يشير إلى مصفوفة تحوي 11 عنصرا، و لم يعد يشير إلى 100 العنصر التي خصصناها له في البداية .

وشكرا

#32

بما انك على اتصال الان

اخي مادي في الحن بعثة لك تشكراتي على المجهودات التي تبدلها

وهذا ما يعجبني فيك لذلك اتكل على الله وعليك في مايلي

1- لقد بدا اتعلم asp لصنع موقع تجاري سوالي

هل تستطيع مساعدتي في كفية الوصول الى قواعد البيانات التي وضعتها في المقع اي

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

وهد ا ما اريد ه ب الاضافة الى التغير في القواعد ....الخ .

انتضر الرد

وشكرا .

#34

السلام عليكم

اتمني ان يكون اخي وصديقي مادي بخير

#35

:( :confused: يعني علشان بديت اتعلمها توقفت الدروس ؟؟

You can fly while you can touch the sky

#36

بسم الله الرحمن الرحيم

تحية طيبة وبعد

مشكورين احوتي على هذه الدروس ونتمنى المزيد

:cool: :cool:

#37

السلام عليكم

كم وددت تعلم هذه اللغة :)

شكراً جزيلاً

كتبه الله في ميزن حسناتك

post-252239-064955400%201356690312.gif
#38

اعتقد ما بقي كلام .. يالله يا مشرفين و يا خبراء همتكم معانا :D :D ;)

You can fly while you can touch the sky

#39

الدلفي ينازع ياشباب ........:'(:'(

#40

اتنى لكم كل خير وبركة

#41
اقتباس
اعتقد ما بقي كلام .. يالله يا مشرفين و يا خبراء همتكم معانا    

ابو الصلح امهلني شوي بس ومابصير إلا خاطرك

هذا الموضوع مغلق.

مواضيع مشابهة