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

سؤال حول الريكورد

مغلق
بدأه fafe0 في 5 يوليو 2006 · 4 رد · 627 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أنا قرأت كتاب أساسي باسكال، وأجزاء من كتب أخرى التي تشرح Delphi syntax ، وأعرف أنواع البيانات في دلفي ....

من بين أنواع البيانات هي المسجلات، أنا أعرف المسجلات يعني مثل:

type
MyStruct = record
Name: string;
age: Byte;
work: string;
end;

إلى أخره...

لكن هذا الريكود الغريب لم أتمكن من فهمه:

type
  TISHMisc = packed record
	case Integer of
	  0: (PhysicalAddress: DWORD);
	  1: (VirtualSize: DWORD);
  end;

طبعاً أنا لا يهمني فائدة هذا الريكورد، أنا أعرف أن هو جزء من structres الخاصة بـ PE ، لكن أنا أريد أن أفهم الـ syntax تبعه

يعني إيش هي:

case integer of ؟؟؟؟؟؟

مش فاهم كيف يستعمل هذا السجل ؟؟

أرجو التوضيح، مع بعض الأمثلة البسيطة، وشكراًً

السلام عليكم..

تم تعديل هذه المشاركة بواسطة fafe0 في 5 يوليو 2006 في 13:59

#2

لا أعلم إن كنت قد قرأت Delphi Help جيداً ام لا ....

في "Variant parts in records" ستجد هذه النقطة التي تتكلم عنها .

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#3
  TITDMisc = packed record
	case integer of
	  0: (ForwarderString: DWORD); //PBYTE
	  1: (aFunction: DWORD); //PDWORD
	  2: (Ordinal: DWORD);
	  3: (AddressOfData: DWORD); //PIMAGE_IMPORT_BY_NAME
  end;

يتعامل مع محتوى المسجل حسب نوعه

d4baa0.gif
#4

ها نوع من الريكورد يستعمل في ديلفي كإستعمال Union في ++C.

تستعمل عندما تكون عندك معلومة تقبل أن تقرأ من عدة زوايا, أعطي مثال لكي تتضح الفكرة.

نفترض أننا نريد تمثيل مستطيل في مسجل record.

لكن كيف يمكن وصف المستطيل إذا أردنا أن نجعل له تمثيل في المسجل؟

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

لكن نستطيع أن نرمز للمستطيل بنقطتين تكفيان, نقطة العلوية اليسرى و نقطة السفلية اليمنى, والنقطة في ديلفي هي من صنف Tpoint.

يعني تمثيل المستطيل يمكن يكون بأربع باراميترات و هي الإحداثيات الأربعة من نوع Integer, و قد يكون بباراميتراين و هي النقطتين Tpoin.

   TMyRect =  record
	 case Integer of
	   0: (Left, Top, Bottom, Right: Integer);
	   1: (TopLeft, BottomRight: TPoint);
   end;

والنقطة معرفة ب:

  TPoint = record
	X: Integer; // Top
	Y: Integer; // Left
  end;

.

الهدف من هذا هو

واحد, تبسيط الوصول للمستطيل من أي وجهة يريدها المبرمج دون Type casting.

و ثانيا, أن هذه المعلومات لها نفس المعنى و يمكن أن تتطابق من حيث كمية وسعة البيانات في الذاكرة. فهو إقتصاد للذاكرة, فكل من التمثيل الأول و التمثيل الثاني يأخذ من الذاكرة 4 خانات 32bits و هي عرض integer.

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

والشاهد على هذا هو عناوان تسجيل ديلفي للهذا النوع من السجل في الذاكرة:

procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
begin
  //
  str:='';
  str:= str + 'Adress of  Rec.Left $'#9 +intToHex(integer(@Rec.Left),8)+ #10;
  str:= str + 'Adress of  Rec.Top $'#9 + IntToHex(integer(@Rec.Top),8)+ #10;
  str:= str + 'Adress of  Rec.Bottom $'#9 + IntToHex(integer(@Rec.Bottom),8)+ #10;
  str:= str + 'Adress of  Rec.Right $'#9 + IntToHex(integer(@Rec.Right),8)+ #10+ #10;

  str:= str + 'Adress of  Rec.TopLeft $'#9 + IntToHex(integer(@Rec.TopLeft),8)+ #10;
  str:= str + 'Adress of  Rec.BottomRight $'#9 + IntToHex(integer(@Rec.BottomRight),8)+ #10;
  ShowMessage(str);
end;

عند تنفيذ هذا الكود ستجد أن المتغيرات Recleft و Rec.Top و Rec.Bottom و Rec.Right سيسجلها ديلفي في موضع من الذاكرة بنفس الترتيب التي عرفت به في TMyrec.

و ان هناك تطابق في العناوين بالذاكرة للمتغيرات بهذا الشكل:

Adress of  Rec.Left		$004615D0
Adress of  Rec.Top		$004615D4
Adress of  Rec.Bottom	$004615D8
Adress of  Rec.Right	$004615DC

Adress of  Rec.TopLeft	$004615D0
Adress of  Rec.BottomRight	$004615D8

في الحقيقة ديلفي لا يعطي هذه المعلومات في help.

مثال آخر لتمثيل عدد من صنف Integer في المسجل بحيث نستطيع قراءة كل بايتاته الأربعة متفرقة, أو قراءة Word المكونتين له, أو قراءته جملة واحدة

  TDWord = record
	case Byte of
	  0: (  dw: dword);
	  1: (
			// dw:= Low_Word +   High_word shl 16
			Low_Word: Word;
			High_Word: Word;
		  );
	  2: (
			// dw:=  LowB_Low_Word+  HighB_Low_Word shl 8 + LowB_High_Word shl 16 + HighB_High_Word shl 24
			LowB_Low_Word: Byte;
			HighB_Low_Word: Byte;
			LowB_High_Word: Byte;
			HighB_High_Word: Byte;
		  );
  end;

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#5

أخي cipher شكراً لك على الإشارة للموضوع ... ( حقيقة أنا لم أبحث في دلفي هلب عندما سألت :) )

قرأت الموضوع، وفهمت منه الكثير، لكن بحاجة إلى قراءة مرة أخرى :)

أخ محمد، شكراً على مشاركتك، مع أني ما فهمتش إيش قصدك :)

الأخ ikossan :

حقيقةً الواحد ما يعرف كيف يتكلم عليك...

إنت لما تجيب، تجيب إجابة فيها روح الإبداع، أو لا تجيب نهائياً :)

إجابات (مع أني لم أقرأ كل مشاركتك بعد ) قيمة دائماً ومفيدة ( وغير متوقعة :) ) ، ولا أعرف كيف اشكرك عليها :)

إجاباتك دائماً تشجع الإنسان على الكسل، لأنه راح ينتظر منك الإجابة الكاملة، دون أن يتعب نفسه بالبحث :)

جزاك الله خيراً أنت والإخوة محمد و cipher

والسلام عليكم ورحمة الله وبركاته.

تم تعديل هذه المشاركة بواسطة fafe0 في 7 يوليو 2006 في 20:00

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

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