ما هي الملفات و كيف نتعامل معها ؟؟
#51
السلام عليكم ورحمة الله وبركاته

جزاك الله خيراً اخي الحبيب, اتضحت بعض الامور لدي بارك الله فيك.

- ما فهمته بالنسبة لنوع سالب وموجب انه احياناً استخدم دالة ترجع صفر او -1 حال تحققها من عدم وجود عنصر ابحث عنه وبالتالي يجب استخدام نوع متغير سالب حتى اتحقق من النتيجة المرجعة.

- بالنسبة للملاحظة TFileStream لعدم المقدرة على تغير قيمة واحدة وكأن عملية التغير تحتاج الى فتح و Flush لكل تغير مما يتسبب في البطء, انا فهمتها نسبياً ولكن لا بأس.

- والمقارنة للثلاث انواع جميلة وواضحة ولكنها قريبة جداً من بعضها , السؤال هل الانواع الثلاثة لها نفس الدوال ؟

معذرةً اخي انا اعلم اني ارهق الجميع ولكني اريد التعلم.
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
[-] كل من 1 user says قال شكرا ل ELARAPY على المشاركة المفيدة
  • Ndagor
الرد
#52
السلام عليكم

إقتباس :- ما فهمته بالنسبة لنوع سالب وموجب انه احياناً استخدم دالة ترجع صفر او -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 := 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));
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد
#53
ما شاء الله تبارك الله , اسال الله ان يبارك لك ويزدك من فضله وان يفتح لك من ابواب الخير الكثير

ان شاء الله وقت الاجازة من العمل سوف اقوم بالتجربة ومحاولة التعمق, شكرا اخي الحبيب.
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم