2017-11-16 2 views
0

서브 폼에서 스레드를 실행할 때 문제가 있습니다.서브 폼에서 델파이 스레드 오류

기본 폼

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
TForm2.create(form1).ShowModal; 
end; 

하위 폼

type 
TMthread=class(Tthread) 
protected 
procedure execute; override; 
end; 
type 
TForm2 = class(TForm) 
    Label1: TLabel; 
    procedure FormShow(Sender: TObject); 
    private 
    public 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

uses Unit1; 

procedure TMthread.Execute; 
begin 
    synchronize(procedure 
       begin 
       sleep(200); 
       freeonterminate:=true; 
       sleep(200); 
       form2.label1.Caption:='beep'; 
       form1.button1.Caption:='beep'; 
       end); 
end; 

procedure TForm2.FormShow(Sender: TObject); 
var Loadcombo2: TMthread; 
begin 
    Loadcombo2:=TMthread.Create(False); 
end; 

프로그램

program Project1; 

uses 
    Vcl.Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

Form2.Label1.caption에 액세스하려고 할 때 내가 실행 과정에서 오류가 발생했습니다.

내 테스트 :.

내가 초기화 섹션 (마지막 코드)에 하위 폼 (형식 2)를 추가 응용 프로그램이 오류없이 실행되지만를 Form2에 Label1.caption을 변경하지 않는 경우 (Button1.caption 메인 폼에서 변경됨)

정확하게 동일한 스레드를 주 폼에 넣으면 문제없이 작동합니다.

+1

가 Form1을 Form2를 같은 형태의 전역 변수에 의존하지 마십시오

TForm2.Create(Form1).ShowModal; 

내가 대신 이런 식으로 뭔가를 작성하는 의미 의심 . 이들은 일반적으로 자동 생성 양식에서 사용됩니다. 이는 Application.CreateForm이 호출되는 경우를 의미합니다. 그러나 양식 두 개가 종료되면 어떻게합니까? 아니면 코드 에서처럼 자동으로 생성되지 않습니다. – nil

+2

당신은 두 번 * error *라고 말하지만 한 번에 * 오류 *가 무엇인지 알려주지 않습니다. 그것은 당신 앞에있는 스크린에 있습니다. 안타깝게도 우리가 앉아있는 곳에서 화면을 볼 수 없습니다. 예, 코드를 보는 것이 명확하지만 향후 문제에 대한 해결책을 찾는 사람에게는 해당되지 않습니다. 질문에 오류 정보를 포함 시키십시오. [편집]을 수행하는 동안 실제로 질문 할 수도 있습니다 (현재 게시하지 않습니다). –

답변

2

변수 Form2은 할당되지 않습니다. 전역 변수이기 때문에 값은 nil입니다. 따라서 Form2의 구성원을 참조하려고하면 오류가 발생합니다.

이 같은 Form2의 인스턴스를 생성 :

Form2 := TForm2.Create(Form1); 
Try 
    Form2.ShowModal; 
Finally 
    Form2.Free; 
End; 
+0

대단히 감사합니다, David. 그것은 운동했다. –

+0

더 나은 해결책은'TForm2.FormShow()'가 스레드의 생성자에'Self' 포인터를 전달하고 Execute()가 사용할 수있는 변수에 저장하는 것입니다. 그러면 더 이상 전역'Form2' 변수에 의존하지 않고 원하는 경우 여러 개의'TForm2' 인스턴스를 병렬로 실행할 수 있습니다. –

+0

@Remy Fair. 이 코드에는 다른 많은 문제가있어이 모든 것을 다룰 수 없었습니다. –

관련 문제