![]() |
|
add array of byte - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : add array of byte (/showthread.php?tid=8428) |
add array of byte - mohamed49 - 01-03-2017 السلام عليكم اريد ارسال integer و array of byte باستخدام هذه الوحدة وعجزت صراحة عن تعديلها فارجوا تعديلها مع شرح بسيط حتى استطيع تعديلها حسب الحاجة بارك الله فيكم هذه هي الوحدة unit shared; interface uses Windows; type TSettings = record Msg: array of string; test1:array [0..32767] of Byte; test2:array [0..32767] of Byte; i:integer; end; PSettings = ^TSettings; const RC_SETTINGS = 'CFG'; function WriteSettings(Filename: PChar; Settings: PSettings): Boolean; function ReadSettings(var Settings: PSettings): Boolean; implementation function WriteSettings(Filename: PChar; Settings: PSettings): Boolean; var hResource: Thandle; begin Result := False; hResource := BeginUpdateResource(Filename, False); if hResource <> 0 then begin if UpdateResource(hResource, RT_RCDATA, RC_SETTINGS, 0, @Settings.Msg[1], PDWORD(DWORD(Settings.Msg) - 4)^ + 1) then Result := True; EndUpdateResource(hResource, False); end; end; function ReadSettings(var Settings: PSettings): Boolean; var hResInfo: HRSRC; hRes: HGLOBAL; begin Result := False; hResInfo := FindResource(hInstance, RC_SETTINGS, RT_RCDATA); if hResInfo <> 0 then begin hRes := LoadResource(hInstance, hResInfo); if hRes <> 0 then begin New(Settings); Settings^.Msg := PChar(LockResource(hRes)); Result := True; end; end; end; end. RE: add array of byte - Agmcz - 01-03-2017 وعليكم السلام أخي لقد سبق وطرحت http://delphi4arab.net/forum/showthread.php?tid=8397 لو وضعت ردك هناك لكان أفضل إذا كنت تريد تعديلها حسب حاجتك يجب ان تفهم ما يدور حولك أظنك تواجه مشكلة مع string يجب ان تعرف كيف تتعامل مع هذا النوع وما شابهه RE: add array of byte - mohamed49 - 01-03-2017 نعم كذلك اخي لكن لو تتكرم اريد تعديله ليقبل هذه المتغيرات بارك الله فيك RE: add array of byte - Agmcz - 03-03-2017 تفضل أخي لا تعتمد على هاتين دالتين لإني كتبتهم الان و توجد بهم بعض الأخطاء واعد كتابتهم بالدلفي function amzStrLn(const Arr: array of string): Integer; procedure amzStrMv(Dst: Pointer; const Src: array of string); الدالة amzStrLn تقوم بحساب طول السلاسل النصية مع بعض مع إضافة بايت لكل سلسلة والذي يعني null terminted وهو نهاية السلسلة اما amzStrMv تقوم بنسخ السلاسل ووضعهم بالترتيب لتسهيل عملية كتابتها كود : unit shared;
interface
uses
Windows;
type
TSettings = record
Msg: array of string;
test1: array[0..32767] of Byte;
test2: array[0..32767] of Byte;
i: integer;
end;
PSettings = ^TSettings;
const
RC_SETTINGS = 'CFG';
function WriteSettings(Filename: PChar; Settings: PSettings): Boolean;
function ReadSettings(var Settings: PSettings): Boolean;
implementation
function amzStrLn(const Arr: array of string): Integer;
{by Agmcz}
asm
push esi
push ebx
push edx
push ecx
xor ecx, ecx
xor edx, edx
mov esi, [eax]
mov ebx, [eax - 4]
@@loop:
inc ecx
add edx, [esi - 4]
inc edx
mov esi, [eax + ecx * 4]
cmp ecx, ebx
jne @@loop
mov eax, edx
pop ecx
pop edx
pop ebx
pop esi
end;
procedure amzStrMv(Dst: Pointer; const Src: array of string);
{by Agmcz}
asm
push edi
push esi
push ecx
push ebx
xor ebx, ebx
xor ecx, ecx
@@loop:
lea edi,[eax]
mov esi,[edx + ebx * 4]
lea esi,[esi]
mov ecx, [esi-4]
inc ecx
add eax, ecx
rep movsb
inc ebx
cmp ebx, [edx - 4]
jne @@loop
pop ebx
pop ecx
pop esi
pop edi
end;
function WriteSettings(Filename: PChar; Settings: PSettings): Boolean;
var
hResource: Thandle;
pBuffer: PByte;
Size, Len: DWORD;
begin
Result := False;
hResource := BeginUpdateResource(Filename, False);
if hResource <> 0 then
begin
Size := 4 + amzStrLn(Settings^.Msg) + SizeOf(TSettings) - 4;
GetMem(pBuffer, Size);
Len := Length(Settings^.Msg);
CopyMemory(pBuffer, @Len, 4);
Inc(pBuffer, 4);
amzStrMv(pBuffer, Settings^.Msg);
Inc(pBuffer, amzStrLn(Settings^.Msg));
CopyMemory(pBuffer, @Settings^.test1, SizeOf(TSettings) - 4);
Inc(pBuffer, SizeOf(TSettings) - 4);
Dec(pBuffer, Size);
if UpdateResource(hResource, RT_RCDATA, RC_SETTINGS, 0, pBuffer, Size) then
Result := True;
EndUpdateResource(hResource, False);
FreeMem(pBuffer);
end;
end;
function ReadSettings(var Settings: PSettings): Boolean;
var
hResInfo: HRSRC;
hRes: HGLOBAL;
I, Len: Integer;
pBuffer: PByte;
begin
Result := False;
hResInfo := FindResource(hInstance, RC_SETTINGS, RT_RCDATA);
if hResInfo <> 0 then
begin
hRes := LoadResource(hInstance, hResInfo);
if hRes <> 0 then
begin
pBuffer := LockResource(hRes);
CopyMemory(@Len, pBuffer, 4);
Inc(pBuffer, 4);
New(Settings);
SetLength(Settings^.Msg, Len);
for I := 0 to Len - 1 do
begin
Settings^.Msg[I] := PChar(pBuffer);
Inc(pBuffer, Length(Settings^.Msg[I]) + 1);
end;
CopyMemory(@Settings^.test1, pBuffer, SizeOf(TSettings) - 4);
Result := True;
end;
end;
end;
end.RE: add array of byte - mohamed49 - 03-03-2017 جزاك الله خيرا اخي انا والله حاولت كثيرا قبل ان اطرح المشكلة ولم افلح ساجرب هذه الوحدة بارك الله فيك واعذرني على تعبك الله يحفظك |