Crear un status.dialog para una descarga

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola a todos, pues para ser breve soy nuevo en el AMS y tengo algunas dudas y problemas a la hora de hacer mi poyecto; el cual se podria decir que es un TEU, pero online.. donde pondre botones de los programas y al dar click en ellos me descargue el archivo (por ahora son url de descargas directas de DRIVE) con todo y progess bar, label de MB descargados y MB restantes, etc y lo ejecute despues de la descarga.
Todo esto hecho dentro de una pagina y un boton.
Pues bien mi problema es que no logro poner un boton de "cancelar descarga" propiamente dicho. Lo mas cercano que puse fue un boton de Applicacion.Exit el cual cancela lo descargado e incluso borra el archivo, pero me deja inservible el boton del programa para una segunda descarga.
He visto en los foros de indigo que lo mas recomendable para el boton de cancelar descarga es crear un status.dlg con una funcion callback, mas no logro hacerlo andar juntos.
Por favor ayudadme. Y gracias de antemanos. Salu2!
PD: Disculpen si no me deje entender, adjunto el codigo que utilice para todo esto:
Esto puse en funciones globales

PWXMC="http://utilidadalmaximo.blogspot.pe/"
-------------------------------//-------------------------------------
--Función para descargar
function Downloadfile(nDownloaded, nTotal, TransferRate, SecondLeft, SecondLeftFormat, Message)
--nDownloaded = Cuanto va descargando
--nTotal= Peso en total del archivo
--TransferRate= Velocidad de transferencia actual en KB/s
--SecondLeft= Segundos restantes
--SecondLeftFormat= Segundos restantes en formato MM:SS
--Message= Dejar en blanco: ""
--POR AHORA: No logro hacer andar a SecondLeft y SecondLeftFormat

-- Trasforma el tamaño del archivo a MB's
sDownloaded = String.GetFormattedSize(nDownloaded, FMTSIZE_AUTOMATIC, true);
sTotal = String.GetFormattedSize(nTotal, FMTSIZE_AUTOMATIC, true);

-- Transforma lo descargado en "%" y luego
prange= (nDownloaded /nTotal) * 100;
ProgressRange= Math.Ceil(prange);

-- Rango barra de Progreso
Progress.SetRange("Progress_Download_Status", 0, 100);
Progress.SetCurrentPos("Progress_Download_Status", ProgressRange);


-- Muestra el tamaño total de la descarga y lo que se ha descargado
Label.SetText("Label_Downloaded", sDownloaded);
Label.SetText("Label_Total", sTotal);
minusone=Label.SetText("Label_ProgressDownloaded", ProgressRange.."% Descargado");

if ProgressRange <0.5 then
Label.SetVisible("Label_ProgressDownloaded", false)
end
if ProgressRange >0.5 then
Label.SetVisible("Label_ProgressDownloaded", true)
end
end
-------------------------------//-------------------------------------

Esto es lo que puse en el boton que utilizo para descargar:
-------------------------------------------------------------
Paragraph.SetVisible("Paragraph2", true);
Paragraph.SetText("Paragraph2", "Este es el instalador online, para los que cuenten con una conexion a internet.");
Label.SetVisible("Label1", true);
Label.SetVisible("Label_Downloaded", true);
Label.SetVisible("Label_Total", true);
-------------------------------//-------------------------------------
--Datos del archivo
URL = "https://files.avast.com/iavs9x/avast_fr ... online.exe"
sName = "avast_free_antivirus_setup_online.exe";


-- Ruta o directorio del archivo con nombre del archivo y extensión
savefile = _TempFolder.."\\avast_free_antivirus_setup_online.exe";

-- Descarga del archivo
HTTP.DownloadSecure(URL, savefile, MODE_BINARY, 0, 443, nil, nil, Downloadfile)
Completed = Label.GetText("Label_ProgressDownloaded");

--Obtener los códigos de error que pueden haber sido devueltos por la acción de descarga.
error = Application.GetLastError();
-- Si hay error durante la descarga.
if (Completed ~= '100% Descargado') then
showerror = Dialog.Message("Instalador TODO EN UNO", "La descarga no se completo. Intente nuevamente.", MB_OK, MB_ICONSTOP, MB_DEFBUTTON1)
Image.SetVisible("erroraldescargar", true);
File.Delete(savefile, false, true, true, nil);
Label.SetVisible("Label_ProgressDownloaded", false);
Label.SetVisible("Label_ProgressDownloaded2", true);
Label.SetText("Label_ProgressDownloaded2", "Archivo no descargado");
Progress.SetCurrentPos("Progress_Download_Status",0);
end

-- Si no hay error durante la descarga.
if (Completed == '100% Descargado') then
dcomplete=Image.SetVisible("descargacompleta", true);
Label.SetVisible("Label_ProgressDownloaded", false);
Label.SetVisible("Label_ProgressDownloaded2", true);
Label.SetText("Label_ProgressDownloaded2", "Archivo descargado, abriendo...");
open=File.Open(savefile, "", SW_SHOWNORMAL);
end

Disculpen el desorden en el codigo, pero recien empiezo en esto, cualquier ayuda sera bien recibida.
Aquí tienes este ejemplo directo de Ayuda de AMS (te recomiendo leerla más seguido, puede ayudar bastante)

-- Callback function for HTTP.Download
function DownloadCallback (nDownloaded, nTotal, TransferRate, SecondLeft, SecondsLeftFormat, Message)
-- Convert total and downloaded bytes into formatted strings
sDownloaded = String.GetFormattedSize(nDownloaded, FMTSIZE_AUTOMATIC, true);
sTotal = String.GetFormattedSize(nTotal, FMTSIZE_AUTOMATIC, true);

-- Output time left, formatted.
StatusDlg.SetMessage("Currently downloading file . . . Time Left: " .. SecondsLeftFormat);

-- Output formatted sizes to user through statusdlg status text
StatusDlg.SetStatusText("Downloaded: " .. sDownloaded .. " / " .. sTotal);

-- Set meter position (fraction downloaded * max meter range)
StatusDlg.SetMeterPos((nDownloaded / nTotal) * 65534);
end



-- Show the StatusDlg
StatusDlg.Show(0, false); -- Second option it's true for show cancel button

-- Set statusdlg title and message
StatusDlg.SetTitle("Downloading . . . ");

-- Set meter range (max range = 65534)
StatusDlg.SetMeterRange(0, 65534);

-- Download a file from the internet to the user's computer
-- Uses DownloadCallback() as the callback function
HTTP.Download("http://www.yourdomain.com/downloads/update.exe", _TempFolder.."\\update.exe", MODE_BINARY, 20, 80, nil, nil, DownloadCallback);

-- Hide the StatusDlg
StatusDlg.Hide();
Hola, gracias por tu respuesta. Al dia de hoy logre hacerlo viendo el foro de indigo mas detenidamente.
Una consulta mas:
Y si no quiero usar el status.dlg? Si solo quiero agregar un boton de cancelar descarga con un mensaje "Deseas cancelar la descarga" y con opcion de "si" o "no"?
Como tendria que hacerlo? Gracias de antemano.
Me temo que eso no puede ser posible mi estimado... Bueno, yo personalmente no sé cómo hacerlo, quizá exista alguna manera pero no creo que sea así, pues lamentablemente al limitado multithreading no es posible realizar una acción sobre una acción que ya se está realizando...
Amigo,
mira yo hice uno parecido pero con ftp si quieres puedes chequearlo

https://www.youtube.com/watch?v=iRMcifxHcAo&t=4s

Lo hice en AMS dure como 6 meses realizando este proyecto y hoy lo utilizo en mi trabajo o en cualquier parte que tengas Internet.

Me cuentas y si es algo asi parecido yo te ayudaría a construir el tuyo.
bierco escribió:Amigo,
mira yo hice uno parecido pero con ftp si quieres puedes chequearlo

https://www.youtube.com/watch?v=iRMcifxHcAo&t=4s

Lo hice en AMS dure como 6 meses realizando este proyecto y hoy lo utilizo en mi trabajo o en cualquier parte que tengas Internet.

Me cuentas y si es algo asi parecido yo te ayudaría a construir el tuyo.
Hola gracias por responder, vi tu instalador y me parecio que va en el mismo camino que el mio. Me ayudas?
Estoy estancado por el bendito boton para cancelar descarga, pero he avanzado lo demas. Gracias y salu2!
Te encontré una solución... Me puse a investigar un poco y me encontré con PlugIn llamado Download, te adjunto el archivo zip que contiene el PlugIn y un ejemplo que te contendrá lo que necesitas...

Download.zip (132 KB)