(09-12-2022, 02:11 PM)Ndagor كتب : [ -> ]تمت اضافة دالة ReplaceHex لعمليات تغيير المحتوى سواء يدويا باستعمال زر Replace او اليا يمكن كتابة الكود العملية استبدال عدة قيم على الشكل التالي:
بارك الله فيك اخي , ماشاء الله مجهود واهتمام كبير جزاك الله خيرا,
هل يمكن عمل درس كامل تفصيلي (صوت وصورة) يخص التعامل مع الهيكس ويتم طرحه في قسم
دروس دلفي للعرب ليشمل المبتدئ ويكون مرجعا للجميع ؟
يا اخي لا توجد ألغاز و شيء .. hex هو نص(بالنظام السداسي عشر) يظهر قيم محتوى binary .. و الدالة BinToHex تقوم بذلك لا اكثر ولا اقل..
يمكنك تحويل الملف الى مصفوفة array و لاجراء عمليات الأساسية: Delete لحذف جزء.. Insert لإضافة قيم جديدة و Move لاستبدال قيم باخرى و Copy لنسخ جزء من المصفوفة في اخرى جديدة.
بالنسبة لعملية البحث و الاستبدال هناك حلين اما تحويل مصفوفة الى نص Hex ثم اجراء عملية البحث باستعمال Pos و StringReplace للاستبدال... الحل الثانى هو كتابة دوال تقوم بالعمليتن مباشرة على المصفوفة و تعتبر هذه من تمارين البديهيات في الخوارزميات..
لكي تفهم جيدا عليك بالتجربة و عندما تواجه مشكل يمكنك الاستفسار عليه .
الف شكرا وعرفان لك اخي الكريم Ndagor علا المجهود الذي تبذله
بقيا لي في سورس عند اختيار الملف اريد ان يضهر في label حجم الملف مع العلم ان برنامجي لايقوم بملف واحد
له عددة احجام
مثلا الحجم اريده ان يضهر هكذا :2,00 Mo او 1,46 او Mo 1,46 Mo
واريد اضافة programme bar1
اريده يعمل مع TDRAWGRID
يعني عند منادة ملف يعمل PROGRAMME عند ملى TDRAWGRID يكون PROGRAMME BAR 100%100
بالنسبة لاظهار حجم الملف يمكنك استعمال كود الذي و جدته في النت
كود :
function FormatByteSize(const bytes: int64): string;
const
B = 1; //byte
KB = 1024 * B; //kilobyte
MB = 1024 * KB; //megabyte
GB = 1024 * MB; //gigabyte
begin
if bytes > GB then
result := FormatFloat('#.## GB', bytes / GB)
else if bytes > MB then
result := FormatFloat('#.## MB', bytes / MB)
else if bytes > KB then
result := FormatFloat('#.## KB', bytes / KB)
else
result := FormatFloat('#.## bytes', bytes);
end;
اضف في اخر سطر في الدالة Button1Click فتح الملف
كود :
Label3.Caption := FormatByteSize(MStream.Size);
بالنسبة ل ProgressBar اضافته لا تغير شيء لان فتح الملف سريع جدا يمكنه فتح ملف 10 ميغا في ثانية وهذه ليست مدة انتظار طويلة
اظهار قيم bin في Édit3 غير عملي و هناك احتمالية ان تظهر بقيم خاطئة و هذا هو الهدف من استعمال نص hex هناك حالات الحرف يحتوي على Byte واحد و اخرى على اثنين..و هناك قيملابجب استعمالهامثل 0
على كل حال راجع الامثلة السابقة المتعلقة ب Mémo
يمكنك استعمال الكود التالي و لكن عليك تحديد الطول الذي تريد اختياره في المثال Len تقوم باظهار 10 حروف
كود :
procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var
Pz,R,Len :integer;
S:Ansistring;
begin
Pz := (ARow-1) * 16 + (ACol-1);//cellule
if (Pz >= 0) and(Pz < MStream.Size) then
begin
OffsetEdit.Text := IntToHex(Pz,6);
Len :=10;
MStream.Position := Pz;
SetLength(S,Len);
R:= MStream.Read(Pointer(S)^,Len);
if R<>Len then
SetLength(S,R);
Edit3.Text := S;
end;
end;
هذا الكود خاطى
كود :
; Label3.Caption := FormatByteSize(MStream.Size)
الكود ليس خاطئ عليك اضافة الكود تعريف للدالة FormatByteSize
هذا هو الكود كامل حاول ان تفهمه
الف شكر وعرفان مني اليك اخي الكريم Ndagor لي المساعدة التى تقدمها لنا وفقك اللله بما يرضاه لك
اخي الكريم عندى سوال بسيط في السورس المرفق في خاصية ReplaceHex
تعمل بشكل جيد في برنامجي عند استبدال القيم وصلت الى منطقة في الملف كلها اصفار
واريد وضع قيم في العنوان 1FA340
اريد استبدال 3 اسطر تحتوى علا اصفار الى قيم
عندما استعمل الدلة ReplaceHex لاتذهب الى السطر الذي اريده
ارفقت لك صورة
ممكن كود لو سمحت