delphi4arab منتديات دلفي للعرب
استفسار حول القيم المكررة - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : استفسار حول القيم المكررة (/showthread.php?tid=11192)

الصفحات: 1 2 3


استفسار حول القيم المكررة - Ibn Battuta - 03-01-2021

السلام عليكم ورحمة الله وبركاته 
ماهو سطر الكود الذي من خلاله  احصي
كل الاسماء والقيم المكررة في المكون StringGrid
واعرضها بالمكون Memo ..بارك الله فيكم Smile



RE: استفسار حول القيم المكررة - Delphi4Us - 04-01-2021

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

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

انت اكيد تعلم ان الوصول لاي خلية بالمكون هي عن طريق :

كود :
StringGrid1.Cells[ACol, ARow];

حيث Acol هو العمود و الـ ARow السطر فحيث تتقاطع قيمة العمود مع السطر تحصل على قيمة الخلية

اذا تحتاج للمرور على كل القيم بواسطة الامر For 

وكل خلية تقراء قيمتها تخزنها بمصفوفة او حتى مكون TlistBox وكل خلية تقراء قيمتها تنظر هل هي موجودة بالمكون TlistBox ام لا 
اذا كانت موجودة يعني انها مكررة فتضعها بمصفوفة اخرى او مكون TlistBox أخر
فيكون لديك مكونان من TlistBox واحد تضع به القيم كلها والاخر القيم المكررة فقط
هذه الفكرة التي تحضرني الان
جرب البدء في البرمجة وما يعترضك من مشاكل اعرضها هنا


RE: استفسار حول القيم المكررة - Ibn Battuta - 04-01-2021

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


RE: استفسار حول القيم المكررة - Delphi4Us - 05-01-2021

لقد تأخرت في طرح ما لديك
اما انك وجدت الحل واما ان الامور اختلطت عليك

تلميح للمساعدة
بامكانك المرور على كل الخلايا وقراءتها بالشكل التالي:

كود :
var   Acol, ARow: Integer; begin     for Acol := 0 to Pred(StringGrid1.ColCount) do     for ARow := 1 to Pred(StringGrid1.RowCount) do     begin End;

ِArow يبداء من الصف الثاني باعتبار ان الصف الاول به العناوين اذا لم يكن كذلك اجعله = 0


RE: استفسار حول القيم المكررة - Ibn Battuta - 05-01-2021

اصبت اخي الكريم الامور اختلطت علي لم اجد الحل بعد ..
خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي
ومنكم استفيد اخواني الافاضل
شكرا مجددا على التلميحات والمساعدات من اجل التعلم Smile جزاك الله كل الخير


RE: استفسار حول القيم المكررة - Delphi4Us - 05-01-2021

إقتباس :خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي


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

ضع StringGrid على النموذج واداتين ListBox وزر واحد وفي الحدث FormLoad ضع الكود التالي لتعبئة StringGrid بالبيانات


كود :
StringGrid1.Cells[0, 1]  := 'Salem';     StringGrid1.Cells[0, 2]  := 'Omar';     StringGrid1.Cells[0, 3]  := 'Khaled';     StringGrid1.Cells[0, 4]  := 'Ali';     StringGrid1.Cells[1, 1]  := 'Mansor';     StringGrid1.Cells[1, 2]  := 'Mohamed';     StringGrid1.Cells[1, 3]  := 'Ahmad';     StringGrid1.Cells[1, 4]  := 'Naser';     StringGrid1.Cells[2, 1]  := 'Thareq';     StringGrid1.Cells[2, 2]  := 'Omar';     StringGrid1.Cells[2, 3]  := 'Waled';     StringGrid1.Cells[2, 4]  := 'Haetem';

مجموعة اسماء فيها اسم واحد مكرر

في حدث الزر ضع الكود التالي


كود :
procedure TForm1.Button1Click(Sender: TObject); var   Acol, Arow,ListCount: Integer; begin     for Acol := 0 to Pred(StringGrid1.ColCount) do     for Arow := 1 to Pred(StringGrid1.RowCount) do     begin        ListBox1.Items.Add(StringGrid1.Cells[Acol, Arow]);        for ListCount := 0 to  ListBox1.Items.Count -1 do        begin          if ListBox1.Items[ListCount]=StringGrid1.Cells[Acol, Arow+1] then           ListBox2.Items.Add(StringGrid1.Cells[Acol, Arow+1]);        end;    end; end;

سوف يتم وضع كل اسم مكرر في الاداة ListBox2 اما في الاداة ListBox1 سوف ترى كل الاسماء

[صورة: attachment.php?aid=4419]

كود :
for Acol := 0 to Pred(StringGrid1.ColCount) do     for Arow := 1 to Pred(StringGrid1.RowCount) do

هذا الكود طبعا للمرور على كل الخلايا 

كود :
ListBox1.Items.Add(StringGrid1.Cells[Acol, Arow]);

هنا وضعنا كل اسم نمر به في الاداة الاولى

كود :
       begin          if ListBox1.Items[ListCount]=StringGrid1.Cells[Acol, Arow+1] then           ListBox2.Items.Add(StringGrid1.Cells[Acol, Arow+1]);        end;    end;

هنا نقارن محتوى الاداة الاولى بكل اسم نمر به في ال StringGrid

لاحظ فقط انني في الـ StringGrid زدت واحد في Arow وهذا حتى اقارن الاسم التالي دائما فتسبق بخانة
ولولا ذلك لكانت محتويات ListBox1 دائما تساوي محتويات StringGrid


RE: استفسار حول القيم المكررة - Ibn Battuta - 05-01-2021

حسب ما تفضلت به يا محترم تاكدت بانني لن اتوصل اليه ...( مهما بحثت وحاولت واااع
أحييك اخي الكريم على رحبة صدرك، لكن لي سؤال لماذا يجب اضافة اثنان من المكون listbox
الا يمكن اضافة مكون واحد ومباشرة نذكر به الاسماء المكررة وكم عدد المرات التي تكررت ؟


RE: استفسار حول القيم المكررة - Delphi4Us - 06-01-2021

الاداة الاولى نحتاجها لمقارنة محتوياتها من الاسماء بالاسماء الموجوة في StringGrid
اولا يمكنك اخفائها وترك الثانية

وثانيا يمكنك حذفها واستبدالها بي TStrings كما بالكود هنا للزر

كود :
procedure TForm1.Button1Click(Sender: TObject); var   Acol, Arow,ListCount: Integer;   Tstr:TStrings; begin     Tstr := TStringList.Create();     try     for Acol := 0 to Pred(StringGrid1.ColCount) do     for Arow := 1 to Pred(StringGrid1.RowCount) do     begin       Tstr.Add(StringGrid1.Cells[Acol, Arow]);       for ListCount := 0 to  Tstr.Count -1  do       begin         if Tstr [ListCount]=StringGrid1.Cells[Acol, Arow+1] then           ListBox2.Items.Add(StringGrid1.Cells[Acol, Arow+1]);       end;   end;     finally         Tstr.Free;     end; end;


اولا تعريف متغير من نوع TStrings

كود :
Tstr:TStrings;

وبعدها انشاءه او الاشتقاق منه

كود :
  Tstr := TStringList.Create();

وبعد ان نكمل به عملنا نلغيه من الذاكرة او نقتله

كود :
Tstr.Free;

ولاجل ذلك نستخدم العبارة Try حيث بعد العبارة finally نقوم بالغاءه اي سيتم تنفيذ الكود وعند النهاية من التنفيذ ستم تنفيذ مابعد العبارة finally

كود :
try     finally             end;

كما يمكن مقارنة محتويات StringGrid بنفسها بدل استخدام ListBox او حتى TStrings 
لديك الطريقة كيف تمر على كل خلايا StringGrid فتقراء اول اسم تم تقول بدورة اخرى تقارنه بمحتوياتها وتنتقل الى الاسم الذي يليه وهكذا
يمكنك تجربة هذه الطريقة بعد ان صار معك كل ماتحتاج


RE: استفسار حول القيم المكررة - Ibn Battuta - 15-01-2021

شكرا جزيلا اخي المحترم على مساعدتك لي Smile
والتوضيح لعمل احصاء ما هو متكرر من اسماء وقيم 
لقد ارفقت برنامج الاخ لعربي بارادوكس سابقا 
الخاص بملف txt خاص بالاجور ..
حيث اضفت اليه زر الطباعة عن طريق مكون الكويكريبورت 
وايضا زر اخر ساعدني فيه الاخ المحترم لعربي [size=small]بارادوكس[/size]
للطباعة عن طريق مكون فاست ريبورت 
والحمد لله فهمت جيدا هذا النوع من الطباعة
احاول [b][size=small]كلما [b][size=small]مرة [/size][/size]
[/b]اضافة شيء جديد لهذا البرنامج
مثلما احاول حاليا على
فرز او احصاء الاسماء وارقام الحسابات المتكررة
[/b]

[صورة: 365289664.jpg]



RE: استفسار حول القيم المكررة - ALG2009 - 16-01-2021

تفضل أخي 
كود :
   for i := 1 to StringGrid1.RowCount -1 do       for j := i+1 to StringGrid1.RowCount -1 do     begin       if StringGrid1.Cells[3, i] = StringGrid1.Cells[3, j] then         begin           s:=s+1;         end;      end;

أستخدم هذا الكود ،حيث يعطيك عدد الحسابات المكررة 
[StringGrid1.Cells[3, i] تمثل خانة رقم الحساب إن أردت إظهار بقية الخانات كالإسم وغير غير رقم الخلية
المجموع الكلي داخل المعرف s أي مجموع القيم المكررة