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

مشاهدة النسخة كاملة : كيف تحذف الخانات الفارغة في grid او ListBox


عبد الهادي بهاب
21-11-2015, 10:02 PM
كيف تحذف الخانات الفارغة في grid او ListBox

حاولت من خلال هذا الكود


for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end


لكن بيقى سطر فارغ لم يحذف

:abc_138::abc_138:هل فيه افكار يا سيادة يا كرام ؟:abc_138::abc_138:

عبود عبود
21-11-2015, 10:36 PM
إستعمل أمر تحديث الجايد وهو :

Grid.SetRedraw("Grid1", true, true);


إستعمل أمر تحديث الليست بوكس وهو :

ListBox.SetUpdate("ListBox1", true);


بعد كل عملية :abc_152:

عبد الهادي بهاب
21-11-2015, 10:53 PM
إستعمل أمر تحديث الجايد وهو :

Grid.SetRedraw("Grid1", true, true);


إستعمل أمر تحديث الليست بوكس وهو :

ListBox.SetUpdate("ListBox1", true);


بعد كل عملية :abc_152:

شكرا استاذ عبود
لكن للاسف لم تنجح معي ........ انا استدعي معطيات من ملفini وبحكم شرط يبقى في grid خانات فارغة اي رقمها في الملف لا تناسبب الشرط
فاضططرت لتفريغ grid بالكود السابق

عبد الهادي بهاب
21-11-2015, 10:56 PM
صورة من زر استدعاء البيانات من ملف ini



local tblsec = INIFile.GetSectionNames("AutoPlay\\Docs\\1.ini");
if tblsec then

for c in pairs(tblsec) do
ff = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "classe");
num = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "numero");
nom = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "nom");
date = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "date_naisasance");
grad = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "mis_scout");
stage = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "tahil");
sta = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_tahil");
fo = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "foj");
mbl = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "mobil");
mis = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_mis");
niv = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "niveau");
an = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "annee");
ni = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_niveau");
soc = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "social");
sc = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_social");
comun = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "commun");
commun = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_commun");
metier = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "metier");
mihna = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_metier");
email = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "email");
assu = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "n_assurance");
insc = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "an_inscription");
sang = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "g-sang");
fonct = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "f_fonction");
remm = INIFile.GetValue("AutoPlay\\Docs\\1.ini", tblsec[c], "rem");

if ff=="1" then
Grid.SetCellText("Grid1", c+1, 1, nom, true);
Grid.SetCellText("Grid1", c+1, 2, date, true);
Grid.SetCellText("Grid1", c+1, 3, commun, true);
Grid.SetCellText("Grid1", c+1, 4, grad, true);
Grid.SetCellText("Grid1", c+1, 5, stage, true);
Grid.SetCellText("Grid1", c+1, 6, mbl, true);
Grid.SetCellText("Grid1", c+1, 7, ni, true);
Grid.SetCellText("Grid1", c+1, 8, soc, true);
Grid.SetCellText("Grid1", c+1, 9, metier, true);
Grid.SetCellText("Grid1", c+1, 10, email, true);
Grid.SetCellText("Grid1", c+1, 11, assu, true);
Grid.SetCellText("Grid1", c+1, 12, sang, true);
result = ListBox.AddItem("ListBox1", nom, tblsec[c]);
ListBox.SetUpdate("ListBox1", true);
end
end
end

Grid.SetRedraw("Grid1", true, true);




هذا الشرط ( if ff=="1" then ) هو ما يسبب الخانات الفارغة

عبود عبود
21-11-2015, 11:12 PM
أستغرب من هذا السطر :

for c in pairs(tblsec) do


هل هكذا يكون صحيح :abc_070: ؟

أين المفتاح وأين القيمة هل c مفتاح أم قيمة ؟ هل يجوز ذلك ؟

الصحيح أن يكون هناك مفتاح وقيمة فى أمر التكرار لأخذ رقم للتكرار وقيمة معلومات طبعا طالما تستخدم pairs


