Q&A

  • StringGrid에서 특정 셀로 포커스를 이동하려면???
아래와 같이... 버튼을 누르면, 에디터(nameserch)에 입력되어 있는과



같은 내용을 가지고 있는 셀을 찾아서 그 찾은 라인에 바탕색을 주거나,



셀렉트 되어 있게 표현되게 하려면... 어떻게 해야 하나요???



참고로, 각 라인의 첫칸에 이름이 나타나고 있습니다..



그리고, 찾고 나면 for 문을 벗어 나야 하는데.. break를 쓰면 되는건지도 모르겠군요..



고수님들의 도움말을 기다리고 있습니다... ^^;



--------------------------------



procedure TwaitingForm.SpeedButton1Click(Sender: TObject);

var

i : Integer;

begin

if (namesearch.Text = '이름 입력') or (namesearch.Text = '') then

begin

Showmessage('찾을 친구 이름을 입력해 주세요');

end else

begin

for i := 0 to StringGrid3.RowCount do

begin

if namesearch.Text = StringGrid3.Cells[0,i] then

begin

StringGrid3.row := 0;

StringGrid3.col := i;

break;

end;

end;

end;

end;



--------------------------------





3  COMMENTS
  • Profile
    윤진화 2000.03.21 05:18
    > 셀렉트 되어 있게 표현되게 하려면... 어떻게 해야 하나요???

    ==> StringGrid의 "Option"라는 프로퍼티의 "+"를 클릭하세요.

    그러면 여러 옵션들이 나오는데 "goRowSelect"값을 True로

    하세요. 그 외 많은 옵션들이 있는데 직접 해보시면 금방

    아실꺼예요.



    > 그리고, 찾고 나면 for 문을 벗어 나야 하는데..

    > break를 쓰면 되는건지도 모르겠군요..

    ==> "for", "case", "repeat" 등에 break를 쓰는게 맞습니다앙~~



    > if namesearch.Text = StringGrid3.Cells[0,i] then

    > begin

    > StringGrid3.row := 0;

    > StringGrid3.col := i;

    > break;

    > end;

    ===================================================

    위의 내용은 거의 다 맞았는데 약간 헷갈리셨군요.

    StringGrid3.Row := i;

    StringGrid3.Col := 0;

    으로 고치세요.

    ===================================================

    또 "options"에서 "goRowSelect"를 했기 때문에

    StringGrid3.Col

    에 값을 넣어 줄 필요는 없겠죠.

    Row만 지정해주면 됩니다.

    ===================================================

    또 혹시나 StringGrid3에 포커스가 가지 않는다면

    StringGrid3.Row := i;

    StringGrid3.SetFocus;

    Break;

    로 해주시면 되겠죠.

  • Profile
    이수정 2000.03.21 09:00
    윤진화 wrote:

    > > 셀렉트 되어 있게 표현되게 하려면... 어떻게 해야 하나요???

    > ==> StringGrid의 "Option"라는 프로퍼티의 "+"를 클릭하세요.

    > 그러면 여러 옵션들이 나오는데 "goRowSelect"값을 True로

    > 하세요. 그 외 많은 옵션들이 있는데 직접 해보시면 금방

    > 아실꺼예요.





    goRowSelect 값 말고도 엄청 많군요.. ^^:

    True로 변경 했습니다.





    > ==> "for", "case", "repeat" 등에 break를 쓰는게 맞습니다앙~~



    break 문으로 빠져서 i값이 살아 있습니다.





    > ===================================================

    > 또 혹시나 StringGrid3에 포커스가 가지 않는다면

    > StringGrid3.Row := i;

    > StringGrid3.SetFocus;

    > Break;

    > 로 해주시면 되겠죠.





    음.. 위의 코드가 제대로 안먹히는 군요...

    어떻게 수정했냐면요.....

    -------------------------------



    if (namesearch.Text = '아이디 입력') or (namesearch.Text = '') then

    begin

    Showmessage('찾을 친구 아이디를 입력해 주세요');

    end else

    begin

    for i := 0 to StringGrid3.RowCount - 1 do

    begin

    if namesearch.Text = StringGrid3.Cells[0,i] then

    begin

    ShowMessage('찾았음: '+IntToStr(i)+StringGrid3.Cells[0,i]);

    Break;

    end;

    end;

    StringGrid3.Row := i; <<-- 1줄

    StringGrid3.SetFocus; <<-- 2줄

    ShowMessage(IntToStr(i));

    end;



    -------------------------------------------

    1줄과 2줄을 주석처리 하고 실행하면 i 값이 잘 보여지는데,



    먼저 1,2줄을 실행시키면... 프로그램 컴파일 오류가 납니다.

    -------------------------------------------

    Project select.exe raised exception class ElnvalidGridOperation with message

    'Grid index out of rande'. Process stopped. Use Step or Run to continue.

    -------------------------------------------

    위와 같은데... 전체 row가 15이고, 찾고자 하는건 2번째에 있거든요...



    i 값도 2라고 잘 나오는데.. 왜 안될까요......???



    포커스 이동을 다시 한번 부탁드립니다.



    그럼.... 기다릴께요.....







  • Profile
    윤진화 2000.03.22 06:04
    if (namesearch.Text = '아이디 입력') or (namesearch.Text = '') then

    Showmessage('찾을 친구 아이디를 입력해 주세요')

    else

    begin

    for i := 0 to StringGrid3.RowCount - 1 do

    begin

    if namesearch.Text = StringGrid3.Cells[0,i] then

    begin

    ShowMessage('찾았음: '+IntToStr(i)+StringGrid3.Cells[0,i]);

    Break;

    end;

    end;

    StringGrid3.Row := i; <<-- 1줄

    StringGrid3.SetFocus; <<-- 2줄

    ShowMessage(IntToStr(i));

    end;



    ------------------------------------------

    1줄과 2줄을 주석처리 하고 실행하면 i 값이 잘 보여지는데,

    먼저 1,2줄을 실행시키면... 프로그램 컴파일 오류가 납니다.

    -------------------------------------------

    Project select.exe raised exception class ElnvalidGridOperation

    with message 'Grid index out of rande'. Process stopped.

    Use Step or Run to continue.

    -------------------------------------------



    이상하네요~~ 제가 위의 코딩내용과 똑같이 해보니 에러가 없군요.

    그리고 StringGrid에서 "Option" -> "goRowSelect"를 True로 하면

    포커스와는 상관없이 파란막대가 지정된 Row에 항상 머물러있습니다.



    전체 코딩내용을 보여 주시면 고맙겠습니다.

    'Grid index out of range' 에러의 의미는 StringGrid의 Row,Col중

    범위를 벗어났다는 것입니다. 혹? 다른곳에서 "i"변수값을 변하게 하는

    루틴이 있을지...



    포커스에 대해서 간단히 설명...

    폼에 Edit1, Edit2 두개를 올려놓습니다. 그리고 Button1, Button2를

    올려놓습니다.



    Button1을 클릭했을때 코딩내용은 Edit2.SetFocus;

    Button2를 클릭했을때 코딩내용은 Edit1.SetFocus;



    이렇게 해보시면 Focus에 대한 이해가 쉽게....