대충만 봤습니다만...
Form16이 생성된 상태인지 확인해보세요.
액세스 바어얼레이션은 기본적으로 무효 메모리에 대한 액세스 시도 때문입니다.
쓰레드인가 아닌가 싱크로나이즈를 했나 안했나에 따라서 액세스 바이얼레이션이 발생하지는 않거든요.
말씀하신 증상만 봐서는 Form16.Edit1.Text 여기에 액세스하면서 액세스 바이얼레이션이 발생했다는 얘긴데,
Edit1 자체는 아마도 폼에 정적으로 놓여진 컴포넌트일 것이기 때문에 문제 가능성이 거의 없고, 만약 폼 자체가 생성되지 않았다면 정확히 그같이 액세스 바이얼레이션이 발생할 겁니다.
그럼...
-_-;;;;; 님이 쓰신 글 :
: 기존에 NormalForm에서 MainForm 하나에 쓰레드 유닛하나를 얹어서
: 각각 사용하던 프로그램들을
: 하나로 합쳐서 MDIForm으로 만들려고 합니다.
: 그런데...각각 사용할땐 문제가 없던 프로그램과 쓰레드가
: MDIForm아래 MDIChild로 폼 형식만 바뀌었을 뿐인데...
: MDIChild의 Edit박스를 접근을 하지 못하는 AV 에러를 띄웁니다.
:
: MDI에서 쓰레드를 사용할땐 먼가 다르게 해야하나요?
: 물론 VCL에 접근하는 부분은 Synchronize로 처리했습니다.
:
: MDIChild 에는 Edit 박스 1개와 실행버튼이 있구요.
: 실행버튼을 클릭하면 Edit박스의 내용이 있는지 확인하고
: 있을경우 검색을 실행하는 구조입니다.
: 그런데..버튼을 클릭하면 쓰레드유닛에서 Edit박스에 접근을 못하는군요...ㅠㅠ
: 어떻게 하면 오류를 수정하는지 원인은 무엇인지 조언을 부탁
: 드립니다.
:
: 아래는 Thread 유닛입니다.
:
: unit Unit17;
:
: interface
:
: uses
: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
: Dialogs, StdCtrls, ExtCtrls, Gauges, DB, DBTables, jpeg, Grids;
:
: type
: TNoMarcIsbnThread = class(TThread)
: procedure NoMarcIsbnEx;
: private
: { Private declarations }
: protected
: procedure Execute; override;
:
: end;
:
: implementation
:
: Uses Unit16; <=== MDIChild 폼
:
: procedure TNoMarcIsbnThread.Execute;
: var
: gbn, starttime : string;
: mRow,i : integer;
: begin
: while not terminated do begin
: try
: try
:
: Synchronize(ViewEx);
:
: except
:
: end;
:
: finally
: Terminate;
: end;
: end; {while end}
: end;
:
:
:
: ///////////////////
: procedure TNoMarcIsbnThread.ViewEx;
: var
: gbn, starttime : string;
: mRow,i, totCnt : integer;
: begin
: try
: if trim(Form16.Edit1.Text)='' then begin < ==여기서 Access violation 이 발생하고 멈춤니다.
: showmessage('검색어를 입력하시오.... ');
: Exit;
: end;
:
: finally
: end;
: end;
: ///////////////////
:
: end.
|