السلام عليكم
إقتباس :- ما فهمته بالنسبة لنوع سالب وموجب انه احياناً استخدم دالة ترجع صفر او -1 حال تحققها من عدم وجود عنصر ابحث عنه وبالتالي يجب استخدام نوع متغير سالب حتى اتحقق من النتيجة المرجعة.
المشكلة مع القيم السلبية اما الصفر هو عنصر صحيح في اي قائمة يمثل العنصر الاول ..
إقتباس :- والمقارنة للثلاث انواع جميلة وواضحة ولكنها قريبة جداً من بعضها
الفروقات ليست واضحة لان كمية البيانات صغيرة لو كانت عشرات او مئات الميغابيت يصبح الفرق واضح و على حسب نوع الهارد ديسك ...
إقتباس :, السؤال هل الانواع الثلاثة لها نفس الدوال ؟
للإجابة على السؤال ينبغي ان تكون لك معرفة و لو بسيطة بعمل class و و خاصية inheritance(التوريث او التوارث او شى من هذا القبيل )
هنا جوهر استخدام class ان تكون الدوال و بعض العناصر قابلة للتوريث لتصبح مشتركة لتسهيل البرمجة و لاعادة صياغة كود موجود جزئيا او كليا وفق الحاجة...هذه الانواع الثلاثة تنحدر من TStream و ترث جميع دوال و العناصر الموجودة فيه Write, Read, Size, Position
TStream هو مجرد تعريف و برتوكول لايمكن استخدامه كما هو و اذا القيت نظرة على الدوال الموجودة فيه :
كود :
...
function GetSize: Int64; virtual;
procedure SetSize(const NewSize: Int64); overload; virtual;
public
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; virtual; // Position
...
virtual معناه يمكن اعادة كتابة كود لهذه الدالة
abstract دالة مجردة و لا تحتوي اي كود
معناه ان هذا الكلاس مجرد قوقعة فارغة و على الكلاس المشتقة و المنبثقة عنه صياغة كود للهذه الدوال للتعامل مع الذاكرة في حالة TMemoryStream و وللتعامل مع الملفات في حالة TFileStream ...
لا يقتصر استخدام بروتوكل TStream لعملية التخزين فقط انما يشمل اي عملية تخص نقل او انتقال او تحويل البيانات داخليا بين اكواد الدالفي لتسهيل التعامل فيما بينها و خارجيا لتبادل مع الوندوز او برامج خارجية... قد تجد انواع ستريم وسيطة مثال بدلا من الكتابة مباشرة في ملف يمكن استعمال كلاس TCompressionStream لضغط البيانات قبل ارسالها الى الملف TFileStream
ليس بضرورة ان يتم صياغة كود للعمليات الاربعة Write, Read, Size, Position انما على حسب نوع الكلاس و عمله و ربما يمنع بعض العمليات و هذا هو الشائع
TCompressionStream يتيح الكتابة فقط و لا يسمح باستعمال Position الا في عناوين محددة ... ببساطة لانك لاتحتاج الى عملية القراءة اثناء عملية ضغط البيانات ... و الكلاس TDecompressionStream يقوم بالعكس اي القراءة فقط...
كود ضغط بيانات
PHP كود :
uses zlib; // Unit to use TCompressionStream
.....
var
Fs:TFileStream;
zComp:TCompressionStream;// compression stream
I:integer;
begin
if not SaveDlg.Execute then
Exit;
Fs:=TFileStream.Create(SaveDlg.FileName,fmCreate);//fmCreate create new file ..if exist delete it
try
zComp:=TCompressionStream.Create(clDefault,Fs);// compression ratio & destination
for I := 0 to 99999 do
begin
zComp.Write(I,SizeOf(I)); // compress & write
end;
finally
zComp.Free;
Fs.Free;
end;
Showmessage('ok');
end;
....
المثال الاول لايعمل لان المتغير St يستعمل دوال TSream التي لا يحتوي كود للعمليات الكتابة و القراءة
كود :
var
I:integer;
St:TStream;
begin
St:=TStream.Create;
I:=44;
St.Write(I,SizeOf(I)); // abstract error
المثال الثانى St يستعمل دوال و تعريفات TMemoryStream و هي صحيحة و تعمل.
كود :
var
I:integer;
St:TStream;
begin
St:=TMemoryStream.Create;
I:=44;
St.Write(I,SizeOf(I));