Q&A

  • string grid 에 button 생성
안녕하세요.
고수님들의 도움이 필요합니다.
우선 제가 만드는 프로그램의 특성상 stringgrid 를 이용하여 읽어오는 레코드의 특정값에 따라 셀들의 색깔을 다르게 지정해야 합니다.
grid 의 row는 150개 정도이며 col 은 20개 정도입니다.
ondrawcell 을 이용하여 색깔을 넣으려고 했더니 속도가 너무 느리고 cell  을 클릭할때 마다 이벤트가 실행이 되는 것 같아 사용불가 판정을 내렸습니다.(아마 제가 잘 못 이해하고 있는지 모르겠지만...)
아뭏든 그래서 그리드 안에 색깔 지정이 가능한 버튼을 넣기로 결정을 했습니다.
버튼도 잘 들어가고 (물론 실행시에 동적으로 생성) 색깔도 지정이 잘 되는군요
여기서 문제...
1.row 150개 전체에 버튼을 다 생성하니 버튼 텍스트(cells(i,y))에 이상이 생기는 군요. 그리고 스크롤로 내려도 텍스트가 변하지도 않고...질문입니다.우선 그리드의 화면만큼 그리드를 보여주고 스클롤하면 나머지 데이타를 보여주면 좋을 것 같은데 방법이 있을까요.row 전체에 레코드를 처음부터 다 뿌려준다는 것이 속도면에서도 좋지는 않을 것 같네요.

2.현재 동적으로 버튼을 생성하는데
st.Objects[i,y] := tflatbutton.Create(st); 이렇게 create 만 했지 destroy 시키는 코딩은 하지 않았습니다.
리소스에 문제가 되지는 않을까요?
그리고 화면이 닫히면 자동으로 destroy 되는지도 궁금하군요?

소스///////////////////////////////////////////////////////////
procedure TForm1.FlatButton1Click(Sender: TObject);
var
   i ,y : integer;
   a : string;
begin
st.rowcount := 20;
st.ColCount := 1;


i:= 0;
y:= 0;

while i <= st.ColCount - 1 do
begin
     y := 0;
     while y <= st.RowCount - 1 do
     begin
          st.Objects[i,y] := tflatbutton.Create(st);
          with tflatbutton(st.objects[i,y]) do
          begin

               //OnMouseUp := CheckBoxMouseUp;
               Parent := st;
               BoundsRect := st.CellRect(i, y);
               Width := st.ColWidths[i];
               Height := st.RowHeights[y];
               Caption := 'button' + inttostr(i) + inttostr(y) ;

               color := clgreen;
               a:=caption;
               Name := 'button' + inttostr(i) + inttostr(y) ;
               onClick := FlatButtonClick;
          end;
          y := y+1;
     end;
     i:= i+1;

end;

도움 부탁드립니다.
감사합니다.
1  COMMENTS
  • Profile
    최용일 2005.08.15 04:28
    안녕하세요. 최용일입니다.

    row 150, column 20개면 버튼이 3000개 가량 생긴다는 건데... 지금이야 괜찮을지 모르겠지만 이런 StringGrid가 여러개 있거나 Row나 Colomn이 늘어나면 프로그램 자체가 뜨지 않을수도 있습니다. 리소스 낭비인것 같네요...

    StringGrid의 셀에 변화가 생겼을때는 셀을 다시그립니다. 이게 StringGrid의 기본적인 행동입니다.
    OwnerDraw일때는 OnDrawCell이벤트에서 사용자가 직접 그려주게 되는겁니다.
    일반적으로 StringGrid가 셀을 그리나 OnDrawCell을 이용해서 OwnerDraw로 그리나 속도상의 차이는 거의 없습니다.
    OnDrawCell을 이용해서 그렸더니 속도가 느리다는것은 님께서 OnDrawCell이벤트에서 속도에 영향을 미치는 작업을 많이 하셔서 그런것 같네요...
    자료를 읽어오는데 속도가 문제되지 않은 모든 자료를 다 넣는 것도 나쁜 방법은 아닙니다.
    Database 에서 자료를 읽어오는 것과 같이 읽어오는 속도가 느린 경우는 OnSelectCell이벤트에서 마지막 행인가 판단해서 마지막행이면 추가적으로 더 읽어오면 될듯하네요...

    2번은 별 문제 없습니다. StringGrid가 Destroy될때 같이 됩니다.

    ^^ 항상 즐코하세요...