for i,d in pairs(result) do



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

المـهاجر
22-11-2015, 07:05 PM
هل c مفتاح أم قيمة ؟

c مفتاح

هل يجوز ذلك ؟

نعم يجوز

tbl = {"a","b","c","d"}

for c in pairs(tbl) do
Dialog.Message("Notice", c.." val= "..tbl[c], MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
end

عبد الهادي بهاب
22-11-2015, 07:13 PM
c مفتاح

نعم يجوز
tbl = {"a","b","c","d"}

for c in pairs(tbl) do
dialog.message("notice", c.." val= "..tbl[c], mb_ok, mb_iconinformation, mb_defbutton1);
end

السلام عليكم
ما كنت لاجيب كما اجبت استاذ
شكرا لك و للشيخ عبود

عبد الهادي بهاب
22-11-2015, 07:16 PM
هذا الملف الذي اعمل عليه
استعملت فيه الكودين معا و دائما فيه مشكل

http://www.mediafire.com/download/2i66blw6yca826s/to+excel.apz

المـهاجر
22-11-2015, 07:30 PM
الكود خاصتك لا يعمل بشكل صحيح
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end

إستبدل i ب 1 ليعمل بشكل صحيح كالتالى

for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", 1, 1) == "" then
Grid.DeleteRow("Grid1", 1, true);
end
end

بالتوفيق

ثامر أبو بلقيس
22-11-2015, 07:37 PM
موفق بإذن الله ... لك مني أجمل تحية . :abc_138:

عبد الهادي بهاب
22-11-2015, 08:49 PM
الكود خاصتك لا يعمل بشكل صحيح
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end

إستبدل i ب 1 ليعمل بشكل صحيح كالتالى

for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", 1, 1) == "" then
Grid.DeleteRow("Grid1", 1, true);
end
end

بالتوفيق


للاسف لا يعمل لانه متعلق فقط بالخانة الاولى :abc_085::abc_085::abc_085:

انتظر استاذنا الكريم:abc_152::abc_152::abc_152:

المـهاجر
22-11-2015, 10:17 PM
خالص اعتذاراتى
تجاهل مشاركتى السابقة
for i=1, Grid.GetRowCount("Grid1")+1 do
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end
end

قد لا يكون الحل الأمثل
لكنه فعال جدا و مناسب لإستفسارك
بالتوفيق

عبد الهادي بهاب
23-11-2015, 12:21 AM
خالص اعتذاراتى
تجاهل مشاركتى السابقة
for i=1, Grid.GetRowCount("Grid1")+1 do
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end
end

قد لا يكون الحل الأمثل
لكنه فعال جدا و مناسب لإستفسارك
بالتوفيق

روووووووووووو عة استاذنا الكريم ......................:abc_050::abc_050::abc_050:

لكم من باب الطمع في كرمكم ..........هل لي بتفسير لماذا الكود الاول ترك سطرا ؟ و عندما اضفت دالة for مرتين كل شيء تمام ؟؟

المـهاجر
23-11-2015, 02:12 AM
روووووووووووو عة استاذنا الكريم ......................:abc_050::abc_050::abc_050:

لكم من باب الطمع في كرمكم ..........هل لي بتفسير لماذا الكود الاول ترك سطرا ؟ و عندما اضفت دالة for مرتين كل شيء تمام ؟؟

لا بأس
ما ستقرأه الآن لن تجده حتى فى موقع الشركة المنتجه
فحاول ان تفهمنى من المرة الأولى

الكود الخاص بك لا يترك سطرا خاليا
بل يترك نصف عدد الأسطر الفارغة دائما (إبدأ بجريد خالى تماما و ستفهمنى أسرع)

تأمل الكود خاصتك
كل المعطيات تؤكد أنه صحيح
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end

لماذا فشل عمليا برغم صحته نظريا ؟؟؟
ببساطة شديدة هذا يسمى BUG فى الأوتوبلاى

كيف ؟؟
لنفرض ان عدد عناصر الجريد = 10

هل بعد حذفك لأحد العناصر ستظل كما هى 10 ؟؟ كلا و بالتأكيد ستصبح 9 عناصر فقط
سيتعامل الكود الخاص بك (الصحيح 100 % نظريا) على انهم لا زالوا 10 عناصر طوال عمل الحلقة
و سيطلب الكود حذف العنصر الثانى بينما الجريد لم يتبقى به الا عنصر واحد
يفشل الكود grid operation failed

خطأ يستلزم تدخل الشركة المنتجة للأوتوبلاى لمعالجة ال BUG
التى سترد حتما بال bla bla bla و لن تحل المشكل و قد تحذف عضويتك

بعد تركيب الحلقتين
نضمن العدد الصحيح و الترقيم الصحيح لعناصر الجريد بعد الحذف و قبل الشروع بالدورة التالية

أعتذر للإطالة
بالتوفيق

عبد الهادي بهاب
23-11-2015, 02:17 PM
لا بأس
ما ستقرأه الآن لن تجده حتى فى موقع الشركة المنتجه
فحاول ان تفهمنى من المرة الأولى

الكود الخاص بك لا يترك سطرا خاليا
بل يترك نصف عدد الأسطر الفارغة دائما (إبدأ بجريد خالى تماما و ستفهمنى أسرع)

تأمل الكود خاصتك
كل المعطيات تؤكد أنه صحيح
for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.DeleteRow("Grid1", i, true);
end
end

لماذا فشل عمليا برغم صحته نظريا ؟؟؟
ببساطة شديدة هذا يسمى BUG فى الأوتوبلاى

كيف ؟؟
لنفرض ان عدد عناصر الجريد = 10

هل بعد حذفك لأحد العناصر ستظل كما هى 10 ؟؟ كلا و بالتأكيد ستصبح 9 عناصر فقط
سيتعامل الكود الخاص بك (الصحيح 100 % نظريا) على انهم لا زالوا 10 عناصر طوال عمل الحلقة
و سيطلب الكود حذف العنصر الثانى بينما الجريد لم يتبقى به الا عنصر واحد
يفشل الكود grid operation failed

خطأ يستلزم تدخل الشركة المنتجة للأوتوبلاى لمعالجة ال BUG
التى سترد حتما بال bla bla bla و لن تحل المشكل و قد تحذف عضويتك

بعد تركيب الحلقتين
نضمن العدد الصحيح و الترقيم الصحيح لعناصر الجريد بعد الحذف و قبل الشروع بالدورة التالية

أعتذر للإطالة
بالتوفيق

طيب جدا ........ربي يحفظكم ........... قد لا اكون ضليها و لا فهيما في البرمجة لكن الشرح واضح و بين جدا
استفيد منه مستقبلا ان شاء الله
ربي ينصرك استاذ :abc_152:

عبود عبود
23-11-2015, 04:31 PM
السلام عليكم
ما كنت لاجيب كما اجبت استاذ
شكرا لك و للشيخ عبود

لم أكن أعلم أنك تعرف ولذلك وجب لفت الإنتباه أنه : عندما تستخدم pairs فإنه هناك شيئ إسمة مفتاح وآخر قيمة داتا "معلومات"
ولذلك فهناك التكرار :

for i=1,5 do أى أن التكرار يكون من الرقم 1 وحتى 5 فليس من الضرورى إستخدام pairs

والتكرار بإستخدام مفتاح وقيمة وهو :

for i,d in pairs(s) do أى نريد إستخدام التكرار العددى لقيم ما موجودة فى جدول ومعرفة بيانات الجدول من خلال القيمة d

والخلاصة هى وجوب التفرقة بين النوعين وإختيار الأفضل المناسب للحلقة التى تريد بناءها من وجهة نظر المبرمج .


تحياتى لكم

عبد الهادي بهاب
23-11-2015, 06:11 PM
[COLOR="Magenta"]لم أكن أعلم أنك تعرف

لم اقصد ما فهمته تماما....... بل لقد استفدت من اجابة الاستاذ و من مداخلتك الان ........ انما صححت مفاهيمي اصلا رغم استعمالي كثيرا للكود :abc_152:

ثامر أبو بلقيس
23-11-2015, 07:34 PM
السلام عليكم ورحمة الله وبركاته

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

x = Grid.GetProperties("Grid1");
Grid.SelectAll("Grid1");
Grid.EditCopy("Grid1");
str = Clipboard.GetText();
tamer = {};
for line in string.gfind(str, "[^".."\r\n".."]+") do
if String.Length(line) >Grid.GetColumnCount("Grid1") then
table.insert(tamer, line);
result2 = Table.Concat(tamer, "\r\n", 1, TABLE_ALL);
end
end
Clipboard.CopyText(result2);
Grid.DeleteAllItems("Grid1");Grid.SetProperties("Grid1", x);
Grid.EditPaste("Grid1");

تقديري :abc_138:

المـهاجر
23-11-2015, 08:34 PM
السلام عليكم ورحمة الله وبركاته

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

x = Grid.GetProperties("Grid1");
Grid.SelectAll("Grid1");
Grid.EditCopy("Grid1");
str = Clipboard.GetText();
tamer = {};
for line in string.gfind(str, "[^".."\r\n".."]+") do
if String.Length(line) >Grid.GetColumnCount("Grid1") then
table.insert(tamer, line);
result2 = Table.Concat(tamer, "\r\n", 1, TABLE_ALL);
end
end
Clipboard.CopyText(result2);
Grid.DeleteAllItems("Grid1");Grid.SetProperties("Grid1", x);
Grid.EditPaste("Grid1");

تقديري :abc_138:

اعدك بمراجعته
لكن هناك ملحوظه هامه
لا يمكنك عمليا إستخدام الكود
Grid.SelectAll("Grid1")
بدون مواجهة مشكلة خطيرة قد لا تكون منتبه لها

سيقوم هذا الكود بتشغيل كافة أكواد الجريد الموجودة فى الحدث on selection changed الخاصة بالجريد الذى وجهت اليه الكود
جرب و ضع فى هذا الحدث رسالة مثلا
و نفذ الكود و ستفهم

أيضا سيتسبب الكود
Grid.EditPaste("Grid1");
قى تشغيل كافة أكواد الجريد الموجودة فى الحدث on cell changed بدون سابق إنذار

ستكون امام كود يناسب جريدات خالية من الأحداث فقط
لا نضمن ذلك عمليا
:abc_152:

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

for i=1, Grid.GetRowCount("Grid1")+1 do
if Grid.GetCellText("Grid1", i, 1) == "" then
Grid.SetRowHeight("Grid1", i, 0, true);
end
end


حل بسيط جدا و لا يعانى من مشاكل كود الحذف
بالتوفيق

ثامر أبو بلقيس
23-11-2015, 10:11 PM
عندما نستخدم pairs فإنه هناك شيئ إسمة مفتاح وآخر قيمة داتا "معلومات"
ولذلك فهناك التكرار :

for i=1,5 do أى أن التكرار يكون من الرقم 1 وحتى 5 فليس من الضرورى إستخدام pairs

والتكرار بإستخدام مفتاح وقيمة وهو :

for i,d in pairs(s) do أى نريد إستخدام التكرار العددى لقيم ما موجودة فى جدول ومعرفة بيانات الجدول من خلال القيمة d

والخلاصة هى وجوب التفرقة بين النوعين وإختيار الأفضل المناسب للحلقة التى تريد بناءها من وجهة نظر المبرمج .


تحياتى لكم

شكرا الأستاذ عبود على هذه الالتفاتة و هذا التذكير المفيد بارك الله فيك :abc_138:


شكرا أخي المهاجر بارك الله فيك ملاحظات مفيدة جدا شكرا :abc_138: