كيف اضافة ملف hex دخل اداة memo
#1
سلام عليكم ورحمة الله وبركته

اريد تعديل ملف المرفق  

مشروع يعرض ملف hex  دخل memo  


https://files.fm/u/z3wkwb9fs


الملفات المرفقة
.png   Capture.PNG (الحجم : 13.36 ك ب / التحميلات : 16)
.png   Capture1.PNG (الحجم : 129.91 ك ب / التحميلات : 17)
.png   VVV.PNG (الحجم : 275.43 ك ب / التحميلات : 7)
الرد
#2
وعليكم السلام

ان كان للعرض فقط يمكنك استعمال BinToHex لتحويل المعطيات من Bin الى النص   Hex اما التعديل على المعطيات على memo1 سيكون صعب و غير عملي الا اذا كانت بسيطة

كود لفتح ملف

كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  S:string;
  M:TMemoryStream;
begin
if OPENDIALOG1.Execute then
begin
   M:=TMemoryStream.Create();
   try
     M.LoadFromFile(opendialog1.Filename);
     Setlength(S,M.Size*2);
     BinToHex(PAnsichar(M.Memory),PWidechar(S),M.Size);
     memo1.Lines.Text := S;
   finally
      M.Free;
   end;

end;
end;
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Team dz
الرد
#3
شكرا  لك اخي الكريم  اريد التعديل عليه كما في الصورة المرفقة


الملفات المرفقة
.png   VVV.PNG (الحجم : 275.43 ك ب / التحميلات : 19)
الرد
#4
انت لاتقدم معلومات كافية ولا ادري كيف تريد التعديل الملف الثنائي ما يظهر في الصورة  هو  StringGrid  وليس Memo 


انظر المثال المرفق يقوم التعامل مع ملف  Bin بواسطة DrawGrid

يمكنك تعيله علي حسب حاجة

[صورة: Dlg.png]
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • Team dz
الرد
#5
برك الله فيك  اخي الكريم   

اريد نداء لقيمة معينة في  سطر معين  
مثلا 
سطر  00007B0  

قيمة  التى نناديها في EDIT1  هيا  

D8F3

مثال للتوضيح  اكثر  

00007B0 : D8F3 FEA0 D8F3 FE21 D8F3 FE22 D8F3 FEA3


القيمة باللون لاحمر اريدها مناتها عند رفع الملف  يذهب البرنامج الى السطر  00007b0 offest

برك الله فيك اخي الكريم

اريد نداء لقيمة معينة في سطر معين
مثلا
سطر 00007B0

قيمة التى نناديها في EDIT1 هيا

D8F3

مثال للتوضيح اكثر

00007B0 : D8F3 FEA0 D8F3 FE21 D8F3 FE22 D8F3 FEA3


القيمة باللون لاحمر اريدها مناتها عند رفع الملف يذهب البرنامج الى السطر 00007b0 offest
الرد
#6
معنى هذا انه يقوم بعملية بحث لايجاد قيمة D8F3 و تحديد عنوانها في الجدول ,,لقد اظفت زر Find يقوم بعملية البحث  من العنوان 0 ان كنت تريد البحث من عنوان محدد غير قيمة BinTxtBPos  في BFindClick الى عنوان الذي تريده

ان كنت تريد الذهاب مباشرة الى عنوان محدد تمكنك ادخاله في Offset الموجود اعلى Edit

المشكلة مع Memo انه لايمكن التعامل مع العناوين و من دون اظهارها لايمكن التعامل مع الملف بسهوله
هناك مثالان في الملف المرفق
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد
#7
(16-11-2022, 12:45 PM)Ndagor كتب : معنى هذا انه يقوم بعملية بحث لايجاد قيمة D8F3 و تحديد عنوانها في الجدول ,,لقد اظفت زر Find يقوم بعملية البحث  من العنوان 0 ان كنت تريد البحث من عنوان محدد غير قيمة BinTxtBPos  في BFindClick الى عنوان الذي تريده

ان كنت تريد الذهاب مباشرة الى عنوان محدد تمكنك ادخاله في Offset الموجود اعلى Edit

المشكلة مع Memo انه لايمكن التعامل مع العناوين و من دون اظهارها لايمكن التعامل مع الملف بسهوله
هناك مثالان في الملف المرفق

السلام عليكم ورحمة الله وبركاته

اخي هل يمكنك شرح الكود سطر سطر ووضع تعليق لكل سطر بالانجليزية , ان كان وقتك يسمح للشرح فأتمنى ان يكون درس مفصل حتى استطيع الفهم
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
[-] كل من 1 user says قال شكرا ل ELARAPY على المشاركة المفيدة
  • Ndagor
الرد
#8
لقد قمت بتبسيط الكود ليسهل عليك فهمه و اضفت بعض التعليقات ..بانجليزيتي البسيطة..
بعد فتح الملف يمكن معاينة اي جزء من الملف و ذلك بتحديد العنوان و حجم البيانات المراد معاينتها و يمكن تعديلها ثم تسجيل كل ذلك ..يمكن ايضا اجراء بحث عن قيمة محددة..

يمكن مواصلة التعليق على هذا الرابط المتعلق بالموضوع ..

https://delphi4arab.net/forum/showthread...8#pid55848
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد
#9
برك الله فيك اخي الكريم 

اريد البحث عن 5 قيم والقيم يختلف عنونها في الملف

واريد استبدلها  بقيم اخرى 

3D1020 = FDCD10
3E1020 = FECD10
3F1020 = FFCD10

3C1020 = FCCD10
3D1020 =FDCD10

سارفق لك ملف المراد تعديل عليه واماكن التعديل لو سمحت


الملفات المرفقة
.png   Capture d’écran 2022-12-08 201137.png (الحجم : 14.74 ك ب / التحميلات : 10)
.png   Capture d’écran 2022-12-08 201112.png (الحجم : 19.19 ك ب / التحميلات : 8)
.rar   210131.rar (الحجم : 1.9 ك ب / التحميلات : 3)
.rar   DrawGrid.rar (الحجم : 6.95 ك ب / التحميلات : 6)
الرد
#10
تمت اضافة دالة  ReplaceHex لعمليات تغيير المحتوى سواء يدويا باستعمال زر Replace او اليا يمكن كتابة الكود العملية استبدال عدة قيم على الشكل التالي: 


كود :
procedure TForm1.Button3Click(Sender: TObject);
begin
  ReplaceHex('3D1020','FDCD10');
  ReplaceHex('3E1020','FECD10');
  ReplaceHex('3F1020','FFCD10');
  ReplaceHex('3C1020','FCCD10');
  ReplaceHex('3D1020','FDCD10');
end;

ان كنت مهتم فقط بعملية استبدال القيم يمكنك عزل الكود المهم
لتتمكن من فهمه واستخدامه بسهولة في مشروعك:

كود :
function HexToArray(const AHexStr:string):TBytes; // convert Hex to Binary data
var
  I, LenB: Integer;
  sStr:string;
begin
    Result :=nil;
    sStr :='';
    for I := 1 to Length(AHexStr) do  // delete any white character to pack hex txt
    begin                             // E4 56 77 .. => E45677
        if AHexStr[I] > ' '  then
          sStr := sStr + AHexStr[I];
    end;

   if Odd(Length(sStr)) then // Length of sStr must be even
      raise Exception.Create('Text Hex invalide :'+ AHexStr );

   LenB := Length(sStr) div 2;// binary length is half of Hex string
   Setlength(Result,LenB); // new binary buffer
   HexToBin(PWideChar(sStr),PAnsiChar(Result),LenB);// convert hex to bin
end;

function TForm1.BinFind(const Arr: array of byte; AStart:integer):integer;
var
  I,LenB : Integer;
begin
  Result := -1;
  LenB :=Length(Arr);
  if LenB = 0 then
     Exit;
  for I := AStart to MStream.Size-LenB do
  begin
    if (MStream.Bytes[I] = Arr[0]) then //Compare first char if matched compare the rest by CompareMem
      if CompareMem(@Arr[0],@MStream.Bytes[I],LenB) then
         Exit(I);   // return found position
  end;
end;

function TForm1.ReplaceHex(const AHex,AHexRep:string;ReplaceAll:boolean;AStart:integer):integer;
var
  Bin,Rep:TBytes;
  Pz:integer;
begin
   Bin:= HexToArray(AHex);
   Rep:= HexToArray(AHexRep);
   if Length(Bin)<> Length(Rep) then
      raise Exception.Createfmt('Donnée de longueur différente "%s" "%s"',[AHex,AHexRep]);
   if ReplaceAll  then
      AStart :=0;
   Pz:=AStart;
   Result := 0;
   repeat
      Pz:=BinFind(Bin, Pz);
      if Pz <>-1 then // remplacer
      begin
        Move(Rep[0],MStream.Bytes[Pz],Length(Rep));
        Pz := Pz + Length(Bin);
        inc(Result);
      end;
   until not ReplaceAll or ( Pz = -1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    ReplaceHex('3D1020','FDCD10');
    ReplaceHex('3E1020','FECD10');
    ReplaceHex('3F1020','FFCD10');
    ReplaceHex('3C1020','FCCD10');
    ReplaceHex('3D1020','FDCD10');
end;
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد


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


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