easyDelphi Q&A
+3 تصويتات
72 مشاهدات
سُئل في تصنيف Delphi بواسطة (5,760 نقاط) | 72 مشاهدات
 

3 إجابة

+1 تصويت
تم الرد عليه بواسطة (6,370 نقاط)
شكرا على الاجابة .... لكن المثال هاذا غير جيد مع ProgressBar يتشنج البرنامج الى غاية التحميل وكان ال IDhttp لايستعمل Thread !! ... في هذه الحالة استعمل الدالة URLDownloadToFile مع عدم وجود ProgressBar  أفضل بكثير .
+1 تصويت

اذا كنت تملك مكونات clever internet suite  (تحتوي على مجموعة رائعة قمت باستعمالها من قبل )

هذا مثال لتحميل ملف يستخدم الخيوط Threads

 

type
    TMyDownloadThread= Class(TThread)
    private
        FUrl: String;
        FFileName: String;
        FProgressHandle: HWND;
        procedure GetFile (Url: String; Stream: TStream; ReceiveProgress: TclSocketProgressEvent);
        procedure OnReceiveProgress(Sender: TObject; ABytesProceed, ATotalBytes: Integer);
        procedure SetPercent(Percent: Double);
    protected
        Procedure Execute; Override;
    public
        Constructor Create(Url, FileName: String; PrograssHandle: HWND);
    End;

implementation

constructor TMyDownloadThread.Create(Url, FileName: String; PrograssHandle: HWND);
begin
    Inherited Create(True);
    FUrl:= Url;
    FFileName:= FileName;
    FProgressHandle:= PrograssHandle;
    Resume;
end;


procedure TMyDownloadThread.GetFile(Url: String; Stream: TStream; ReceiveProgress: TclSocketProgressEvent);
var
    Http: TclHttp;
begin
    Http := TclHTTP.Create(nil);
    try
        try
            Http.OnReceiveProgress := ReceiveProgress;
            Http.Get(Url, Stream);
        except
        end;
    finally
        Http.Free;
    end;
end;

procedure TMyDownloadThread.OnReceiveProgress(Sender: TObject; ABytesProceed, ATotalBytes: Integer);
begin
    SetPercent((ABytesProceed / ATotalBytes) * 100);
end;

procedure TMyDownloadThread.SetPercent(Percent: Double);
begin
    PostMessage(FProgressHandle, AM_DownloadPercent, LowBytes(Percent), HighBytes(Percent));
end;

procedure TMyDownloadThread.Execute;
var
    FileStream: TFileStream;
begin
    FileStream := TFileStream.Create(FFileName, fmCreate);
    try
        GetFile(FUrl, FileStream, OnReceiveProgress);
    finally
        FileStream.Free;
    end;        
end;

 

تم الرد عليه بواسطة (7,660 نقاط)
0 تصويتات

مع المكون IdHTTP  الموجود ضمن مكتبة Indy التحميل سهل جدا و الربط مع ProgressBar  أسهل :

المكون IdHTTP يحتوي  على 3 أحداث مهمة و هي : 

   OnWorkBegin : عند بداية التحميل 

 OnWork : أثناء التحميل 

OnWorkEnd : عند نهاية التحميل 

يمكن أن نستغل هذه الأحداث لكتابة الأكواد التي تناسبنا

طريقة العمل : نظيف للمشروع : المكون IdHTTP ،  و  edit لكتابة رابط التحميل   و زر للتحميل     و     ProgressBar 

ثم الكود كاملا:

 // برمجة زر التحميل
procedure TForm1.DownloadClick(Sender: TObject);
 var fs:TFileStream;
begin
  fs:=TFileStream.Create('downloads\myfile.exe', fmCreate) ; //نحدد مسار الملف بعد التحميل
  IdHTTP1.Get(Edit1.Text,fs);
  fs.Free;
end;

// برمجة حدث بداية التحميل
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin

  ProgressBar1.Position:=0;
  ProgressBar1.Max:=AWorkCountMax;

end;

// برمجة حدث أثناء التحميل
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  ProgressBar1.Position:=AWorkCount;
  Application.ProcessMessages;  // refresh

end;

//برمجة حدث نهاية التحميل
procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
     IdHTTP1.Disconnect;
end;     

 

تم الرد عليه بواسطة (750 نقاط)
عُدل بواسطة
مشكلت idhttp انه لايعمل بالثريد ... قمت باضافته الى اجراء يعمل بالثريد اشتغل بعدها بشكل جيد .
idhttp موجود ضمن indy  و بمناسبة الثريد حسب مجلة دلفي لكل العرب العدد 4 تذكر أن indy مصمم ليعمل جيدا مع thread
وخوادمه لها ثريد منفصل عن الثريد الأساسي للبرنامج  
الشرح بالتفصيل موجود في  المجلة  أرجو الاطلاع عليه
رابط التحميل https://www.alarabimag.com/books/5415-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B9-%D9%85%D9%86-%D9%85%D8%AC%D9%84%D8%A9-%D9%85%D9%86%D8%AA%D8%AF%D9%89.html
بعد تجربة indy لا يعمل مع الثريد جيدا .... جرب ارسال ملف باستخدام socket ويحدث تشتنج للبرنامج كثيرا ... وجربت تحميل برنامج باستخدام IDhttp ونفس المشكل دائما يحدث تشنج .... لكن بعد ما عملت ثريد خاص بي حلت جميع المشاكل .... ساظع فيديو قريبا اريك فيه الفرق بينهما

اسئلة متعلقة

+1 تصويت
1 إجابة
سُئل يوليو 21 في تصنيف Delphi بواسطة Amar Gozim (5,760 نقاط) | 49 مشاهدات
+1 تصويت
1 إجابة
سُئل يوليو 22 في تصنيف Delphi بواسطة Amar Gozim (5,760 نقاط) | 35 مشاهدات
+3 تصويتات
2 إجابة
سُئل يونيو 28 في تصنيف Delphi بواسطة انسانية | 59 مشاهدات
+5 تصويتات
1 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

207 سؤال
391 إجابة
682 تعليق
118 مستخدم