Record pointers
#1
السلام عليكم ورحمة الله وبركاته

كيف يعمل مؤشر من نوع سجل ؟

كود :
type TMyRecord = Record name : String[20]; age : Integer; end; var myRecord : TMyRecord; myRecordPtr : ^TMyRecord;

وكيف تتم هده العملية :

PHP كود :
New(myRecordPtr); 

هل هو ينشئ سجل جديد ام يشير الى سجل جديد ومادا حدث لسجل القديم ؟

انا فاهم عن المؤشرات انها تحمل عنوان المتغيرات يعني لا نستطيع ان ننشئ متغير جديد بستخدام
المؤشرات

عندا إجراء هده العملية هل تتغير البيانات الموجودة في السجل الاصلي :

PHP كود :
myRecordPtr.name := 'Her indoors';
  
myRecordPtr.age  := 55; 
كن متواضعا ولا تكن متكبرا // الصبر + المثابرة = النجاح
الرد
#2
باستخدام نفس الأمثلة التي أوردتها، لنفرض أن لدي قائمة ببيانات لأشخاص،
وأردت أن أحتفظ بها في ذاكرة الجهاز، وأن تكون مربوطة بعناصر لدي في واجهة الاستخدام. البيانات كالتالي :
الاسم، العمر
ونجعل لها التركيبة Structure التالية كما أوردتها:
PHP كود :
type 
   TMyRecord 
= Record 
     name 
: String; 
     
age  : Integer; 
   
end; 
ثم نعرف متغير myRecord من نوع التركيبة ذاتها، ومتغير أخر يكون مؤشر Pointer
لنفس نوع التركيبة وهو ^TMyRecord:

PHP كود :
var 
   
myRecord    : TMyRecord; 
   
myRecordPtr : ^TMyRecord; 

الآن لدي شجرة TreeView و أردنا لكل بند في الشجرة أن يمثل شخصا، بكتابة اسم الشخص في فرع Node من فروع الشجرة.
الطريقة العادية أن أقدم التوليف التالي:

PHP كود :
TreeView1.Items.AddChild(ParentNode, ‘Ahmad Ali’); 

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

PHP كود :
New(myRecordPtr);  // حجز مكان جديد في الذاكرة
    
myRecordPtr^.Name := ‘Ahmad Ali’;  // تعبئة التركيبة 
    
myRecordPtr^.Age := 28;
    
NewNode :=  TreeView1.Items.AddChildObject(ParentNode,
                                    
myRecordPtr^.Name // ‘Ahmad Ali’, 
                                    
myRecordPtr); 

وأكرر هذا مع بيانات كل شخص.
إذا أردت معرفة البيانات المربوطة بأي فرع في الشجرة أقوم بالتالي:

PHP كود :
Var
  
AName: string;
  
Num: integer;

If 
Node.Data <> nil then
Begin
  AName 
:= TMyRecord(Node.Data)^.Name ; // صبّ البيانات في قالب التركيبة واستخراج جزئية الإسم
  
Num := TMyRecord(Node.Data)^.Num ;
End; 

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

كود :
for i := 0 to TreeView1.Items.Count -1 do if TreeView1.Items[i].Data <> nil then Dispose(TreeView1.Items[i].Data);


أتمنى أن يكون الشرح مفهوما. وجاهز لتوضيح أية نقطة إذا كان بمقدوري.

ملاحظة: لم أجرب الكود فعذرا إذا وجدت أية أخطاء.
الرد
#3
السلام عليكم ورحمة الله وبركاته

بارك الله فيك الله ينورك shagrouni
انا مبتدئ في لغة الدلفي
إقتباس :الآن لدي شجرة TreeView و أردنا لكل بند في الشجرة أن يمثل شخصا، بكتابة اسم الشخص في فرع Node من فروع الشجرة.
ممكن توضح كيف تحصلت على الشجرة و فروعها ؟
PHP كود :
TreeView1 
هل هدا كائن؟ماوضيفته ؟
إن كان عندك كتاب عن كيفية بناء هده الاشجار ممكن ترفقه لنستفيد منه

بارك الله فيك على المجهود الجبار :kick:
كن متواضعا ولا تكن متكبرا // الصبر + المثابرة = النجاح
الرد
#4
TreeView مكون تجده ضمن مجموعة Win32 في دلفي؟
الرد
#5
طيب اخ shagrouni كيف استخدم خاصية AddChildObject اذا اردتها ان ترتبط بقاعدة بينات بحيث يظهر فيها حقل معين لكي ترتبط بقاعدة البيانات بواسطة حقل آخر
وللتوضيح اكثر
[URL="http://www.delphi4arab.net/forum/showthread.php?p=25973#post25973"]
هنا[/URL]
وشكراً جزيلاً
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم