자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey StringGrid 초기화 방법에 대해서 궁금합니다.
2017.09.27 13:45
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안녕하세요.
기존에 볼랜드IDE에서 TMS AdvStringGrid를 사용하다가
모바일용으로 마이그레이션 중에 있는데요.
베를린에서 FMX TStringGrid를 이용해 개발할 때 안드로이드 환경에서
rowcount가 100일 때 사용자가 스트링그리드 스크롤을 최하단으로 내립니다.
그 상태에서 사용자가 버튼클릭을 함으로써 프로그램에서 rowcount를 2로 만듭니다.
그러면
function TStyledGrid.CellRect(const ACol, ARow: Integer): TRect;
var
I, X, Y: Integer;
HiddenFound: Boolean;
begin
if (ACol < 0) or (ACol > ColumnCount) then
raise EArgumentOutOfRangeException.CreateResFmt(@SInvalidColumnIndex, [ACol]);
if (ARow < 0) or (ARow > RowCount) then
raise EArgumentOutOfRangeException.CreateResFmt(@SInvalidRowIndex, [ARow]);
.
.
.
end;
여기에 걸려서 Exception을 뱉어냅니다.
디버그 해보았을 때
ARow = 82, RowCount = 2 입니다.
82라는 값은 제가 추측하길 디바이스에서 스크롤을 최하단으로 내렸을 때에 보였던 최상단 Row값인 것 같습니다
왜냐하면 스크롤이 최하단일 때는 제 실제 디바이스 환경(Nexus5)에서 Row가 18개가 보였습니다.
스크롤을 중간으로 해놓고 하면 Exception 걸릴 때 ARow값이 줄어듭니다.
Exception이 되는 케이스는 스크롤 내렸을 때의 마지막 화면의 시작 Row값이
새로 그릴 rowcount := 값보다 크면 위와 같은 Exception조건에 걸립니다.
왜 이런 문제가 발생할까요?
저는 현재 FMX StringGrid Columns를 초기화하는데는 StringGrid1.RemoveObject를 사용하고 있고
Rows를 초기화하는데는 Rowcount를 사용하고 있습니다.
스트링그리드초기화하는데 어떤 방법을 써야할까요?
아에 인스턴스를 없애고 다시 생성하는 게 나을까요?
윈도우모드에서는 같은 행위를 시도했을 때 문제가 없었습니다.
감사합니다.
Firemonkey StringGrid 초기화 방법에 대해서 궁금합니다.
2017.09.27 13:45
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안녕하세요.
기존에 볼랜드IDE에서 TMS AdvStringGrid를 사용하다가
모바일용으로 마이그레이션 중에 있는데요.
베를린에서 FMX TStringGrid를 이용해 개발할 때 안드로이드 환경에서
rowcount가 100일 때 사용자가 스트링그리드 스크롤을 최하단으로 내립니다.
그 상태에서 사용자가 버튼클릭을 함으로써 프로그램에서 rowcount를 2로 만듭니다.
그러면
function TStyledGrid.CellRect(const ACol, ARow: Integer): TRect;
var
I, X, Y: Integer;
HiddenFound: Boolean;
begin
if (ACol < 0) or (ACol > ColumnCount) then
raise EArgumentOutOfRangeException.CreateResFmt(@SInvalidColumnIndex, [ACol]);
if (ARow < 0) or (ARow > RowCount) then
raise EArgumentOutOfRangeException.CreateResFmt(@SInvalidRowIndex, [ARow]);
.
.
.
end;
여기에 걸려서 Exception을 뱉어냅니다.
디버그 해보았을 때
ARow = 82, RowCount = 2 입니다.
82라는 값은 제가 추측하길 디바이스에서 스크롤을 최하단으로 내렸을 때에 보였던 최상단 Row값인 것 같습니다
왜냐하면 스크롤이 최하단일 때는 제 실제 디바이스 환경(Nexus5)에서 Row가 18개가 보였습니다.
스크롤을 중간으로 해놓고 하면 Exception 걸릴 때 ARow값이 줄어듭니다.
Exception이 되는 케이스는 스크롤 내렸을 때의 마지막 화면의 시작 Row값이
새로 그릴 rowcount := 값보다 크면 위와 같은 Exception조건에 걸립니다.
왜 이런 문제가 발생할까요?
저는 현재 FMX StringGrid Columns를 초기화하는데는 StringGrid1.RemoveObject를 사용하고 있고
Rows를 초기화하는데는 Rowcount를 사용하고 있습니다.
스트링그리드초기화하는데 어떤 방법을 써야할까요?
아에 인스턴스를 없애고 다시 생성하는 게 나을까요?
윈도우모드에서는 같은 행위를 시도했을 때 문제가 없었습니다.
감사합니다.
테스트 해보니 저의 경우는 윈도우에서도 같은 문제가 발생합니다.
아무래도,
RowCount 변경 시, 현재 Row의 항목들을 표시하려고 해서 발생하는 이슈로 보입니다.
(그중 첫번째가 82인 것으로 보입니다.)
근본적인 조치방법은 아니지만, 아래와 같이 조치해보시기 바랍니다.
StringGrid1.Row := 0;
StringGrid1.RowCount := 2;
RowCount 변경 전 현재의 Row를 변경하면 오류가 발생하지 않습니다.
자세한 내용은 제거 좀더 파악하고 버그레포팅 하도록 하겠습니다.