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

نسخة كاملة : اتعامل مع StringGrid و اريد التنقل
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3 4
فهمت المشكلة المشكل انه كان فيه 10 صفوف يجب ان تملأ كاملة حتى تتم عملية الجمع ؟
يعني هناك مشكلة متلا ماذا لو لدينا خلية واحد او اتنان او تلاتة هل يجب ان املائها كلها ؟
كيف اجعل الكود اذا كانت الخلية فارغة اعطيها قيمة صفر او يتجهلها افضل
لانه في الطبعة ستظر 0

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


كود :
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
اشغل الحمد لله في ميزان حسناتك

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

شكرا اخي الكريم ساعتدني كتيرا جزاك الله خيرا
نعم كلتا الدالتين للاعداد الحقيقية و التي قد تحتوي فاصلة StrToFloatDef تعمل عندما تكون القراءة غير مهمة في حال ادخال text لا يمثل عدد فترسل القيمة المحددة سلفا عادة تكون الصفر اما StrToFloat فتلزم بادخال عدد و الا فترسل رسالة تحذير و يتوقف البرنامج ,,,هناك نسختين اخريين للاعداد الصحيحة StrToIntDef و StrToInt ,,,

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

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

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

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

هل يمكنك تجريب كود تحويل العمود الى مئات عندك لم يشتغل عندي اكيد وضعت 0
إقتباس :هل يمكنك تجريب كود تحويل العمود الى مئات عندك لم يشتغل عندي اكيد وضعت 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 2 3 4