المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : نقل الكتابة من (Edit1) الى(ListBox1) (للمبتدئين)


K.Hossam16
07-03-2010, 06:06 PM
اقدم لكم مضوعي الاول وهو نقل الكتابة الموجودة على (Edit1) الى(ListBox1) ونبدا:
اولا تضع العناصر(Button1\Edit1\ListBox1) وثانيا تكتب التعليمةالتالية في حدث الضغط على الازر (Button1)
التعليمة:
ListBox1.Items.Add(Edit1.Text);

kachwahed
07-03-2010, 06:34 PM
الأخ K.Hossam16 مرحبا بك في المنتدى
أخي K.Hossam16 أحسن ما يبدؤ به اسم الله عز وجل :)
فالسلام عليكم ورحمة الله
يا اخ K.Hossam16 لا اقصد الاهانة وكلنا مبتدئين في عالم البرمجة لكن منا رجاء ان تكون المواضيع المطروحة اكثر جدية
ممم... طيب.
لنتعاون ونجعل الموضوع أكثر جدية...
أخي K.Hossam16 ما معنى الكود الآتي؟
ListBox1.Items.AddObject(Edit1.Text, Edit1);
وما الفرق بينه وبين الذي كتبته؟
وما الفائدة منه؟
سبق هذا في المنتدى باستخدام مكون آخر، استخدم البحث.
تحياتي، بالتوفيق :)

قديم الشوق
07-03-2010, 08:35 PM
اظن مافيه فرق على قولهم
كل الطرق تودي الى دلفي العرب :)

kachwahed
07-03-2010, 09:33 PM
كل الطرق تودي الى دلفي العرب
لكن الاختلاف يقتضي المغايرة!
فأكيد هناك فرق.
كنت اود ان اقوم بالاجابة ولكن الاخ kachwahed قد سأل الاخ k.hossam16
والسابقون السابقون... تفضل أخي ramijz :)

ramijz
07-03-2010, 11:30 PM
بسم الله الرحمن الرحيم

تكرم عيونك اخي kachwahed

طبعا لست ضليع في الشرح لكن سوف احاول جاهداً ان اوصل المعلومة بشكل سهل وبسيط

اولاً :
معنى الكود :
ListBox1.Items.AddObject(Edit1.Text, Edit1);

هذا يذكرني بالمؤشرات Pointers ايام الباسكال التي لم نعد نستخدمها كثيرا في حياتنا البرمجية الا ماندر

للوهلة الاولى نظن بأن التعليمة السابقة تعمل عمل المنهج Add يعني اضافة النص الى ListBox
ولكن مع قليل من التروي نرى بأننا قمنا باضافة نص والذي يمثل قيمة Edit1.Text الى listbox ليشير الى الكائن Edit1 .

الى الان الامور ليست واضحة تماما للقارئ لا بأس سوف اكمل الشرح لكن تمهلوا قليلاً :

1 - المنهج Add يقوم باضافة نص من النوع string الى listbox وهذا امر معروف وبسيط

2 - المنهج AddObject يقوم بعمل Add مع اضافة بسيطة ولكن فعلها كبير وهي وضع مؤشر مع القيمة ليشير الى الموقع الذي يشير اليه العنصر Edit1 .

طيب هذا كلام جميل طالما اصبحت القيمة الموجودة في listbox تشير الى العنصر Edit1 كيف سوف اتعامل معها من خلال listbox ؟

بسيطة من خلال Type cast اي قلب الانواع

مثال : على فرض ان Edit1.text كان يوحي القيمة "Hallo" ونفذنا التعليمة
ListBox1.Items.AddObject(Edit1.Text, Edit1);

الان سوف نتعامل مع العنصر Edit1 من ListBox1 لتغيير لون العنصر Edit1 الى الاحمر
لاحظوا سحر الدلفي
TEdit(ListBox1.Items.Objects[ListBox1.Items.IndexOf('Hallo')]).Color:=clRed;

ماهذا مافعلت هذا يسمى قلب الانواع الذي حصل انني قمت بجلب العنوان الذاكري الذي تم تخزينه في القيمة Hallo والذي يشير الى العنصر Edit1 ثم قمت بتحويله من Tobject الى TEdit حتى استطيع الوصول الى الخاصية Color وقمت بعدها بتغيير اللون.

ياالله الفرق من الارض للسما

طيب لقد اطلت عليكم الشرح لكن هذه الامانة العلمية

