Q&A

  • 질문] 어레이에 할당을 쉽게하는 법
안녕하세요, 이곳에서 많은 도움을 받고 있는 초보입니다.
또, 질문이 생겼습니다.

화면에 4각형의 shape을 100개를 만들었습니다.
이 모양들을 각각 어레이에 할당하여 색의 변환을 쉽게 하고 싶습니다.

변수 선언부에는
Myshape:Array[1..100] of Tshape; 로 선언해주고 아래와 같이 하려고 합니다.
아래에서 shape1 으로 표기되는 것은 폼에 만들어진 모양의 name 속성입니다.

myshape[1] := shape1;
myshape[2] := shape2;
myshape[3] := shape3;
myshape[4] := shape4;
myshape[5] := shape5;
myshape[6] := shape6;
myshape[7] := shape7;
...
myshape[100] := shape100;

이것을 간단히 for 루프로 처리할 수는 없는지요?
100개 모두 이렇게 할당을 해주어야하는지요..

(실제로는 제가 하려는 모양이 1100개나 됩니다.)이것을 모두 이렇게 선언하자니 날 새는것 같아서요.
간단한 방법 있으면 알려주시길 부탁드립니다.

고맙습니다.
4  COMMENTS
  • Profile
    이윤도 2010.02.17 04:36
    <!--CodeS-->
    procedure TForm1.FormCreate(Sender: TObject);
    var
    iCnt: Integer;
    begin
    for iCnt := 1 to 100 do begin
    Myshape[iCnt] := TShape(FindComponent('Shape' + IntToStr(iCnt)));
    end;
    end;
    <!--CodeE-->
  • Profile
    노정윤 2010.02.17 09:55
    1100 개나 되는 컴포넌트라면 차라리 동적 생성 하는 게 낫지 않을까요? 일일이 손으로 생성하는 것도 만만치 않은 일일 것 같습니다.



    procedure TForm1.FormCreate(Sender : TObject);
    var
    i : integer;
    begin
    for i := low(MyShape) to high(MyShape) do
    begin
    MyShape[i] := TShape.Create(Self);
    // 적당한 위치, 크기 할당 코드들 (ini 등에서 읽어오거나...)
    end;
    end;

  • Profile
    장성호 2010.02.17 10:43
    노정윤님이 얘기하신대로 저도 동적생성을 추천합니다.

    하지만 굳이 위와같은 방식대로 하고자한다면

    이윤도 님께서 하신 방법이 있습니다만..

    FindComponent함수의 원리를 이해하면 위 방식이 좀 비효율적인 방식입니다.
    Form위에 Component의 갯수가 많으면 많을수록

    FindComponent함수내에서는
    Form위에 올려진 Component의 갯수만큼 루프를 돌면서 주어신 문자열과 같은 compoent를 찾습니다.
    두번호출하면 또다시 처음부터 루프를 돌게되죠
    100번호출하면 100번을 처음부터 루프도는것을 반복하게 되는것입니다.
    항상 처음부터 끝까지 루프 도는것은 아니지만 매우 비효율적이지요

    루프를 딱 한번만 돌아도 위 컴포넌트를 모두 찾을수 있을것입니다.


    var
    MyShape: array[1..1000] of TShape;

    procedure TForm1.FormCreate(Sender: TObject);
    var
    idx,num: Integer;
    sCompName: String;
    begin
    //
    for idx:=0 to ComponentCount-1 do
    begin
    if Components[idx] is TShape then
    begin
    sCompName:=Components[idx].Name;
    sCompName:=RightStr(sCompName,Length(sCompName)-5);
    if TryStrToInt(sCompName,num)then
    begin
    MyShape[num]:=TShape(Components[idx]);
    end;
    end;
    end;
    end;






  • Profile
    김동원 2010.02.17 17:54
    대단히 감사합니다. 해결했습니다.역쉬..고수님들은 틀리십니다.
    • 이용벽
    • 2010.02.23 03:22
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 소나기
      2010.02.23 05:23
      FormCreate 말고 다른 부분에 넣어 보세요. FormCreate 부분은 컴포넌트의 생성을 주로 하는 부분이고...
    • 소나기
      2010.02.23 05:26
      아 홈페이지를 가보니 의료기기쪽에서 일하시나보네요. 전 원주의료기기 단지에서 일하고 있습니다....
    • 장성호
      2010.02.23 11:59
      소나기님의 말씀과 같이 FormCreate부분에 코드를 넣어서 그런데요.. 원인에 대한 설명은 좀 틀렸네요...
    • 소나기
      2010.02.23 19:01
      장성호님 제가 알기론 Form이 기본적으로 생성된 후에 DoCreate 문에 의해서 FormCreate 문이 실행되...
    • 이용벽
      2010.02.23 19:32
      우선 두분께 감사드립니다. 장성호님 말씀하신 대로 해보니 제가 원했던 동작이 그대로 나오는 군요. 감...
    • 소나기
      2010.02.23 19:45
      Patient Monitor 쪽 작업 하시나 보네요. 의료기기 쪽에 특화된 기능 같은 경우 제가 아는데 까지 알...
    • 이용벽
      2010.02.23 20:08
      소나기님 말씀대로 OnShow(FormShow)에서 해봤습니다. 결과는 장성호님 방법과 동일합니다. 제가 원했던...
    • • • •
    • 오선진
    • 2010.02.23 02:54
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 소나기
      2010.02.23 06:05
      $0F 가 보통 MMX 코드를 나타내는데 그 뒤에 값을 잘 모르겠습니다. 연산이 아마도 MMX 코드를 이용해...
    • 소나기
      2010.02.23 06:18
      음 근데 생각해 보면 보통 $01 이 기계어로 Add 니까. ADD ECX, EAX 와 비슷한 코드 같은데 ㅡ_ㅡ;;
    • phono
      2010.02.23 20:00
      함수의 전체 소스가 저부분 뿐인가요? 보통 인라인 어셈을 쓰면.., function xxxxxx(...):dword; s...
    • 최용일
      2010.02.26 06:15
      리턴값은 EAX로 넘어올것입니다.
    • 백록화
      2010.02.22 19:21
      쿨럭...죄송합니다. 질문을 잘못이해했군요..아 게임 그만 해야지...-.-
    • 홍성락
      2010.02.22 23:07
      엑티브엑스나 DLL등에서 Application.ExeName나 paramStr(0)로하면 자기를 실행시킨 exe파일명이 반환됩...
    • 최진영
    • 2010.02.22 09:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최진영
      2010.02.23 11:12
      추가 발견 DBGrid1만 그런 것이 아니고 포커스가 위치했던 DBGrid에 포커스가 오질 않네요( 메인폼의 ...
    • 이도형
      2010.08.16 19:45
      formshow의 create할때 create(application)으로 하셧나요?? create(nil)로 하면 에러나 포커스이동 잘...
    • HEIM
      2010.02.20 01:56
      그런 경우 전 XP에서 델파이 7으로 그냥 개발합니다. 비스타나 윈도우7에서 프로그램을 돌리도록 하기 ...
    • 엄마미안
      2010.02.20 02:35
      저메세지는 말그대로 저 위치에 bpl 파일이 없어서 나오는 메세지인데요. 경로 확인부터 한번 정확히 해...
    • 이희용
      2010.02.22 19:00
      권한 문제로 인하여 발생하는 문제 인듯 합니다. 어드민 계정을 활성화 하여 개발 하시면 될 듯 합니다....
    • 이강석
      2010.02.23 00:05
      UAC를 끄고 해보세요~
    • 김동원
    • 2010.02.19 18:07
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이강석
      2010.02.19 18:26
      IsDir이라는 함수도 있나요~~Delphi내장함수도 아니고~~Window API도 아닌거 같은데요~~
    • 김병윤
      2010.02.23 02:02
      강민주님이 만들어두신 함수 검색하니 나오네요 함수 정의하고 사용하세요... <!--CodeS--> {!~...
    • 이강석
      2010.02.23 02:42
      하나 덧붙이자면 DirectoryExsists()함수를 쓰시면 됩니다....또한 위 함수나 제가 말씀드린 함수는 Wind...
    • 엄마미안
      2010.02.20 22:29
      엑셀이 타불러형(표 형태)의 자료라면 ADO를 이용해서 연결하셔서 데이터베이스의 테이블 처럼 검색해내...
    • 띵아
      2010.02.24 06:57
      감사합니다. ^^
    • KDDG_Hoya
      2010.02.23 01:13
      상관 없을 것 같습니다만... 정확히 에러메세지가 어떻게 나는지 보았으면 하네요 ^^;
    • 초보임당
      2010.02.23 03:16
      위의 오류는 버퍼 크기때문에 발생햇던거 같습니다...일단 받기는 받는데...한글이 깨지네요.. 1. 서...
    • KDDG_Hoya
      2010.02.23 18:25
      구조체로 보냈으니 구조체로 받아야 하지 않을까 합니다만.. 저도 indy9 쓰다가 예전에 10으로 한적이...
    • 김동원
    • 2010.02.17 04:10
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이윤도
      2010.02.17 04:36
      <!--CodeS--> procedure TForm1.FormCreate(Sender: TObject); var iCnt: Integer; begin ...
    • 노정윤
      2010.02.17 09:55
      1100 개나 되는 컴포넌트라면 차라리 동적 생성 하는 게 낫지 않을까요? 일일이 손으로 생성하는 것도 만...
    • 장성호
      2010.02.17 10:43
      노정윤님이 얘기하신대로 저도 동적생성을 추천합니다. 하지만 굳이 위와같은 방식대로 하고자한다면 ...
    • 김동원
      2010.02.17 17:54
      대단히 감사합니다. 해결했습니다.역쉬..고수님들은 틀리십니다.
    • 이의성
    • 2010.02.17 03:07
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이강석
    • 2010.02.16 22:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이강석
      2010.02.19 18:29
      시작프로그램으로 도저히 안되서 네이버랑 구글링하다가 작업스케쥴러로 하는 방법으로 바꿨습니다... ...
    • delpia
    • 2010.02.12 04:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.02.12 09:55
      Tmemo에 엔터키 입력시 2byte로 나오는 것은 CRLF 값이 입력되기 때문입니다. 그러므로 TMemo.Lines...
    • 띵아
    • 2010.02.11 05:12
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.02.11 08:48
      쩝~ administrator계정 하나 더 만들고 그 계정으로 들어가서 해보세요. 참고로... 여기는 델파이 개...
    • 띵아
      2010.02.11 23:07
      네 감사합니다. 음 이런거도 델파이 프로그램으로 개발할수 있으면 한번 해볼까해서요 ^^
    • 김정은
      2010.02.16 23:56
      브이엠웨어?
    • 띵아
      2010.02.19 05:50
      브이엠웨어 검색해서 다운받아 써보려 하고 있는데 영어 실려 엄청 딸리네요 쩝 음 대충대충 어에 어에...
    • 이의성
    • 2010.02.11 01:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 바람
      2010.02.11 01:59
      procedure TForm1.cedAmtChange(Sender: TObject); begin if TCurrencyEdit(sender).Value > 0...
    • 이의성
      2010.02.11 03:34
      감사합니다~~ 잘 해결되었습니다. ^^
    • 최용일
      2010.02.11 09:32
      잘 되는데요... 다만, 배열의 크기가 너무 크군요... 동적으로 생성하실게 아니면 배열의 크기를 줄이세요.
    • 김우현
      2010.02.11 16:48
      네.. 감사합니다. 오늘 출근하면서 버스안에서 코딩을 다시 점검하니 잘 돼네요. 배열의 크기를 동...
    • 김우섭
    • 2010.02.10 06:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 엄마미안
      2010.02.20 22:33
      쉐어인듯합니다... 체크박스 사용이 편한 그리드는 상용그리드로 넘어가면 무수히 많이 있습니다.