20/04/10 15:32
a_butta
Allora il codice funziona di per sè, solo che dato che io devo far passare i valori da una form a un altra ho fatto in questo modo: Dalla form principale ho impostato le variabili Source e Destination e poi ho inserito la chiamata SaveForm.Show.
Nella SaveUnit ho questo codice:
Durante il debug non mi dà errore. Quando invece da runtime avvio la procedura, mi viene fuori il seguente errore:
Project nome.exe raised exception class 'EThread' with message CheckSyncronize called from non-main thread "$C78"
Le ultime tre lettere però variano ogni volta che esce il messaggio.
Non ho idea di come risolvere... potete aiutarmi?
Grazie...
Nella SaveUnit ho questo codice:
unit saveunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls; var Source, Destination: string; type { TSaveForm } TSaveForm = class(TForm) Label1: TLabel; LabelCount: TLabel; ProgressBar1: TProgressBar; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private { private declarations } public { public declarations } end; type {Thread Copiatura} TCopyProcedure = class(TThread) private fStatusText : string; protected procedure Execute; override; end; var SaveForm: TSaveForm; implementation { TSaveForm } procedure TCopyProcedure.Execute; var newStatus : string; FromF, ToF : file of byte; Buffer : array[0..4096] of char; NumRead : integer; FileLength : int64; begin //TCopyProcedure.Synchronize ; //fStatusText := 'TMyThread Running...'; AssignFile(FromF,Source); reset(FromF); ShowMessage(Destination); AssignFile(ToF,Destination); Rewrite(ToF); FileLength:=FileSize(Source); SaveForm.LabelCount.Caption := IntToStr(FileLength) ; SaveForm.Progressbar1.Max := FileLength; while FileLength > 0 do begin BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF,Buffer[0],NumRead); SaveForm.Progressbar1.Position := SaveForm.Progressbar1.Position + NumRead; SaveForm.ProgressBar1 .Caption := IntToStr(SaveForm.ProgressBar1.Position ); SaveForm.Label1.Caption:= IntToStr((SaveForm.Progressbar1.Position * SaveForm.Progressbar1.Max) div 10000) + ' %'; end; CloseFile(FromF); CloseFile(ToF); SaveForm.Label1.Caption := ('File Copiato con successo!'); SaveForm.ProgressBar1.Position:=0; Terminate; end; procedure TSaveForm.FormCreate(Sender: TObject); begin end; procedure TSaveForm.FormShow(Sender: TObject); begin TCopyProcedure.Create (False); end; initialization {$I saveunit.lrs} end.
Durante il debug non mi dà errore. Quando invece da runtime avvio la procedura, mi viene fuori il seguente errore:
Project nome.exe raised exception class 'EThread' with message CheckSyncronize called from non-main thread "$C78"
Le ultime tre lettere però variano ogni volta che esce il messaggio.
Non ho idea di come risolvere... potete aiutarmi?
Grazie...
Ultima modifica effettuata da a_butta 20/04/10 15:33
aaa