delphi4arab منتديات دلفي للعرب

نسخة كاملة : استفسار حول القيم المكررة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3
السلام عليكم ورحمة الله وبركاته 
ماهو سطر الكود الذي من خلاله  احصي
كل الاسماء والقيم المكررة في المكون StringGrid
واعرضها بالمكون Memo ..بارك الله فيكم Smile
وعليكم السلام ورحمة الله وبركاته

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

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

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

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

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

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

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

كود :
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
اصبت اخي الكريم الامور اختلطت علي لم اجد الحل بعد ..
خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي
ومنكم استفيد اخواني الافاضل
شكرا مجددا على التلميحات والمساعدات من اجل التعلم Smile جزاك الله كل الخير
إقتباس :خاصة انني اتعلم تعلم بيزنطي وليس اكاديمي


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

ضع 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
حسب ما تفضلت به يا محترم تاكدت بانني لن اتوصل اليه ...( مهما بحثت وحاولت واااع
أحييك اخي الكريم على رحبة صدرك، لكن لي سؤال لماذا يجب اضافة اثنان من المكون listbox
الا يمكن اضافة مكون واحد ومباشرة نذكر به الاسماء المكررة وكم عدد المرات التي تكررت ؟
الاداة الاولى نحتاجها لمقارنة محتوياتها من الاسماء بالاسماء الموجوة في 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 فتقراء اول اسم تم تقول بدورة اخرى تقارنه بمحتوياتها وتنتقل الى الاسم الذي يليه وهكذا
يمكنك تجربة هذه الطريقة بعد ان صار معك كل ماتحتاج
شكرا جزيلا اخي المحترم على مساعدتك لي Smile
والتوضيح لعمل احصاء ما هو متكرر من اسماء وقيم 
لقد ارفقت برنامج الاخ لعربي بارادوكس سابقا 
الخاص بملف txt خاص بالاجور ..
حيث اضفت اليه زر الطباعة عن طريق مكون الكويكريبورت 
وايضا زر اخر ساعدني فيه الاخ المحترم لعربي [size=small]بارادوكس[/size]
للطباعة عن طريق مكون فاست ريبورت 
والحمد لله فهمت جيدا هذا النوع من الطباعة
احاول [b][size=small]كلما [b][size=small]مرة [/size][/size]
[/b]اضافة شيء جديد لهذا البرنامج
مثلما احاول حاليا على
فرز او احصاء الاسماء وارقام الحسابات المتكررة
[/b]

[صورة: 365289664.jpg]
تفضل أخي 
كود :
   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 2 3