delphi4arab منتديات دلفي للعرب
فتح الملف النصي لـ Virement CCP في StringGrid - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : فتح الملف النصي لـ Virement CCP في StringGrid (/showthread.php?tid=10827)

الصفحات: 1 2


فتح الملف النصي لـ Virement CCP في StringGrid - larbiparadox - 11-05-2020

باسم الله الرحمان الرحيم

السلام عليكم

وتقبل الله صيامكم و قيامكم

[صورة: 657834394.png]

نظرا لضيق الوقت سأتطرق إلى أهم الامور في المثال :  من جهتي أحب البساطة لكي يفهمها أي شخص
PHP كود :
function Cle(const  Type_Cle, Compte_CCP: string): string;
var
  I: Byte;
begin
  Result 
:= '0';

  if Type_Cle = 'RIP' then begin

     
for I := Length(Compte_CCP) downto 1 do
     Result := IntToStr( StrToInt(Result) + StrToInt(Compte_CCP[I]) * (Length(Compte_CCP) - I + 4) );
     result := IntToStr( StrToInt(Result) mod 100 );

  end;

  if Type_Cle = 'OLD' then begin

  result 
:=IntToStr(  97 - ((((StrToInt(Compte_CCP) mod 97) * 3 mod 97) + 85) mod 97)   );

  end;


   if Length(Result) = 1 then  Result :=  '0'+  Result;

end; 

ـ أول شيء حساب المفتاح لرقم الحساب ،  يوجد موضوع يتحدث على ذلك من هنا

* أولا function Cle تقوم بحساب المفتاح RIP أو القديم OLD كمثال تكون الكتابة الكتالي
PHP كود :
  Edit4.Text :=  Cle('RIP',Edit3.Text) ;
  Edit5.Text :=  Cle('OLD',Edit3.Text) ; 

الشيء الثاني فتح الملف نصي نصرح به TextFile ثم نعطيه مسار الملف AssignFile(اسم الملف المصرح به, مسار الملف)  و بعدها فتحه Reset

لكي نقرأ السطر نكتب ReadLn و لكتبنا مرة اخر ReadLn ينقلنا للسطر الثاني وهكذا تواليك ، عذرا أنا أختصر .

لتسهيل عملية قراء السطر كتبت الدالة التالية function LireText سرحت بها على أنها record تحتوي على الحساب و المفتاح و الاسم و المبلغ

التسريح بالسجل
PHP كود :
type
 TextRecord 
= record
 COMPTE
,CLE,NOM_PRENOM: string;
 
MONTANT: real;
end; 

الدالة لقراءة السطر
PHP كود :
function LireText (const LigneTexte: string): TextRecord;
begin

 result
.COMPTE := intTOstr(strTOint( copy(LigneTexte,10,10) ));
 
result.CLE := copy(LigneTexte,20,2);
 
result.MONTANT := strTOfloat(copy(LigneTexte,22,13)) / 100;
 
result.NOM_PRENOM := Trim(  copy(LigneTexte,35,27)  );

end; 

مثال الاحضار رقم الحساب من السطر إلى خلية من StringGrid1
PHP كود :
    StringGrid1.Cells[1,i] := LireText(ligne).COMPTE ; 

بالنسبة لـ StringGrid1 وضعت في الاحداث في DrawCell ، محذات رقم الحساب و المبلغ إى اليمين ، ومقارنة المفتاح إذا وجد من القديم يتركه بلون أبيض و RIP باللون الاخضر و خاطئ بالاحمر

حمل المثال من المرفقات

أي إستفسار سأحاول الاجابة عنه في اقرب وقت

يرجى تصحيح كما في الصورة 21 إلى 20

[صورة: 543325496.png]

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


RE: فتح الملف النصي لـ Virement CCP في StringGrid - medreg - 11-05-2020

بارك الله فيك وصح لفطورك
ملاحظة لقد وجدت خطأ صغير لا اعرف انك متعمد حتى تدرك اننا قد راجعن الدرس ام انك غير متعمد
والخطأ هو في الدالة
if Type_Cle = 'RIP' then begin
و
if Type_Cle = 'OLD' then begin
انت وضعت التعريف الأول في الدالة على أنه RIP
والتعريف الثاني على انه OLD
والصحيح هو ان التعريف الأول هو OLD
والثاني هو RIP
هل صح ما اقول ام غلط


RE: فتح الملف النصي لـ Virement CCP في StringGrid - larbiparadox - 12-05-2020

شكرا هذا خاص بـ RIP

PHP كود :
result :=IntToStr(  97 - ((((StrToInt(Compte_CCP) mod 97) * 3 mod 97) + 85) mod 97)   ); 

(12-05-2020, 08:36 AM)larbiparadox كتب : شكرا هذا خاص بـ RIP

PHP كود :
result :=IntToStr(  97 - ((((StrToInt(Compte_CCP) mod 97) * 3 mod 97) + 85) mod 97)   ); 

شكرا على ملاحظة الخطأ ، لم أتعمده خطأ مطبعي

المثال المصحح في المرفقات


RE: فتح الملف النصي لـ Virement CCP في StringGrid - bouh25 - 13-05-2020

يوجد خطأ عند التنفيذ


RE: فتح الملف النصي لـ Virement CCP في StringGrid - medreg - 13-05-2020

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


RE: فتح الملف النصي لـ Virement CCP في StringGrid - ALG2009 - 13-05-2020

تقبل الله صيامكم

بالفعل البرنامج يعطي خطأ مع الملف النصي المرفق مع السورس

ولكن مالفائده من تحويل الملف النصي إلى البرنامج هل قصد التصحيح أم ماذا؟

ما أعرفه هو تحويل العكس أي إلى ملف نصي ليتم نسخه على القرص المضغوط

هل ممكن كيف يتم التحويل من الإكسيل إلى ملف نصي مع التنبيه إلى الحسابات المكررة

أريد أن أتعلم كيف يتم التنبيه إلى الحسابات المتكررة كيف يتم ذلك؟


RE: فتح الملف النصي لـ Virement CCP في StringGrid - ALG2009 - 18-05-2020

السلام عليكم

أحاول أن أًحول التحويل من ملف الاكسيل  إلى ملف نصي تم التحويل من الاكسيل إلى stringGrid والان عندي مشكل مع الـ format()

هل من إقتراحات


كود :
type   TForm3 = class(TForm)     DBGrid1: TDBGrid;     Button1: TButton;     Button2: TButton;     StringGrid1: TStringGrid;     procedure Button1Click(Sender: TObject);     procedure Button2Click(Sender: TObject);   private     { Private declarations }       ExcelFile,sheet : Variant;       procedure OpenExcelFile;   public     { Public declarations }   end; var   Form3: TForm3; implementation {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); Var      MaxRow, MaxCol,i,j:Integer; begin    OpenExcelFile;    MaxRow := Sheet.Usedrange.Rows.count ;   MaxCol := sheet.Usedrange.Columns.count;   stringgrid1.RowCount:=maxRow+1;   StringGrid1.ColCount:=maxCol+1;   for I := 1 to MaxCol do   begin     for j := 1 to MaxRow do     begin      stringgrid1.Cells[i,j]:=excelfile.cells[j,i].value;     end;   end; ExcelFile.workbooks.close; ExcelFile.quit; ExcelFile:=Unassigned; end; procedure TForm3.Button2Click(Sender: TObject); var f: TextFile;     i: Integer; begin   AssignFile(f,'d:\1.txt');   Rewrite(f);   with StringGrid1 do   begin     for i := 1 to RowCount - 1 do     begin         Write(F, '*'+Cells[1, i]);          Write(F, format('%s',cells[2, i]));           Write(F, Cells[3, i]);            Write(F, Cells[4, i]);             Write(F, Cells[5, i]);            writeln(f);     end;   end;   CloseFile(F); end; procedure TForm3.OpenExcelFile; begin    ExcelFile := CreateOleObject('Excel.Application');    ExcelFile.visible:=0;    ExcelFile.Workbooks.Open('C:\Users\HAT\Desktop\book1.xls');    sheet := ExcelFile.WorkSheets[1]; end; end.



RE: فتح الملف النصي لـ Virement CCP في StringGrid - larbiparadox - 18-05-2020

وعليك السلام

سأعطيك مثال لوضع الاصفار

مثال رقم الحساب : 11111  طوله خمس حروف و رقم الحساب كامل طوله 20 ، ننقص طول  المفتاح بقي 18 حرف كيفية ملأ الاصفار متبقية


كود :
edit1.Text := StringOfChar('0',18-length('11111')) + '11111'

استعملنا   StringOfChar('0',18) معنها كرر الصفر 18 مرة ، كما يمكنك استعمالها في تكرار الفراغ StringOfChar(' ',18)


RE: فتح الملف النصي لـ Virement CCP في StringGrid - ALG2009 - 18-05-2020

(18-05-2020, 07:49 PM)larbiparadox كتب : وعليك السلام

سأعطيك مثال لوضع الاصفار

مثال رقم الحساب : 11111  طوله خمس حروف و رقم الحساب كامل طوله 20 ، ننقص طول  المفتاح بقي 18 حرف كيفية ملأ الاصفار متبقية


كود :
edit1.Text := StringOfChar('0',18-length('11111')) + '11111'

استعملنا   StringOfChar('0',18) معنها كرر الصفر 18 مرة ، كما يمكنك استعمالها في تكرار الفراغ StringOfChar(' ',18)

بارك الله فيك وجزاك الله خير

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

كود :
  Cells[4, i],' ':27- length(Cells[4, i]),1);

وهذا الكود الأخير
هل من أي إنتقادات أو الكود يعتبر جيد وأصبحت خبير   Big Grin
كود :
  AssignFile(f,'d:\1.txt');   Rewrite(f);   with StringGrid1 do   begin     for i := 1 to RowCount - 1 do     begin     Write(F,'*00799999',stringofchar('0',10- length(Cells[2, i]))+Cells[2, i],cells[3, i],stringofchar('0',10- length(Cells[5, i]))+Cells[5, i],Cells[4, i],' ':27- length(Cells[4, i]),1);     writeln(f);     end;   end;   CloseFile(F);


مع العلم سأحاول وضع شكل العرض للمبلغ لا أدري إن كان سيؤثر أم لا أي ستضتف الفواصل أقصد Format('0,0##.##',stringGrid.Cells[i,j])
في خانة المبلغ لل StringGrid إن كان هناك تأثير سأظطر إلى دالة تحذف الفواصل

بالفعل وقعت في مشكلة حذف الفواصل من المبلغ  Sad


RE: فتح الملف النصي لـ Virement CCP في StringGrid - medreg - 20-05-2020

السلام عليكم ورحمة الله تعالى وبركاته
كيف يمكنني ان استدعي هذا الملف الى قاعدة بيانات بدلا من المكون stringrid
لدي قاعدة بيانات تحتوي على نفس الحقول اي COMPTEو CLE و NOM_PRENOM وMONTANT
مع استعمال المكون TTable و DBGrid
جزاكم الله عنا كل خير