자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey Tokyo 10.2.1에서 동적생성된 TFrame 해제시 오류...
2017.10.14 15:59
Tokyo 10.2.1에서 동적생성된 TFrame를 해제할 때 오류가 발생합니다.
베를린까지는 전혀 문제가 없었는데 Tokyo에서는 오류 또는 먹통이 되네요...
TFrame 생성/해재 테스트를 위해 간단히 만들어 봤습니다..
(원래는 프레임 생성/해제 관리 클래스를 만들어 사용하는데 하도 오류가 발생해서 원인 분석차 간단히 만들어 보았는데
역시 오류가 발생합니다.)
// 메인 유닛...
unit Unit3;
........
private
public
fr: TFrame1;
.....
procedure TForm3.btnFrameTestClick(Sender: TObject);
begin
// 프레임 생성 버튼을 누르면 프레임을 동적생성한다....
fr := TFrame1.Create(Self);
fr.Parent := Self;
fr.Align := TAlignLayout.Client;
end;
// 종료 버튼...
procedure TForm3.btnCloseClick(Sender: TObject);
begin
Close;
end;
// 백버튼이 눌렸을 시 처리...
procedure TForm3.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Key = vkHardwareBack then
begin
Key := 0;
if Assigned(fr) then
begin
// 여기에서는 전혀 문제가 발생하지 않는다..
fr.DisposeOf;
Exit;
end;
Close;
end;
end;
end.
// 프레임 유닛 (Unit4)
// '해제' 버튼을 눌렀을 때 프레임을 해제한다.
procedure TFrame1.btnFrameFreeClick(Sender: TObject);
begin
DisposeOf;
// Form3.fr.DisposeOf; // 메인폼에 있는 변수를 이용해 해제. 먹통....
// FreeOnRelease; // 해제 안됨...
// Release; // 먹통...
// 첫 번째로 버튼을 눌렀을 때는 해제가 되는데 두 번째부터 버튼을 누르면 오류 또는 먹통이 된다..
// 오류 메시지: Project Project2.apk raised exception class Segmentation fault(11).
// 여기에서 DisposeOf 대신 어떤 방법으로 프레임을 해제해야 하는지요?
// 베를린에서는 Release; 를 해주면 아무 문제없이 잘 작동한다.
// 도쿄에서는 Release가 deprecated가 돼서 사용할 수가 없고 사용해도 먹통이 된다...
end;
ToKyo에서 프레임을 사용하시는 분들은 프레임 위에서 '닫기' 버튼을 눌렀을 때 어떻게 프레임을 해제하는지
궁금합니다..
혼자 여러가지로 궁리를 해 보다가 이해가 안돼서 질문을 올려 봅니다..
감사합니다..
댓글 6
-
c2design
2017.10.17 11:03
-
푸른솔
2017.10.17 12:19
감사합니다...
메인에서는 DisposOf 또는 Release 모두 잘 작동합니다.
그러나 프레임 화면에서는 둘 다 작동하지가 않네요...
Release도 될 때는 2-3번 정도 잘 작동하나 계속 생성/해제를 반복하면 결국은 raised exception class Segmentation fault(11). 가 발생하네요.
Release를 deprecated 시켰으면 DisposeOf가 정상적으로 작동해야 될텐데.. 왜 안되는지..
Bug가 아니고 다른 방법이 있었으면 좋겠습니다....
관리자님도 한 번 테스트 해보시기를 부탁드려 봅니다.
-
푸른솔
2017.10.22 15:15
아무래도 버그인 모양이네요... 아쉽네요...
그래서 Back 버튼을 발생시켜 해결해보려고 시도하고 있는데 이 또한 쉽지가 않습니다..
// 그냥 앱이 종료돼 버립니다..
TAndroidHelper.Activity.onBackPressed;
// 두 문장 모두 아무 반응이 없습니다....
TAndroidHelper.Activity.onKeyUp(vkHardwareBack, TJKeyEvent.Create);
TAndroidHelper.Activity.onKeyUp(TJKeyEvent.JavaClass.KEYCODE_BACK, TJKeyEvent.Create);
// 역시 반응이 없습니다...
TAndroidHelper.Activity.onKeyDown(vkHardwareBack, TJKeyEvent.Create);
TAndroidHelper.Activity.onKeyDown(TJKeyEvent.JavaClass.KEYCODE_BACK, TJKeyEvent.Create);
혹시 Back 버튼 이벤트를 발생시키는 방법이 있는지 궁금합니다..
찾아봐도 이에 관련된 자료는 잘 보이지가 않습니다..
감사합니다...
-
푸른솔
2017.12.14 16:46
위 오류 내용이 10.2.2에서 어떻게 작동하는지 궁금하여 일단 Trial 버전을 설치하여 테스트를 해 봤는데 동일한 오류가 발생하네요..
프레임 위에서 버튼을 눌러 프레임을 해제하는 개발자가 전세계적으로 나 하나 뿐일까하는 생각이...
저는 환경설정 등 간단한 화면을 구성할 때는 폼 보다는 프레임을 사용하는데.. 또 프레임을 사용하라고 권장도 하고....
혹시 험프리님께서도 위의 오류가 발생하는지 궁금합니다...
그렇다면 회피 또는 우회할 수 있는 방법이 있는지도 궁금하네요...
베를린까지는 아무 문제없이 잘 사용했었는데....
감사합니다...
-
험프리
2017.12.15 09:56
저를 호출하셨네요^^
원리를 생각해보면 의외로 답이 쉽게 나옵니다.
1, 프레임도 하나의 인스턴스(객체)입니다.
2, 프레임의 버튼을 클릭 시 인스턴스의 이벤트(버튼클릭)가 발생합니다.
3, 이 이벤트에서 인스턴스를 해제합니다.
4, 현재 실해되고 있는 이벤트는 해제된 인스턴스에서 실행합니다.(참조 오류가 납니다.)
위 현상은 UI 컨트롤의 클릭 이벤트에서 인스턴스 해제시 발생합니다.(버튼, 리스트 박스 등등)
저의 경우 아래 코드와 같이 해제하는 부분을 쓰래드로 독립적으로 처리했습니다.(잘 해제 됩니다.)
FInstance.Parent := nil;
FInstance.Visible := False;
// UI 컨트롤에서 호출이 가능하므로, 해제(DisposeOf) 호출은 별도 처리
TThread.CreateAnonymousThread(
procedure
begin
FInstance.DisposeOf;
FInstance := nil;
end).Start;
PS - 마침 프레임 관련된 강좌를 준비 중이었는데 내용이 유출됐네요^^
-
푸른솔
2017.12.15 15:48
아... 감사합니다....묵은 체증이 확 내려가네요...
원인은 이거네요....
=> 4, 현재 실행되고 있는 이벤트는 해제된 인스턴스에서 실행합니다.(참조 오류가 납니다.)
그런데 왜 베른린까지는 아무 문제없이 잘 되게 해 놨는지...
도쿄부터 갑자기 문제가 발생하니 원인찾기가 쉽지가 않은듯 하네요...
폼 대신 가벼운 프레임을 사용하는데 폼에서 Close하듯이 프레임에서도 Release를 사용한것이 도쿄에서 발목을 단단히 잡혔습니다.
혹시 처음 프레임을 사용하는 사용자를 위해 제가 사용하는 프레임 관리 클래스를 '개발자 기술자료'란에 사용방법과 함께 올려 놓았습니다. 이 클래스를 사용하면 편리하게 프레임 생성 및 해제를 할 수가 있습니다..
험프리님.. 다시 한 번 감사를 드립니다....
Firemonkey Tokyo 10.2.1에서 동적생성된 TFrame 해제시 오류...
2017.10.14 15:59
Tokyo 10.2.1에서 동적생성된 TFrame를 해제할 때 오류가 발생합니다.
베를린까지는 전혀 문제가 없었는데 Tokyo에서는 오류 또는 먹통이 되네요...
TFrame 생성/해재 테스트를 위해 간단히 만들어 봤습니다..
(원래는 프레임 생성/해제 관리 클래스를 만들어 사용하는데 하도 오류가 발생해서 원인 분석차 간단히 만들어 보았는데
역시 오류가 발생합니다.)
// 메인 유닛...
unit Unit3;
........
private
public
fr: TFrame1;
.....
procedure TForm3.btnFrameTestClick(Sender: TObject);
begin
// 프레임 생성 버튼을 누르면 프레임을 동적생성한다....
fr := TFrame1.Create(Self);
fr.Parent := Self;
fr.Align := TAlignLayout.Client;
end;
// 종료 버튼...
procedure TForm3.btnCloseClick(Sender: TObject);
begin
Close;
end;
// 백버튼이 눌렸을 시 처리...
procedure TForm3.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Key = vkHardwareBack then
begin
Key := 0;
if Assigned(fr) then
begin
// 여기에서는 전혀 문제가 발생하지 않는다..
fr.DisposeOf;
Exit;
end;
Close;
end;
end;
end.
// 프레임 유닛 (Unit4)
// '해제' 버튼을 눌렀을 때 프레임을 해제한다.
procedure TFrame1.btnFrameFreeClick(Sender: TObject);
begin
DisposeOf;
// Form3.fr.DisposeOf; // 메인폼에 있는 변수를 이용해 해제. 먹통....
// FreeOnRelease; // 해제 안됨...
// Release; // 먹통...
// 첫 번째로 버튼을 눌렀을 때는 해제가 되는데 두 번째부터 버튼을 누르면 오류 또는 먹통이 된다..
// 오류 메시지: Project Project2.apk raised exception class Segmentation fault(11).
// 여기에서 DisposeOf 대신 어떤 방법으로 프레임을 해제해야 하는지요?
// 베를린에서는 Release; 를 해주면 아무 문제없이 잘 작동한다.
// 도쿄에서는 Release가 deprecated가 돼서 사용할 수가 없고 사용해도 먹통이 된다...
end;
ToKyo에서 프레임을 사용하시는 분들은 프레임 위에서 '닫기' 버튼을 눌렀을 때 어떻게 프레임을 해제하는지
궁금합니다..
혼자 여러가지로 궁리를 해 보다가 이해가 안돼서 질문을 올려 봅니다..
감사합니다..
댓글 6
-
c2design
2017.10.17 11:03
-
푸른솔
2017.10.17 12:19
감사합니다...
메인에서는 DisposOf 또는 Release 모두 잘 작동합니다.
그러나 프레임 화면에서는 둘 다 작동하지가 않네요...
Release도 될 때는 2-3번 정도 잘 작동하나 계속 생성/해제를 반복하면 결국은 raised exception class Segmentation fault(11). 가 발생하네요.
Release를 deprecated 시켰으면 DisposeOf가 정상적으로 작동해야 될텐데.. 왜 안되는지..
Bug가 아니고 다른 방법이 있었으면 좋겠습니다....
관리자님도 한 번 테스트 해보시기를 부탁드려 봅니다.
-
푸른솔
2017.10.22 15:15
아무래도 버그인 모양이네요... 아쉽네요...
그래서 Back 버튼을 발생시켜 해결해보려고 시도하고 있는데 이 또한 쉽지가 않습니다..
// 그냥 앱이 종료돼 버립니다..
TAndroidHelper.Activity.onBackPressed;
// 두 문장 모두 아무 반응이 없습니다....
TAndroidHelper.Activity.onKeyUp(vkHardwareBack, TJKeyEvent.Create);
TAndroidHelper.Activity.onKeyUp(TJKeyEvent.JavaClass.KEYCODE_BACK, TJKeyEvent.Create);
// 역시 반응이 없습니다...
TAndroidHelper.Activity.onKeyDown(vkHardwareBack, TJKeyEvent.Create);
TAndroidHelper.Activity.onKeyDown(TJKeyEvent.JavaClass.KEYCODE_BACK, TJKeyEvent.Create);
혹시 Back 버튼 이벤트를 발생시키는 방법이 있는지 궁금합니다..
찾아봐도 이에 관련된 자료는 잘 보이지가 않습니다..
감사합니다...
-
푸른솔
2017.12.14 16:46
위 오류 내용이 10.2.2에서 어떻게 작동하는지 궁금하여 일단 Trial 버전을 설치하여 테스트를 해 봤는데 동일한 오류가 발생하네요..
프레임 위에서 버튼을 눌러 프레임을 해제하는 개발자가 전세계적으로 나 하나 뿐일까하는 생각이...
저는 환경설정 등 간단한 화면을 구성할 때는 폼 보다는 프레임을 사용하는데.. 또 프레임을 사용하라고 권장도 하고....
혹시 험프리님께서도 위의 오류가 발생하는지 궁금합니다...
그렇다면 회피 또는 우회할 수 있는 방법이 있는지도 궁금하네요...
베를린까지는 아무 문제없이 잘 사용했었는데....
감사합니다...
-
험프리
2017.12.15 09:56
저를 호출하셨네요^^
원리를 생각해보면 의외로 답이 쉽게 나옵니다.
1, 프레임도 하나의 인스턴스(객체)입니다.
2, 프레임의 버튼을 클릭 시 인스턴스의 이벤트(버튼클릭)가 발생합니다.
3, 이 이벤트에서 인스턴스를 해제합니다.
4, 현재 실해되고 있는 이벤트는 해제된 인스턴스에서 실행합니다.(참조 오류가 납니다.)
위 현상은 UI 컨트롤의 클릭 이벤트에서 인스턴스 해제시 발생합니다.(버튼, 리스트 박스 등등)
저의 경우 아래 코드와 같이 해제하는 부분을 쓰래드로 독립적으로 처리했습니다.(잘 해제 됩니다.)
FInstance.Parent := nil;
FInstance.Visible := False;
// UI 컨트롤에서 호출이 가능하므로, 해제(DisposeOf) 호출은 별도 처리
TThread.CreateAnonymousThread(
procedure
begin
FInstance.DisposeOf;
FInstance := nil;
end).Start;
PS - 마침 프레임 관련된 강좌를 준비 중이었는데 내용이 유출됐네요^^
-
푸른솔
2017.12.15 15:48
아... 감사합니다....묵은 체증이 확 내려가네요...
원인은 이거네요....
=> 4, 현재 실행되고 있는 이벤트는 해제된 인스턴스에서 실행합니다.(참조 오류가 납니다.)
그런데 왜 베른린까지는 아무 문제없이 잘 되게 해 놨는지...
도쿄부터 갑자기 문제가 발생하니 원인찾기가 쉽지가 않은듯 하네요...
폼 대신 가벼운 프레임을 사용하는데 폼에서 Close하듯이 프레임에서도 Release를 사용한것이 도쿄에서 발목을 단단히 잡혔습니다.
혹시 처음 프레임을 사용하는 사용자를 위해 제가 사용하는 프레임 관리 클래스를 '개발자 기술자료'란에 사용방법과 함께 올려 놓았습니다. 이 클래스를 사용하면 편리하게 프레임 생성 및 해제를 할 수가 있습니다..
험프리님.. 다시 한 번 감사를 드립니다....
Release 쓰면 deprecated 되었다고 컴파일시 워닝이 뜨나 작동은 잘 되는것 확인 했습니다.
메인에서 삭제할때도 DisposeOF 대신 모두 Release 로 사용해 보세요.