Q&A

  • 다른 Unit의 Procedure를 사용하려는데
어렵다고 할 수 없는 문제가 영 안풀려서 질문드립니다.
Procedure와 Function을 올려놓은 Unit에 아래와 같은 Procedure를 만들었습니다.

Procedure DrawDisplayScale;
var YDeltaDisplayScale : integer;
    ii : integer;
begin
  with frmVSData do begin
    Image4.Canvas.Pen.Color := PenColor;
    Image4.Canvas.Pen.Width := PenWidthSupp;
    Image4.Canvas.Brush.Color := BrushColor;
    Image4.Canvas.Font.Color := PenColor;
    Image4.Canvas.FillRect(Rect(0,0,50,220));
    Image4.Canvas.MoveTo(48,0);
    Image4.Canvas.LineTo(48,220);
    YDeltaDisplayScale := Round(100.0*Yscale);
    for ii := 1 to 10 do begin
      Image4.Canvas.MoveTo(48,220-YDeltaDisplayScale*ii);
      Image4.Canvas.LineTo(40,220-YDeltaDisplayScale*ii);
      if ii < 10 then
        Image4.Canvas.TextOut(15,213-YDeltaDisplayScale*ii,IntToStr(ii*100))
      else
        Image4.Canvas.TextOut(10,213-YDeltaDisplayScale*ii,IntToStr(ii*100));
    end;
  end;
end;

보시면 아시겠지만 frmVSData란 Form에 있는 Image4에 간단한 스케일을 그리는 기능입니다.
frmVSData는 VSData란 Unit에 딸린 Form이고요.
그런데 정작 VSData Unit의 FormCreate에서 DrawDisplayScale; 을 하면 동작을 하지않네요.
그 자리에 Procedure 내부에 있는 문장을 써넣으면 그때는 동작을 합니다.

또 하나 이상한 것은 VSData Unit의 FormCreated 외의 다른 부분과
VSData Unit이외 다른 Unit에서는 DrawDisplayScale;하면 동작을 한다는 것입니다.

