![]() |
|
خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير (/showthread.php?tid=11728) |
خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 29-12-2021 السلام عليكم ورحمة الله وبركاته هذه الدالة تعمل جيداً حين اكتب القيمة المرجعة بدالة مماثلة الى ملف ولكن عندما حاولت اظهار القيمة المرجعة بكل الطرق لم استطع , المشكلة القيمة المرجعة دائما هي القيمة المدخلة لبراميتر الطول Length فاين المشكلة. كود : function Search_(const FileName: string; Offset: DWORD; Length: DWORD; out bArray: ByteArray): Integer;
var
MS : TMemoryStream;
begin
MS := TMemoryStream.Create;
try
MS.LoadFromFile(FileName);
MS.Position := Offset;
SetLength(bArray, Length);
Result := MS.Read(bArray[0], Length);
finally
MS.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
bArray : ByteArray;
str : string;
i : integer;
begin
str :='';
//str := Search_('j:\Test.hex', $3d3, $f, bArray).ToHexString;
i := Search_('j:\Test.hex', $3d3, $f, bArray);
// Memo1.Lines.Add(str);
Memo1.Lines.Add(IntToStr(i));
end;هذا فقط لتوضيح المشكلة ولكن في الاصل احاول ان اتحقق من محتوى المصفوفة Result := MS.Read(bArray[0], Length); بجملة الشرط if لتغير مسار البرنامج. RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - Agmcz - 29-12-2021 السلام عليكم تحقق بإستخدام الدالة CompareMem RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 29-12-2021 (29-12-2021, 02:32 PM)Agmcz كتب : السلام عليكم وعليكم السلام ورحمة الله وبركاته اولا انا بشكرك جدا اخي الحبيب من قلبي والله لانك علمتني التعامل مع التدفق ثانيا ان شاء الله ساجرب واوافيك الرد , جزاك الله خيرا اخي احبك في الله . RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 31-12-2021 (29-12-2021, 02:32 PM)Agmcz كتب : السلام عليكم السلام عليكم ورحمة الله وبركاته اخي لم استطع تمرير مصفوفات الى الدالة ولم اجد لها امثلة كافية الا مثال واحد يقارن بين ملفين, هل من مثال توضيحي لكيفية التعامل مع المصفوفات او مرجع يساعدني في تعلمه, كل ما احتاج فعله هو التحقق من قيمة محددة في عنوان محدد بطول محدد حتى يتحقق برنامجي انه الملف الصحيح للتعديل عليه او يرسل رسالة بانه ملف غير صالح. في بداية الامر حاولت التحقق من المصفوفة بعد تعبئتها بالقيمة داخل دالة القراءة حتى لا انشئ دالة اخرى . توجد صورة مرفقة ارجوا التوضيح وجزاك الله خيرا. RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - I3CT - 31-12-2021 و عليكم السلام و رحمة الله إقتباس :كل ما احتاج فعله هو التحقق من قيمة محددة في عنوان محدد بطول محدد حتى يتحقق برنامجي انه الملف الصحيح للتعديل عليه او يرسل رسالة بانه ملف غير صالح.توجد عدة طرق برمجية و ابسطها: PHP كود : procedure TPoC.CheckBtnClick(Sender: TObject);
RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 08-01-2022 السلام عليكم ورحمة الله وبركاته اولا اعتذر لتأخيري في متابعة طلبي على المنتدى وذلك لاني والحمد لله مرضت قليلاً. ثانيا إجراء التحقق يعمل كما ارسله الاستاذ I3CT لكني عدلت عليه حتى يقوم باختبار ملفين وليس ملف واحد فاصبح هناك مشكله ان الاجراء لا يقبل MessageBoxA(Handle, لماذا لا ادري , فهل يمكنني ارسال كود الوحدة كاملاً حتى يتم وضع ملاحظات من حضراتكم حتى استفيد منها ؟ للعلم الملف الذي اقوم بالتعديل عليه خاص بجهاز dvr حيث اني قمت بقراءة وحفظ نسخة من سوفت وير هذا الجهاز ولكن المشكله عند كتابة هذا الملف على جهاز اخر نفس النوع ونفس الهاردوير يفتح الجهاز ولكن تظهر رسالة ان السيريال غير صحيح ويجب ان ارجع للبائع فقمت بالتجربة على ملفين مختلفين لنفس نوعية الجهاز حتى حصلت على العنوان الذي يحوي معلومات التشفير الخاصة بالهاردوير فقمت بنسخها من سوفتوير الجهاز القديم وكتبت تلك الكتلة من البيانات الى الملف الجديد ثم كتب الملف الجديد الى الجهاز فعمل جيداً وبقيت مشكلة اخرى لا تهمني كثيراً . انا اوضحت الموضوع كله لأوضح انني استطيع حل مشكلتي ببرنامج الهيكس ورك شوب فقط ولكني اتخذتها فرصة حتى اجرب ان اتعلم دلفي على اشياء تفيد عملي حتى اشعر بلذة النتيجة وايضا حتى تقابلني مشاكل اثناء البرمجة كي اتعلم عملي . كود الوحدة اعلم ان به بعض الاخطاء ولكن ماذا يجب علي فعله لتحسين الكود ؟ كود : unit UnitMain;
interface
uses
System.SysUtils, Vcl.Graphics, Vcl.Forms, Winapi.Windows,
Vcl.Dialogs, Vcl.Controls, Vcl.StdCtrls, System.Classes, Winapi.Messages, System.Variants;
type
TForm2 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
btnModify: TButton;
Label1: TLabel;
btnSelectWorkFile: TButton;
btnSelectBadFile: TButton;
Label2: TLabel;
Label3: TLabel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
lblAuthor: TLabel;
procedure btnModifyClick(Sender: TObject);
procedure btnSelectWorkFileClick(Sender: TObject);
procedure btnSelectBadFileClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
// procedure btnModifyExit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
uses unitLogin;
Type
ByteArray = array of Byte;
//=============================================
procedure notCorrectFile(okFile, badFile: string; var isErr: Boolean);
var
MS1, MS2: TMemoryStream;
okFileVal, badFileVal: integer;
begin
MS1 := TMemoryStream.Create;
MS2 := TMemoryStream.Create;
try
MS1.LoadFromFile(okFile);
MS1.Seek($00FE0008, soFromBeginning);
MS1.Read(okFileVal, 3);
MS2.LoadFromFile(badFile);
MS2.Seek($00FE0008, soFromBeginning);
MS2.Read(badFileVal, 3);
if IntToHex(okFileVal, 3) <> '304D43' then
begin
ShowMessage('Choose correct work file for Tdvr4i !');
isErr := True
end
else if IntToHex(badFileVal, 3) <> '304D43' then
begin
ShowMessage('Choose correct bad file for Tdvr4ii !');
isErr := True;
end
else
finally
begin
MS1.Free;
MS2.Free;
end;
end;
end;
//==============================================================================
function read_(FileName : string; Offset : DWORD; Length : DWORD; out bArray : ByteArray): Integer;
var
MS : TMemoryStream;
begin
MS := TMemoryStream.Create;
try
MS.LoadFromFile(FileName);
MS.Position := Offset;
SetLength(bArray, Length);
Result := MS.Read(bArray[0], Length);
finally
MS.Free;
end;
end;
//==============================================================================
function write_(FileName : string; Offset : DWORD; var bArray : ByteArray): Integer;
var
MS : TMemoryStream;
begin
Result := 0;
MS := TMemoryStream.Create;
try
MS.LoadFromFile(FileName);
MS.Position := Offset;
Result := MS.Write(bArray[0], Length(bArray));
MS.SaveToFile(fileName);
finally
MS.Free;
end;
end;
//==============================================================================
procedure TForm2.btnSelectWorkFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text := OpenDialog1.FileName;
end;
end;
//==============================================================================
procedure TForm2.btnSelectBadFileClick(Sender: TObject);
begin
if OpenDialog1.Execute() then
begin
Edit2.Text := OpenDialog1.FileName;
end;
end;
//==============================================================================
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate;
end;
//==============================================================================
procedure TForm2.btnModifyClick(Sender: TObject);
var
err : Boolean;
i : integer;
bArray: ByteArray;
okFile, badFile : string;
begin
okFile := Edit1.Text;
badFile := Edit2.Text;
try
if not FileExists(okFile) then
ShowMessage('Please select working file!')
else if not FileExists(badFile) then
ShowMessage('Please select bad file!')
finally
err := False;
end;
try
notCorrectFile(okFile, badFile, err);
if err then
Exit;
read_(okFile, $FDFFF0, $1de, bArray);
write_(badFile, $FDFFF0, bArray);
lblAuthor.Visible := False;
for i := 0 to 2 do
begin
Label1.Visible := True;
application.ProcessMessages;
sleep(400);
Label1.Visible := False;
application.ProcessMessages;
sleep(400);
end;
lblAuthor.Visible := True;
application.ProcessMessages;
Sleep(1000);
Application.Terminate;
except
ShowMessage('There''s been a problem!');
end;
end;
end. |