자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi StringGrid에서 선택된 값(KEY)로하여 화면을 호출시 Access violation 발생
2017.10.31 15:32
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안녕하세요!!!
StringGrid를 이용하여 출략된 data를 이용하여 해당 Row에 선택된 내용에 대한 상세 화면을 호출하는 로직입니다.
즉, A화면에서 B화면을 호출하는데, 첫번쨰로 호출시는 정상적으로 조회(출력)되는데
2번쨰 즉 B화면을 Close하고, A화면에서 다른 data를 선택한 후에 B화면을 호출하면
다음과 같은 에라가 발생하여 조회가 않됩니다.
Nplmangmnt
---------------------------
Access violation at address 006052B7 in module 'NplMangmnt.exe'. Read of address 00000010.
---------------------------
확인
----
Delphi 버젼은 Delphi 10.1 Berlin이고, Windows에서 개발하고 있읍니다.
Coding한 내용은 다음과 같습니다. 고수님들의 조언 부탁드립니다.
A화면에서 코딩한 내용
procedure TfrmNPLP500D.StrMainMDblClick(Sender: TObject);
begin
if not Assigned(frmNPLP501D) then
begin
frmNPLP501D := TfrmNPLP501D.Create(Self);
end;
frmNPLP501D.SelectedSeq := FSelectedSeq ;
frmNPLP501D.ShowModal ; OR frmNPLP501D.Show;
end;
//
B화면에서 코딩한 내용입니다.
//Form 처리시
procedure TfrmNPLP501D.btnCloseClick(Sender: TObject);
begin
qryNplMainm.SQL.Clear; //query clear처리
qryNplMainm.Close ;
close;
end;
procedure TfrmNPLP501D.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
end;
위와 같이 하는데도 동일한 에라가 발생하는군요~~ 어디에 문제가 있는지요?
아니면 어떠한 부문에서 CODING 오류가 있는지요?
고수님들의 조언 부탁합니다. 이것 해결할려고 몇일동안 헤매고 있습니다.
감사합니다.
댓글 3
-
동그랑땡88
2017.10.31 15:37
-
험프리
2017.10.31 15:48
Access Violation(AV) 에러는 잘못된 메모리를 참조하는 경우 발생합니다.
첫번째는 괜찮고, 두번째 문제가 된다면 첫번째 작업에서 사용한 객체를 해제하지 않거나, 인스턴스를 초기화해주지 않아서 입니다.
위 동그랑땡88님 말씀대로, 처리하시되, 인스턴스(frmNPLP501D)를 초기화(nil) 해주는 방법이 좋은 방법입니다.
OnClose 이벤트에서 아래와 같이 nil 처리해 주어도 좋습니다.
procedure TfrmNPLP501D.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
frmNPLP501D := nil;
end;
-
AllwaysHappy
2017.10.31 16:34
동그랑땡88님과 험프리님 대단히 대단히 감사합니다. 해결되었습니다.
몇일동안 원인을 몰라 인터넷과 델마당등을 찾았지만 해결이 않돼서
최종적으로 Q&A에 올렸는데 바로 해결이 되네요!! 너무 너무 감사합니다.
좋은 의견 감사합니다. 모두들 행복한 하루되세요!!!
Delphi StringGrid에서 선택된 값(KEY)로하여 화면을 호출시 Access violation 발생
2017.10.31 15:32
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안녕하세요!!!
StringGrid를 이용하여 출략된 data를 이용하여 해당 Row에 선택된 내용에 대한 상세 화면을 호출하는 로직입니다.
즉, A화면에서 B화면을 호출하는데, 첫번쨰로 호출시는 정상적으로 조회(출력)되는데
2번쨰 즉 B화면을 Close하고, A화면에서 다른 data를 선택한 후에 B화면을 호출하면
다음과 같은 에라가 발생하여 조회가 않됩니다.
Nplmangmnt
---------------------------
Access violation at address 006052B7 in module 'NplMangmnt.exe'. Read of address 00000010.
---------------------------
확인
----
Delphi 버젼은 Delphi 10.1 Berlin이고, Windows에서 개발하고 있읍니다.
Coding한 내용은 다음과 같습니다. 고수님들의 조언 부탁드립니다.
A화면에서 코딩한 내용
procedure TfrmNPLP500D.StrMainMDblClick(Sender: TObject);
begin
if not Assigned(frmNPLP501D) then
begin
frmNPLP501D := TfrmNPLP501D.Create(Self);
end;
frmNPLP501D.SelectedSeq := FSelectedSeq ;
frmNPLP501D.ShowModal ; OR frmNPLP501D.Show;
end;
//
B화면에서 코딩한 내용입니다.
//Form 처리시
procedure TfrmNPLP501D.btnCloseClick(Sender: TObject);
begin
qryNplMainm.SQL.Clear; //query clear처리
qryNplMainm.Close ;
close;
procedure TfrmNPLP501D.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
end;
위와 같이 하는데도 동일한 에라가 발생하는군요~~ 어디에 문제가 있는지요?
아니면 어떠한 부문에서 CODING 오류가 있는지요?
고수님들의 조언 부탁합니다. 이것 해결할려고 몇일동안 헤매고 있습니다.
감사합니다.
댓글 3
-
동그랑땡88
2017.10.31 15:37
-
험프리
2017.10.31 15:48
Access Violation(AV) 에러는 잘못된 메모리를 참조하는 경우 발생합니다.
첫번째는 괜찮고, 두번째 문제가 된다면 첫번째 작업에서 사용한 객체를 해제하지 않거나, 인스턴스를 초기화해주지 않아서 입니다.
위 동그랑땡88님 말씀대로, 처리하시되, 인스턴스(frmNPLP501D)를 초기화(nil) 해주는 방법이 좋은 방법입니다.
OnClose 이벤트에서 아래와 같이 nil 처리해 주어도 좋습니다.
procedure TfrmNPLP501D.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
frmNPLP501D := nil;
end;
-
AllwaysHappy
2017.10.31 16:34
동그랑땡88님과 험프리님 대단히 대단히 감사합니다. 해결되었습니다.
몇일동안 원인을 몰라 인터넷과 델마당등을 찾았지만 해결이 않돼서
최종적으로 Q&A에 올렸는데 바로 해결이 되네요!! 너무 너무 감사합니다.
좋은 의견 감사합니다. 모두들 행복한 하루되세요!!!
if not Assigned(frmNPLP501D) then 를 빼시거나
frmNPLP501D 의 OnDestroy 이벤트에 frmNPLP501D := nil 코딩 추가하거나
하시면 될듯하네요