**** من الله ان اكون قد افدت بشرحي هذا

kachwahed
07-03-2010, 11:52 PM
عظيم...
وما الفرق بينه وبين الذي كتبته؟
الآن نجيب على السؤال الثاني: من خلال شرح أخي ramijz يتضح أن المنهج AddObject فيه زيادة تخزين مؤشر على غرض TObject يمكن استخدامه لاحقا، وهذا الاستخدام هو الفائدة المرجوة من هذه الطريقة، وبهذا نكون قد أجبنا أيضا على السؤال الثالث.
مثال آخر من هنا. (http://www.delphi4arab.com/forum/showpost.php?p=11801&postcount=5)
الآن من يعطينا مثال لاستعمال آخر (بالتأشير على أشياء غير المكونات)؟

AL-MOB4RM3G
08-03-2010, 06:56 PM
بسم الله,

اولا, شكرا للأخ K.Hossam16 على الموضوع, وبدآية موفّقة ان شاء الله,

ثانيا, بارك الله لك اخي كاش واحد و اخي ramijz, الرد كان بالفعل مفيد,

(بالتأشير على أشياء غير المكونات)؟

غير المكونات؟؟؟؟ مثل ماذا, اعطي فتّوشة دون ان تقول الجوآب, :laugh:

بالتوفيق للجميع,

mohfa
08-03-2010, 08:04 PM
طريقة اخرى :
ListBox1.AddItem(Edit1.Text, Edit1);

ramijz
08-03-2010, 09:51 PM
السلام عليكم

اخي الحبيب mohfa
التعليمة
ListBox1.AddItem(Edit1.Text, Edit1);
جيدة ولكن ليست متوافقة مع كل اصدارات الدلفي فهي موجودة منذ الاصدار السادس من دلفي على مااذكر لذلك اعتماد التعليمة
ListBox1.Items.AddObject(Edit1.Text, Edit1);
افضل واحسن

والله اعلم

kachwahed
08-03-2010, 10:16 PM
أهلا بعودتك أخي AL-MOB4RM3G :clap2:
فتّوشة
فتّوشة: Undeclared identifier :blink:
أيا كانت...
المقصود بشيء آخر غير مكون مثلا السجلات Records
مثال:
PMyRec = ^TMyRec;
TMyRec = record
EdTitre: String;
MemTexte: String;
end;
var
Form1: TForm1;
EcriRec: PMyRec;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
New(EcriRec);
EcriRec.EdTitre := Edit1.Text;
EcriRec.MemTexte := Memo1.Text;
ListBox1.AddItem(Edit1.Text, pointer(EcriRec));
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var LirRec: TMyRec;
begin
LirRec := pMyRec(ListBox1.Items.Objects[ListBox1.itemindex])^;
Edit1.Text := LirRec.EdTitre;
Memo1.Text := LirRec.MemTexte;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if EcriRec <> nil then
Dispose(EcriRec);
end;
شكرا لكم جميعا.

mohfa
08-03-2010, 11:49 PM
مالفرق بين هذا :
New(EcriRec);
EcriRec^.EdTitre := Edit1.Text;
EcriRec^.MemTexte := Memo1.Text;
ListBox1.AddItem(Edit1.Text, {Pointer}TObject(EcriRec));وهذا :
New(EcriRec);
EcriRec.EdTitre := Edit1.Text;
EcriRec.MemTexte := Memo1.Text;
ListBox1.AddItem(Edit1.Text, pointer(EcriRec));وهذا :

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text := pMyRec(ListBox1.Items.Objects
[ListBox1.ItemIndex])^.EdTitre;
Memo1.Text := pMyRec(ListBox1.Items.Objects
[ListBox1.ItemIndex])^.MemTexte;
end;وهذا :

procedure TForm1.ListBox1Click(Sender: TObject);
var LirRec: TMyRec;
begin
LirRec := pMyRec(ListBox1.Items.Objects
[ListBox1.itemindex])^;
Edit1.Text := LirRec.EdTitre;
Memo1.Text := LirRec.MemTexte;}
end;وهذا :
procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
begin
For I := 0 To ListBox1.Items.Count - 1 Do
Dispose(PMyRec(ListBox1.Items.Objects[i]));
end;وهذا :

procedure TForm1.FormDestroy(Sender: TObject);
begin
if EcriRec <> nil then
Dispose(EcriRec);
end;الحذر من عدم تحرير ال records