Jump to content

Adriaan

Members
  • Posts

    1
  • Joined

  • Last visited

Adriaan's Achievements

Newbie

Newbie (1/4)

0

Reputation

  1. I currently have a VCL form that downloads and extracts a file as soon as it's showed. I have tried converting it to UniGUI but I get the following problems: Progress bar doesn't work. The form caption does not update. It downloads the zip file but gets a access violation when it wants to extract the downloaded zip file. Here is my VCL form unit: unit uOxideModInstaller; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, System.Zip, ActiveX, IdSSLOpenSSL; type TDownload = class; Tfrmoxidemodinstaller = class(TForm) pb1: TProgressBar; btn1: TButton; procedure FormShow(Sender: TObject); procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TDownload = class(TThread) private httpclient: TIdHTTP; url: string; filename: string; maxprogressbar: integer; progressbarstatus: integer; procedure ExtractZip(ZipFile: string; ExtractPath: string); procedure idhttp1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); procedure idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); procedure UpdateProgressBar; procedure SetMaxProgressBar; protected procedure Execute; override; public constructor Create(CreateSuspended: boolean; aurl, afilename: string); destructor Destroy; override; end; var frmoxidemodinstaller: Tfrmoxidemodinstaller; implementation {$R *.dfm} { Thread } constructor TDownload.Create(CreateSuspended: boolean; aurl, afilename: string); begin inherited Create(CreateSuspended); httpclient := TIdHTTP.Create(nil); httpclient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(httpclient); httpclient.HandleRedirects := True; httpclient.OnWorkBegin := idhttp1WorkBegin; httpclient.OnWork := idhttp1Work; url := aurl; filename := afilename; end; procedure TDownload.idhttp1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin progressbarstatus := AWorkCount; Queue(UpdateProgressBar); end; procedure TDownload.idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin maxprogressbar := AWorkCountMax; Queue(SetMaxProgressBar); end; procedure TDownload.Execute; var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try httpclient.Get(url, Stream); Stream.SaveToFile(filename); frmoxidemodinstaller.Caption := 'Done Downloading. Extracting...'; //Sleep(2000); ExtractZip('oxide.zip', GetCurrentDir); finally Stream.Free; end; end; procedure TDownload.UpdateProgressBar; var ZipFile: string; begin frmoxidemodinstaller.pb1.Position := progressbarstatus; frmoxidemodinstaller.Caption := 'Downloading...'; { if frmextradownload.pb1.Position = frmextradownload.pb1.Max then begin frmextradownload.Caption := 'Done Downloading. Extracting...'; Sleep(2000); ExtractZip('files.zip', GetCurrentDir); end; } end; procedure TDownload.SetMaxProgressBar; begin frmoxidemodinstaller.pb1.Max := maxprogressbar; end; destructor TDownload.Destroy; begin FreeAndNil(httpclient); inherited Destroy; end; procedure TDownload.ExtractZip(ZipFile, ExtractPath: string); begin if TZipFile.IsValid(ZipFile) then begin TZipFile.ExtractZipFile(ZipFile, ExtractPath); DeleteFile(ZipFile); DeleteFile('HashInfo.txt'); DeleteFile('OpenSSL License.txt'); DeleteFile('openssl.exe'); DeleteFile('ReadMe.txt'); frmoxidemodinstaller.Caption := 'Done.'; frmoxidemodinstaller.btn1.Enabled := True; end else begin frmoxidemodinstaller.Caption := 'Error Extracting files'; end; end; procedure Tfrmoxidemodinstaller.btn1Click(Sender: TObject); begin Close; end; procedure Tfrmoxidemodinstaller.FormShow(Sender: TObject); var DownloadThread: TDownload; link: string; begin pb1.Position := 0; btn1.Enabled := False; frmoxidemodinstaller.Caption := 'Starting Download...'; link := 'https://bintray.com/oxidemod/builds/download_file?file_path=Oxide-Rust.zip'; DownloadThread := TDownload.Create(true, link, 'oxide.zip'); DownloadThread.FreeOnTerminate := true; DownloadThread.Start; end; end. Here is the form unit I made for UniGUI: (I removed the button) unit uOxideModInstaller; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIForm, uniGUIBaseClasses, uniProgressBar, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, System.Zip, ActiveX, IdSSLOpenSSL; type TDownload = class; Tfrmoxidemodinstaller = class(TUniForm) pb1: TUniProgressBar; procedure UniFormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; TDownload = class(TThread) private httpclient: TIdHTTP; url: string; filename: string; maxprogressbar: integer; progressbarstatus: integer; procedure ExtractZip(ZipFile: string; ExtractPath: string); procedure idhttp1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); procedure idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); procedure UpdateProgressBar; procedure SetMaxProgressBar; protected procedure Execute; override; public constructor Create(CreateSuspended: boolean; aurl, afilename: string); destructor Destroy; override; end; function frmoxidemodinstaller: Tfrmoxidemodinstaller; implementation {$R *.dfm} uses MainModule, uniGUIApplication; function frmoxidemodinstaller: Tfrmoxidemodinstaller; begin Result := Tfrmoxidemodinstaller(UniMainModule.GetFormInstance(Tfrmoxidemodinstaller)); end; { Thread } constructor TDownload.Create(CreateSuspended: boolean; aurl, afilename: string); begin inherited Create(CreateSuspended); httpclient := TIdHTTP.Create(nil); httpclient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(httpclient); httpclient.HandleRedirects := True; httpclient.OnWorkBegin := idhttp1WorkBegin; httpclient.OnWork := idhttp1Work; url := aurl; filename := afilename; end; procedure TDownload.idhttp1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin progressbarstatus := AWorkCount; Queue(UpdateProgressBar); end; procedure TDownload.idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin maxprogressbar := AWorkCountMax; Queue(SetMaxProgressBar); end; procedure TDownload.Execute; var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try httpclient.Get(url, Stream); Stream.SaveToFile(filename); frmoxidemodinstaller.Caption := 'Done Downloading. Extracting...'; ExtractZip('oxide.zip', GetCurrentDir); finally Stream.Free; end; end; procedure TDownload.UpdateProgressBar; var ZipFile: string; begin frmoxidemodinstaller.pb1.Position := progressbarstatus; frmoxidemodinstaller.Caption := 'Downloading...'; end; procedure TDownload.SetMaxProgressBar; begin frmoxidemodinstaller.pb1.Max := maxprogressbar; end; destructor TDownload.Destroy; begin FreeAndNil(httpclient); inherited Destroy; end; procedure TDownload.ExtractZip(ZipFile, ExtractPath: string); begin if TZipFile.IsValid(ZipFile) then begin TZipFile.ExtractZipFile(ZipFile, ExtractPath); DeleteFile(ZipFile); DeleteFile('HashInfo.txt'); DeleteFile('OpenSSL License.txt'); DeleteFile('openssl.exe'); DeleteFile('ReadMe.txt'); frmoxidemodinstaller.Caption := 'Done.'; frmoxidemodinstaller.Close; end else begin frmoxidemodinstaller.Caption := 'Error Extracting files'; end; end; procedure Tfrmoxidemodinstaller.UniFormShow(Sender: TObject); var DownloadThread: TDownload; link: string; begin pb1.Position := 0; frmoxidemodinstaller.Caption := 'Starting Download...'; link := 'https://bintray.com/oxidemod/builds/download_file?file_path=Oxide-Rust.zip'; DownloadThread := TDownload.Create(true, link, 'oxide.zip'); DownloadThread.FreeOnTerminate := true; DownloadThread.Start; end; end.
×
×
  • Create New...