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

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

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

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

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

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

وكل خلية تقراء قيمتها تخزنها بمصفوفة او حتى مكون TlistBox وكل خلية تقراء قيمتها تنظر هل هي موجودة بالمكون TlistBox ام لا 
اذا كانت موجودة يعني انها مكررة فتضعها بمصفوفة اخرى او مكون TlistBox أخر
فيكون لديك مكونان من TlistBox واحد تضع به القيم كلها والاخر القيم المكررة فقط
هذه الفكرة التي تحضرني الان
جرب البدء في البرمجة وما يعترضك من مشاكل اعرضها هنا
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Ibn Battuta
الرد
#3
حسنا يا محترم سوف احاول
وشكرا على المعطيات الأولية لبداية المحاولات ..
الرد
#4
لقد تأخرت في طرح ما لديك
اما انك وجدت الحل واما ان الامور اختلطت عليك

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

كود :
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
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Ibn Battuta
الرد
#5
اصبت اخي الكريم الامور اختلطت علي لم اجد الحل بعد ..
خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي
ومنكم استفيد اخواني الافاضل
شكرا مجددا على التلميحات والمساعدات من اجل التعلم Smile جزاك الله كل الخير
[-] كل من 1 user says قال شكرا ل Ibn Battuta على المشاركة المفيدة
  • Delphi4Us
الرد
#6
إقتباس :خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي


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

ضع 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


الملفات المرفقة
.jpg   1.jpg (الحجم : 31.58 ك ب / التحميلات : 103)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Ibn Battuta
الرد
#7
حسب ما تفضلت به يا محترم تاكدت بانني لن اتوصل اليه ...( مهما بحثت وحاولت واااع
أحييك اخي الكريم على رحبة صدرك، لكن لي سؤال لماذا يجب اضافة اثنان من المكون listbox
الا يمكن اضافة مكون واحد ومباشرة نذكر به الاسماء المكررة وكم عدد المرات التي تكررت ؟
الرد
#8
الاداة الاولى نحتاجها لمقارنة محتوياتها من الاسماء بالاسماء الموجوة في 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 فتقراء اول اسم تم تقول بدورة اخرى تقارنه بمحتوياتها وتنتقل الى الاسم الذي يليه وهكذا
يمكنك تجربة هذه الطريقة بعد ان صار معك كل ماتحتاج
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Ibn Battuta
الرد
#9
شكرا جزيلا اخي المحترم على مساعدتك لي Smile
والتوضيح لعمل احصاء ما هو متكرر من اسماء وقيم 
لقد ارفقت برنامج الاخ لعربي بارادوكس سابقا 
الخاص بملف txt خاص بالاجور ..
حيث اضفت اليه زر الطباعة عن طريق مكون الكويكريبورت 
وايضا زر اخر ساعدني فيه الاخ المحترم لعربي [size=small]بارادوكس[/size]
للطباعة عن طريق مكون فاست ريبورت 
والحمد لله فهمت جيدا هذا النوع من الطباعة
احاول [b][size=small]كلما [b][size=small]مرة [/size][/size]
[/b]اضافة شيء جديد لهذا البرنامج
مثلما احاول حاليا على
فرز او احصاء الاسماء وارقام الحسابات المتكررة
[/b]

[صورة: 365289664.jpg]


الملفات المرفقة
.rar   Import txt D7.rar (الحجم : 8.19 ك ب / التحميلات : 17)
الرد
#10
تفضل أخي 
كود :
   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 أي مجموع القيم المكررة
[-] كل من 1 user says قال شكرا ل ALG2009 على المشاركة المفيدة
  • Ibn Battuta
الرد


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


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