음...
Update
Panel1->Update()를 기다리는 동안 반복해서 호출하는것도 한 방법이기는 하지만..
만약 Form전체가 다른 어플에 가려졌다가 나타나면.. Panel외에 다른 부분의 화면 업데이트가 안되는 문제가 있습니다.
ProcessMessage
또한
Application->ProcessMessage() 함수는
현재쓰레드에서 메세지큐의 메세지가 있으면 메세지를 처리해주는 함수이빈다.
PeekMessage
TranslateMessage
DispatchMessage
를 반복해서 호출하여 화면업데이트및 현재 쓰레드에서 일어나는 모든 메세지를 처리합니다.
그런데 문제는
동작중이 함수에서
Application->ProcessMessage() 가 들어가있으면
이 함수가 다시 호출될 가능성또한 있다는것입니다.
만약 ButonClick이나 Timer같은데서 함수를 호출했다면 매우 주의해야죠
다음 링크에 퀴즈를 통해 그 문제점을 지적해 두고 있습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=981
추천 방법
어떤 함수 처리에 긴 시가닝 소요 되는 함수라면..
그 함수에서 gui에 접근을 없애고..
thread에서 처리하도록 하기를 권합니다.
thread에서 I/O작업을 한다면
GUI 업데이트에서 아무 문제가 없겠죠..
또 Panel을 이용하면 ..
Panel이 나타나있는 동안 다른 control에 접근도 가능합니다.
Button이나 edit에 무엇인가 입력을 할수도 있겠죠
이경우 Panel대신 Form을 하나 만들어서 그 폼을 작업끝날때까지 Modal로 띄워 두시고..
작업이 끝나면 Modal-Form을 close하시면 되지 않을까 싶습니다.
그럼..
지금 시작 님이 쓰신 글 :
: 김태선님 말씀처럼 update()함수를 불러도 되고 Application->ProcessMessage()를 불러도 되더군요 ㅎㅎ
: 두개 차이점이 있나요?
:
: 답변주셔서 감사합니다~
:
: 김태선 님이 쓰신 글 :
: : VCL 컨트롤은 VCL의 메시지 루프로 가야 대부분 화면 갱신이 됩니다.
: : 하지만 그렇지 않고
: : for 루프에서 컨트롤의 내용을 변화시키고 보이게 하려면
: :
: : 각 컨트롤에 보면 Update(); 메소드가 있는데 이를 호출해 주면 됩니다.
: : Panel 같은 컨테이너 컨트롤의 경우는 담고 있는 컨트롤에 자동 업데이트 통보를 하므로
: : Panel만 업데이트 해주면 됩니다.
: :
: : Panel1->Update();
: :
: : 이런 식으로 처리하면 됩니다.
: :
: :
: : 지금 시작 님이 쓰신 글 :
: : : 안녕하세요.
: : :
: : : 버튼을 누르면 for루프에서 10초정도 다른 작업(IO카드에서 데이터를 읽습니다)을하고 종료되는 프로그램을 하고 있습니다. 헌데 버튼을 누르면 화면에 표시가 안되기때문에 작업중인지 작업이 끝났는지 쉽게 확인할 수가 없었습니다. 그래서 패널을 하나 생성고 버튼을 누르면 "작업중입니다" 라고 패널의 visible속성을 true로 하여 화면에 보여주고 루프를 돌고 끝나면 다시 패널의 visible속석을 false로 하여 패널을 감추려고 하고 있습니다.
: : :
: : : 근대 여기서 패널이 뜨긴하는대 반쯤 생성되다 말았다고 해야하나... 캡션도 안보이고 패널 라인도 안보이고 그냥 패널색상만 표현되고 멈춰있습니다. 그런후 르프가 끝나면 그냥 사라져 버리는군요...
: : : 근대 또 이상한것은 패널을 보여준후에 showmessage를 사용하여 메시지를 하나띄우면 패널을 제대로 보여집니다.
: : :
: : : 어떤 문제때문일까요?
: : :
: : : 혹시 루프때문에 그런거면 어떤 방법으로 사용자가 현재 작업이 진행되고 있음을 알도록 화면에 보여줄 수 있을지...
: : :
: : : 아시는분 답변좀 부탁드립니다~~