02-12-2022, 06:15 PM
إقتباس :لماذا استخدم متغير سالب في حين اني استخدمه كادرريس ومن المفترض ان العناوين تكون تصاعديا بداية من ادريس صفر ؟
في الاصل لا مشكل ان كنت تعرف نوع الذي تتعامل معه لاخذ الاحتياطات المشكل عندما يتم اجراء عمليات مختلطة بين signed و unsigned تسبب مشاكل للبرنامج ...الدالفي يستعمل كذلك الموجب و السالب لتحديد عدد العناصر Count و Length بالرغم انها تعبر عن ارقام موجبة فقط.
في المثال التالي يبين احدى المشاكل عند البحث على عنصر في قائمة Lixtbox و تكون النتيجة سلبية 1- اي غير موجود ويتم حفظ هذه القيمة في المتغير Index الموجب فقط تتحول الى 255 و بالتالي تفشل المقارنة التي تاتي من بعد ..
كود :
var
Index:Byte;
..
begin
Index := Listbox1.Items.IndexOf('ououo');
if Index <> -1 then
begin
S:= Listbox1.Items[Index];
..TFileStream يتيح الولوج الى بيانات المخزنة التي يتم تحليلها و تحويلها مباشرة الى المتغيرات و المكونات المعنية في في البرنامج في عملية متسلسلة ..
هنالك ملاحظة في غاية الاهمية TFileStream ليس سريع في قراة او الكتابة مثل MemoryStream لا يمكن قيام بتغير قيمة ادريس واحد في كل عملية قراءة او كتابة هذه عملية مرهقة لقرص الصلب خاصة نوع HDD الافضل في هذه الحالة هو فتح الملف كله او الجزء المعني في الذاكرة للتعامل معه .. مثل حالتك.. هناك بديل له هو TBufferdFileStream يقوم بفتح جزئيا الملف في الذاكرة
كود مقارنة بين الانواع الثلاث يقوم يتسجيل قيم من 0 الى 99999 في ملف.
كود :
procedure TForm2.tFileStreamClick(Sender: TObject);
var
Fs:TFileStream;
I:integer;
begin
if not SaveDlg.Execute then
Exit;
Fs:=TFileStream.Create(SaveDlg.FileName,fmCreate);//fmCreate create new file ..if exist delete it
try
for I := 0 to 99999 do
begin
Fs.Write(I,SizeOf(I));
end;
finally
Fs.Free;
end;
Showmessage('ok');
end;
procedure TForm2.tBufferedStreamClick(Sender: TObject);
var
Fs:TBufferedFileStream;
I:integer;
begin
if not SaveDlg.Execute then
Exit;
Fs:=TBufferedFileStream.Create(SaveDlg.FileName,fmCreate,4096);//fmCreate create new file ..if exist delete it
try
for I := 0 to 99999 do
begin
Fs.Write(I,SizeOf(I));
end;
finally
Fs.Free;
end;
Showmessage('ok');
end;
procedure TForm2.tMemoryStreamClick(Sender: TObject);
var
Fs:TMemoryStream;
I:integer;
begin
if not SaveDlg.Execute then
Exit;
Fs:=TMemoryStream.Create();
try
for I := 0 to 99999 do
begin
Fs.Write(I,SizeOf(I));
end;
Fs.SaveToFile(SaveDlg.FileName);//save the file
finally
Fs.Free;
end;
Showmessage('ok');
end;إقتباس :اخيراً اخي وجدت في توثيق دلفي PByteArray مؤشر من نوع TByteArray جاهز للاستخدام , فلا احتاج الى تعريفه اليس كذلك؟
هو موجود لا داعي لاعادة تعريفه


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)