اتعامل مع StringGrid و اريد التنقل
#11
فهمت المشكلة المشكل انه كان فيه 10 صفوف يجب ان تملأ كاملة حتى تتم عملية الجمع ؟
يعني هناك مشكلة متلا ماذا لو لدينا خلية واحد او اتنان او تلاتة هل يجب ان املائها كلها ؟
كيف اجعل الكود اذا كانت الخلية فارغة اعطيها قيمة صفر او يتجهلها افضل
لانه في الطبعة ستظر 0

بارك الله فيك على المجهود الجبار
الرد
#12
نعم يجب ملؤها جميعها لحساب النتيجة بطريقة امنة و لقد ذكرت ذلك في السابق اما ان كنت تريد تتجاهل الخانات الفارغة فهاذا اسهل


كود :
procedure TForm5.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;   var CanSelect: Boolean); var   I:integer;   Total:Double; begin   Total:= 0.0;   with StringGrid1 do   for I := FixedRows to RowCount - 1 do     Total:=Total + StrToFloatDef(Cells[FixedCols+0,I],0);   Edit1.Text:=FloatToStr(Total); end;

إقتباس :كيف اجعل الكود اذا كانت الخلية فارغة اعطيها قيمة صفر او يتجهلها افضل
 كما قلت سابقا ابحث في help  عن الفرق بين TryStrToFloat StrToFloatDef  StrToFloat

ملف https://www.casimages.com/f_get.php?f=gpyBsuK61Xb
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Med-01
الرد
#13
اشغل الحمد لله في ميزان حسناتك

بخصوص جمع الاعداد التي تحتوي على فاصلة هل يكفي تغير StrToFloatDef الى StrToFloat ام كل دالة لها طريقة عملها ؟

شكرا اخي الكريم ساعتدني كتيرا جزاك الله خيرا
[-] كل من 1 user says قال شكرا ل Med-01 على المشاركة المفيدة
  • Ndagor
الرد
#14
نعم كلتا الدالتين للاعداد الحقيقية و التي قد تحتوي فاصلة StrToFloatDef تعمل عندما تكون القراءة غير مهمة في حال ادخال text لا يمثل عدد فترسل القيمة المحددة سلفا عادة تكون الصفر اما StrToFloat فتلزم بادخال عدد و الا فترسل رسالة تحذير و يتوقف البرنامج ,,,هناك نسختين اخريين للاعداد الصحيحة StrToIntDef و StrToInt ,,,

ملاحظة مهمة ان اردت اعتماد الكود في حال ادخال قيمة ثم الخروج مباشرة من StringGrid كالضغط على زر button او الكتابة في edit فان الحساب لا يتم,, اذا ينبغي وضع كود الحساب في دالة منفصلة ثم ستعماله على مرتين الاولى فى OnSelectCell و الثانية في OnExit انظر في الملف الذي في الرابط في التعليق السابق...
الرد
#15
<p>[صورة: Capture.jpg]<br><br><br>نفس الشيئ لا يقوم بحساب الاعداد التى بها فاصلة&nbsp;</p>
الرد
#16
نعم انا استعملت الاعداد الصحيحة باستعمال StrToIntDef ....فعلت ذالك لان الاعداد الفاصلة لها مشكل مع حرف الفاصلة اي احيانا هنا من يستعمل . و هناك ,يسمى Decimalseparator و هذه تسبب احيانا مشاكل لهذا فضلت ان اكتب مثال للاعداد بدون فاصلة... هذا ليس مشكل يمكنك اعادة كود السابق للاعداد الفاصلة..انقله الى الدلة Calculate
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Med-01
الرد
#17
وهو كذالك المشكلة يجب عدم استخدام النقطة التي في لوح المفاتيح الموجودة مع الارقام بل استخدام فاصلة الموجودة مع الحروف

اريد اظهار الارقام بهذا الشكل FormatFloat('#,##0.00' الموجودة في عمود StringGrid1 ؟

وجدت هذا الشخص قام بها سابقا لكن لم استطع استخلاص الكود

https://delphi4arab.net/forum/showthread...StringGrid

<p>

حاولت تجريب هذا الكود ولم يشتغل هل يمكن المشكلة من النسخة ؟

<br><br>
كود :
procedure TfrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if ACol = 3 then // le 3 est un exemple , faut voir le numéro de ta colonne With TStringGrid(Sender) do Cells[ACol,ARow] := FormatFloat('0.00', StrToFloat(Cells[ACol,ARow],0.00)); end;
<br></p>
الرد
#18
إقتباس :وهو كذالك المشكلة يجب عدم استخدام النقطة التي في لوح المفاتيح الموجودة مع الارقام بل استخدام فاصلة الموجودة مع الحرو
ف

البرنامج يقوم بقراءة الاعدادت اللغة و التاريخ و الارقام في الحاسوب اذا الامر يتعلق بالاعدادات الخارجية و لكن يمكن تغير ذلك بوضع كود  في FormCreate
كود :
Decimalseparator : ='.'

بنسبة للفرمات اظن انها تعمل على العمود الرابع وليس الاول حاول تغير الى ACol=0 ..اشك انها ستعمل...غدا ان شاء الله.
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Med-01
الرد
#19
بانسبة لنقطة حللت المشكلة وجدت كود يقوم بتحويل النقطة الى فاصلة عنذ الضغط الحمد لله لم انتبه حتى اخبرتني انت كنت طوال الوقت اكتب نقطة
ولا تظهر اي نتيجة مهما عدلت الكود

هل يمكنك تجريب كود تحويل العمود الى مئات عندك لم يشتغل عندي اكيد وضعت 0
الرد
#20
إقتباس :هل يمكنك تجريب كود تحويل العمود الى مئات عندك لم يشتغل عندي اكيد وضعت 0


جرب هذا الكود OnDrawCell ,يعمل عندي

كود :
var Value:Double; begin with StringGrid1 do   if (ACol=0) then   begin     Value :=StrToFloatDef(Cells[ACol, ARow],0);     Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,         FormatFloat('0.00',Value));   end;
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Med-01
الرد


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


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