|
| TThread og en ShowMessage - det kan man ik~ Fra : Esben Piltoft |
Dato : 10-03-03 18:24 |
|
Koden herunder giver en "Canvas does not allow drawing" fejl.
Hvorfor det? Hvor går det galt ?
Er det fordi man slet ikke må gøre det (på den måde)??
Skriver man til en label går det uden problemer.... (
Form1.Label1.Caption := 'test';)
Nogen der kan fortælle mig hvad jeg gør galt ??
På forhånd tak
Esben
**********************************************
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
type
TTest = class(TThread)
protected
procedure Execute; override;
end;
var
Form1: TForm1;
myTest : TTest;
implementation
{$R *.DFM}
procedure TTest.Execute;
begin
FreeOnTerminate := true;
ShowMessage('TEST');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
myTest := TTest.Create(false);
end;
| |
Klaus Petersen (10-03-2003)
| Kommentar Fra : Klaus Petersen |
Dato : 10-03-03 22:27 |
|
> Nogen der kan fortælle mig hvad jeg gør galt ??
Jeg kan give et bud.
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> myTest := TTest.Create(false);
Sleep (10);
> end;
Indsættelse af den sleep der gør at det virker, så der er noget der tyder,
at du har et synkroniseringsproblem.
Måske prøver programmet at tegne på det samme canvas 2 steder fra?
Anyways... her kommer den pæne løsning.
Klaus.
<delphi kode>
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
type
TTest = class(TThread)
protected
procedure Execute; override;
procedure ShowAMessage;
end;
var
Form1: TForm1;
myTest : TTest;
implementation
{$R *.DFM}
procedure TTest.ShowAMessage;
begin;
ShowMessage('TEST');
end;
procedure TTest.Execute;
begin
FreeOnTerminate := true;
self.Synchronize( showAmessage );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
myTest := TTest.Create(false);
end;
end.
</slut delphi kode>
| |
Esben Piltoft (11-03-2003)
| Kommentar Fra : Esben Piltoft |
Dato : 11-03-03 12:00 |
|
Nå, det er det Synchronize skal bruges til. Det løser vist også en del
andre problemer jeg har haft :)
Jeg takker mange gange.
- Esben
| |
|
|