Q&A

  • Findcomponent함수에서 이상하네요.
많은 수의 컴포넌트를 동적생성해서 폼에 올려놨습니다.



var

curr:TCurrenyEdit;

str:String;

str:= Edit1.Text;



그런데 curr:= TCurrencyEdit(Findcomponent('cur'+str)); 라는 식으로 해서 해당 컴포넌트를 찾았는데 계속 못찾더군요. 이상해서 ShowMessage('cur'+str)해보니까 분명히

폼에 있는 컴포넌트의 이름이 맞더군요. 몇 번이나 해봤는데 결과는 같았습니다.

왜 이런 현상이 발생하는지 궁금합니다.

3  COMMENTS
  • Profile
    김봉학 1999.12.18 00:15
    박성훈 wrote:

    > 많은 수의 컴포넌트를 동적생성해서 폼에 올려놨습니다.

    >

    > var

    > curr:TCurrenyEdit;

    > str:String;

    > str:= Edit1.Text;

    >

    > 그런데 curr:= TCurrencyEdit(Findcomponent('cur'+str)); 라는 식으로 해서 해당 컴포넌트를 찾았는데 계속 못찾더군요. 이상해서 ShowMessage('cur'+str)해보니까 분명히

    > 폼에 있는 컴포넌트의 이름이 맞더군요. 몇 번이나 해봤는데 결과는 같았습니다.

    > 왜 이런 현상이 발생하는지 궁금합니다.



    우선 제 기억이 맞는다면 FindComponent 함수는 인자로 컴포넌트의 이름을 갖고

    찾는 함수 입니다...



    컴포넌트 변수명이 아니라는 뜻이지요...



    위에서 FindComponent 함수를 쓰스기 전에

    curr.Name := 'curr';

    을 쓰신후 사용하시면 잘 될것 같군요...



    그럼 이만....

  • Profile
    박성훈 1999.12.18 03:37
    김봉학 wrote:

    > 박성훈 wrote:

    > > 많은 수의 컴포넌트를 동적생성해서 폼에 올려놨습니다.

    > >

    > > var

    > > curr:TCurrenyEdit;

    > > str:String;

    > > str:= Edit1.Text;

    > >

    > > 그런데 curr:= TCurrencyEdit(Findcomponent('cur'+str)); 라는 식으로 해서 해당 컴포넌트를 찾았는데 계속 못찾더군요. 이상해서 ShowMessage('cur'+str)해보니까 분명히

    > > 폼에 있는 컴포넌트의 이름이 맞더군요. 몇 번이나 해봤는데 결과는 같았습니다.

    > > 왜 이런 현상이 발생하는지 궁금합니다.

    >

    > 우선 제 기억이 맞는다면 FindComponent 함수는 인자로 컴포넌트의 이름을 갖고

    > 찾는 함수 입니다...

    >

    > 컴포넌트 변수명이 아니라는 뜻이지요...

    >

    > 위에서 FindComponent 함수를 쓰스기 전에

    > curr.Name := 'curr';

    > 을 쓰신후 사용하시면 잘 될것 같군요...

    >

    > 그럼 이만....



    글쎄요.

    제 생각에 curr.Name:= 'cuur'은 에러가 일어나는 것 같은데요.컴포넌트의 Name속성은

    String값으로 알고 있는데요. 위에서 curr은 TCurrencyEdit형의 컴포넌트변수이구요.

    String과 컴포넌트가 같을 수는 없죠. 그리고 변수로 string을 받아서 컴포넌트를 찾아도 아무 문제가 없더군요.(확인차 테스트 해봤거든요.)

    델파이 도움말에 나와 있는 FindComponent함수입니다.

    indComponent indicates whether or not a given component, AName, is owned by the component.



    function FindComponent(const AName: string): TComponent;



    Description



    FindComponent returns the component in the Components array property with the name that matches the string in the AName parameter. Use to find whether a given component is owned by another.

    FindComponent is not case sensitive.



    분명히 AName이 String형이거든요. 그리고 Return값이 TComponent이니까 TCurrencyEdit형으로 형변환해도 아무 문제가 없어야 정상 아닌가요?



  • Profile
    김봉학 1999.12.18 04:22
    박성훈 wrote:

    > 김봉학 wrote:

    > > 박성훈 wrote:

    > > > 많은 수의 컴포넌트를 동적생성해서 폼에 올려놨습니다.

    > > >

    > > > var

    > > > curr:TCurrenyEdit;

    > > > str:String;

    > > > str:= Edit1.Text;

    > > >

    > > > 그런데 curr:= TCurrencyEdit(Findcomponent('cur'+str)); 라는 식으로 해서 해당 컴포넌트를 찾았는데 계속 못찾더군요. 이상해서 ShowMessage('cur'+str)해보니까 분명히

    > > > 폼에 있는 컴포넌트의 이름이 맞더군요. 몇 번이나 해봤는데 결과는 같았습니다.

    > > > 왜 이런 현상이 발생하는지 궁금합니다.

    > >

    > > 우선 제 기억이 맞는다면 FindComponent 함수는 인자로 컴포넌트의 이름을 갖고

    > > 찾는 함수 입니다...

    > >

    > > 컴포넌트 변수명이 아니라는 뜻이지요...

    > >

    > > 위에서 FindComponent 함수를 쓰스기 전에

    > > curr.Name := 'curr';

    > > 을 쓰신후 사용하시면 잘 될것 같군요...

    > >

    > > 그럼 이만....

    >

    > 글쎄요.

    > 제 생각에 curr.Name:= 'cuur'은 에러가 일어나는 것 같은데요.컴포넌트의 Name속성은

    > String값으로 알고 있는데요. 위에서 curr은 TCurrencyEdit형의 컴포넌트변수이구요.

    > String과 컴포넌트가 같을 수는 없죠. 그리고 변수로 string을 받아서 컴포넌트를 찾아도 아무 문제가 없더군요.(확인차 테스트 해봤거든요.)

    > 델파이 도움말에 나와 있는 FindComponent함수입니다.

    > indComponent indicates whether or not a given component, AName, is owned by the component.

    >

    > function FindComponent(const AName: string): TComponent;

    >

    > Description

    >

    > FindComponent returns the component in the Components array property with the name that matches the string in the AName parameter. Use to find whether a given component is owned by another.

    > FindComponent is not case sensitive.

    >

    > 분명히 AName이 String형이거든요. 그리고 Return값이 TComponent이니까 TCurrencyEdit형으로 형변환해도 아무 문제가 없어야 정상 아닌가요?

    >



    curr.Name := 'curr';

    에서 물론 당연히 에러가 나겠지요...

    왜냐하면 curr 개체를 만들지 않았으니까요...

    curr.Name := 'curr'이

    객체와 스트링이 같을 수 없다고 하셨는데

    위의 코딩은 curr := 'curr'이 아니라

    curr의 Name 을 'curr'로 설정 한다는 것을

    잘못 보신 듯 합니다.



    그리고 위의 curr 개체를 보시면 동적 생성한 경우

    아마 Name Property 는 ''로 아무값도 없을 겁니다..(Debuger로 확인)

    그렇기 때문에 FindComponent 함수로 찾을 수가 없는 것이지요...



    그렇기 때문에 Name Property 를 먼저 설정해 주라는 뜻이었습니다...



    참고가 되었는지 모르겠군요....



    아.. 물론 FindComponent의 리턴값을 형 변환 하는것은

    문제가 없어 보이는군요...



    그럼 이만...