Uses에도 문제는 없는 것으로 보이는데
어떤 경우에 이런 현상이 생길수 있는 것일까요?
8  COMMENTS
  • Profile
    소나기 2010.02.23 05:23
    FormCreate 말고 다른 부분에 넣어 보세요.

    FormCreate 부분은 컴포넌트의 생성을 주로 하는 부분이고

    Form안에 있는 대부분의 컴포넌트는 보여지지 않고 있기 때문에 그려봐야 보이지 않습니다.

    보통 그리는 부분은 OnPaint 나 OnShow 같은 부분에서 해줘야 하겠죠.
  • Profile
    소나기 2010.02.23 05:26
    아 홈페이지를 가보니

    의료기기쪽에서 일하시나보네요.
    전 원주의료기기 단지에서 일하고 있습니다. ^^
    예전에 저도 ECG 쪽 작업도 하고 했었는데
    지금은 DR 쪽 작업하고 있습니다. 오랫만에 의료기기쪽 일하시는 분을 보니 반갑네요.
  • Profile
    장성호 2010.02.23 11:59
    소나기님의 말씀과 같이 FormCreate부분에 코드를 넣어서 그런데요..

    원인에 대한 설명은 좀 틀렸네요

    델파이 메뉴의 Project-> View Source 를 클릭하시면 다음과 같은 소스를 보실수 있을것입니다.

    <!--CodeS-->
    begin
    Application.Initialize;
    Application.CreateForm(TfrmVSData , frmVSData );
    Application.Run;
    end.
    <!--CodeE-->

    Auto-create폼인경우
    TApplication클래스의 CreateForm 이라는 메소드를 통해서
    Form을 생성하는데요

    위코드에서 CreateForm부분을 설명하면

    TfrmVSData라는 클래스를 create 하여서 frmVSData라는 변수에 할당합니다.

    TfrmVSData.Create 할때 TfrmVSData의 생성자도 호출되고 폼의 OnCreate이벤트도 호출되는데요

    그런데 문제는 Form의 OnCreate이벤트가 호출되는 시점에는
    아직 frmVSData라는 변수에는 쓰레기값이나 nil이 들어있다는것입니다.

    DrawDisplayScale 함수에서는
    쓰레기 값이 들어있는 frmVSData라는 변수를 가지고 접근하기 때문에 문제가 발생하는것입니다.

    음.. 다음과 같이 하면 frmVSData 이벤트 핸들러에서도
    DrawDisplayScale 함수 호출에 문제가 없을것입니다.

    <!--CodeS-->

    procedure TfrmVSData.FormCreate(Sender: TObject);
    begin
    frmVSData:=self;
    DrawDisplayScale;
    end;
    <!--CodeE-->


    그럼..
  • Profile
    소나기 2010.02.23 19:01
    장성호님 제가 알기론 Form이 기본적으로 생성된 후에

    DoCreate 문에 의해서 FormCreate 문이 실행되는 걸로 알고 있습니다.

    그렇기 때문에 FrmVSDate 는 nil 일 수 없습니다.

    위에 이용벽님이 질문하신 내용 중에 프로시져는 실행이 제대로 될 겁니다.
    윈도우는 안보일 경우 그리지 않습니다.

    일단 그려진다고해도 Form 자체가 Show 되기 전에 Resize를 하게 되면서 지워지겠죠.

    그럼.

  • Profile
    이용벽 2010.02.23 19:32
    우선 두분께 감사드립니다.
    장성호님 말씀하신 대로 해보니 제가 원했던 동작이 그대로 나오는 군요. 감탄했습니다.
    델파이의 세계가 눈에 보이는 것 외에도 깊고 깊다는 생각을 하게 되네요.
    저도 그 세계에 들어가고 싶은 욕심이 최근들어 계속 생기는데 어떤 가이드를 따라야 할지가 고민입니다.
    하지만 뜻이 있으면 길이 보이겠죠.

    소나기님 의료기기 분야에서 일하신다니 반갑습니다.
    소나기님이 말씀하신 것도 계속 시도해 볼 생각입니다.
    의료장비에서 나오는 신호인 SpO2, ECG, HR등을 PC에서 처리하는 작업을 하고 있는데
    중간에 막힐 때마다 이 커뮤니티에서 답을 찾아 누비고 다니면서 이루 말할 수 없는 도움을 받고 있습니다.
    저도 언젠가는 여기에서 남에게 도움을 줄 수 있어야 한다는 의무감도 느끼게 됩니다.

    두분 앞으로도 종종 만나게되기를 바랍니다. 당분간은 도움을 청하는 경우가 되겠지만요.
  • Profile
    소나기 2010.02.23 19:45
    Patient Monitor 쪽 작업 하시나 보네요.

    의료기기 쪽에 특화된 기능 같은 경우 제가 아는데 까지 알려 드리겠습니다. ^^

    그리고 장성호님이 말씀해주신 데로 되었다니 다행이네요.

    에효 그럼 다행이긴 한데 제가 잘못알고 있는 건지 저도 다시 확인을 해봐야 하겠네요.
  • Profile
    이용벽 2010.02.23 20:08
    소나기님 말씀대로 OnShow(FormShow)에서 해봤습니다.
    결과는 장성호님 방법과 동일합니다. 제가 원했던 동작입니다.
    지금까지 FormCreate 만 써왔던 것을 반성하게 되네요.
    두분 덕분에 가까운 곳에 다양한 길이 있음을 알게되었습니다.

    소나기님 말씀대로 Patient Monitor를 개발하는 일을 하고 있습니다.
    3월에 COEX에서 열리는 KIMES에서 한번 만날수 있을지 모르겠네요.
  • Profile
    장성호 2010.02.23 22:50
    소나기 님 제가 틀렸네요..

    깨우침을 주셔서 감사합니다.

    제대로 확인해보지 않고 답변드렸네요

    죄송합니다.

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

    Application.CreateForm(TfrmVSData , frmVSData );


    위와같이 Form이 생성될때는 FormCreate이벤트가 발생하는 시점에
    frmVSData변수에 이미 할당이 되어있구요

    문제는
    다음과 같이 Auto-Create가 아닌경우에
    TfrmVSData 폼의 FormCreate이벤트가 발생하는 시점에
    frmVSData변수에 할당이 되어있지 않네요.


    frmVSData :=TfrmVSData .Create(Application);



    이용벽님께서 어쩌면 auto-create가 아닌 방식으로 Form을 새성한것이 아닌가 하는 생각이 드네요

    그럼..
    • 이용벽
    • 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
      쉐어인듯합니다... 체크박스 사용이 편한 그리드는 상용그리드로 넘어가면 무수히 많이 있습니다.