![]() |
Copiar ficheros con progressbar
Buenos días,
He encontrado la manera en delphi pero no tengo ni idea como se hace en c++ builder, lo que quisiera hacer yo es teniendo un componente TProgressBar quisiera copiar un fichero grande y que muestre el progreso, esto hecho en c++ builder. Como se hace? Grácias. |
Hola, supongo que se puede hacer de varias maneras...
yo lo haría cargando el fichero en un buffer o en un objeto TMemoryStream ó en algo mas apropiado si lo hay.... entonces calcularia el tamaño y deduciría cuantos ciclos de 1024 bytes tendrian que usarse acto seguido calcularia el "step" del progressBar a medida de mis ciclos y empezaría la copia "streamIn <- buffer , buffer -> StreamOut" en ciclos de 1024 e incrementaría el STEP del progressbar en cada vuelta no sé si me he explicado y si es la forma óptima, pero de primeras se me ocurre esta manera un saludo |
Más sencillo
En delphi hay otra forma y es mucho más sencillo, seguro que alguien sabe algo más i si puede ser algo de código que no se como ponerlo lo del progressbar.
Grácias. |
|
Hola,
¿puedes indicarme como se realiza en delphi? Saludos... |
Delphi
Quisiera esto pero en c++ builder
Problem/Question/Abstract: Does anyone have an example of using CopyFileEx with a CopyProgressRoutine? I have created a function that takes the same parameters as the CopyProgressRoutine, but when I pass it using @ or Addr() I get a Variable Required error message. Answer: Let's assume you call CopyFileEx and want the callback to update a progress bar. The callback cannot be an objects method but you can use the lpData parameter of CopyFileEx to pass any kind of data to the callback, e.g. a form reference. So, if you want to serve a progress form in the callback that would look like this (untested !): type TProgressForm = class(TForm) AbortButton: TButton; ProgressBar: TProgressBar; procedure AbortButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } FCancel: BOOL; end; {form has fsStayOnTop formstyle!} implementation {$R *.DFM} procedure TProgressForm.AbortButtonClick(Sender: TObject); begin FCancel := True; end; {Note: could use int64 instead of COMP, but that would make this D4 specific} function CopyCallback(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: COMP; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; progressform: TProgressForm): DWORD; stdcall; var newpos: Integer; begin Result := PROCESS_CONTINUE; if dwCallbackReason = CALLBACK_CHUNK_FINISHED then begin newpos := Round(TotalBytesTransferred / TotalFileSize * 100); with progressform.Progressbar do if newpos <> Position then Position := newpos; Application.ProcessMessages; end; end; function DoFilecopy(const source, target: string): Boolean; var progressform: TProgressForm; begin progressform := TProgressform.Create; try progressform.Show; Application.ProcessMessages; Result := CopyFileEx(PChar(source), PChar(target), @CopyCallback, Pointer(progressform), @progressform.FCancel, 0); finally progressform.Hide; progressform.free; end; end; |
|
Muchísimas grácias funcionó perfectamente
Muchísimas grácias funcionó perfectamente
|
que maravilla, yo tb tomo nota :)
|
Cita:
Código:
Page not found |
|
La franja horaria es GMT +2. Ahora son las 12:50:00. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi