2010-05-04 6 views
1

나에게 이상한 문제가 있지만 잘만되면 다른 사람에게 이상하지는 않습니다. :) 배경 : 나는 사용자가 여러 수신자에게 메시지를 브로드 캐스트 할 수 있도록하는 간단한 IM 클라이언트에서 작업 중이다. 목표는 브로드 캐스트 메시지의 텍스트를 포함하는 각 수신자에 대한 채팅 양식을 만든 다음 수신자가 브로드 캐스트에 응답하는 경우에만 해당 양식을 표시하는 것입니다. 그러나 응용 프로그램이 응답을 받으면 Application.OpenForms를 사용하여 특정 채팅 세션에 대한 양식을 찾으려고 시도 할 때 해당 세션을 찾을 수 없습니다. 만든 시간이 아니라면 표시 할 수 없습니다. 이 양식을 만들 때이 양식을 표시하지 않으려는 것은 사용자가 화면에 플래시가 표시된다는 것을 의미하기 때문입니다. 양식을 으로 만들지는 않겠지 만 처음에는 표시하지 않고이 작업을 수행 한 것처럼 보입니다. 아무도 도와 줄 수 있습니까?양식을 인스턴스화 한 다음 처음에 양식을 표시하지 않고 나중에 찾으십시오.

필요한 경우 코드 스 니펫을 제공 할 수 있지만 코드의 버그보다 개념적으로 오해 된 것 같아서이 포스트에 없었습니다. 미리 감사드립니다!

답변

2

을 대신 기본 클래스로 양식을 사용하는가, 그것을 다른 방법을 수행합니다을 만들 폼을 참조 할 수있는 클래스. 그렇게하면 클래스에 콘텐츠에 대한 정보를 제공하고 양식에 반영합니다 (초기화 된 경우). 개체의 기초로 Forms를 사용해서는 안됩니다. Application.OpenForms 을 사용하면이 필요합니다.

public class Contact 
{ 
    string displayname = String.Empty; 
    List<Message> history = new List<Message>(); 
    MessageForm theform = new MessageForm(this); 

    public void OnEvent(Message msg) 
    { 
     if(msg.Sender != me && !theform.Visible) 
      theform.Show(); 

    } 

    public void Tell(string message) 
    { 
    } 

} 

목록 일종의 연락처를 유지하고, 상황이 비교적 간단해야한다. (Windows 폼은 스레드로부터 안전하지 않으므로 주 스레드와 다른 스레드에서 컨트롤의 속성을 변경하려고하면 예외가 발생 함)

+0

의견을 보내 주셔서 감사합니다. @ Jarle Moe, 이것은 기존 코드에 통합하는 것이 가장 쉬운 제안처럼 보입니다. 내 질문에 답을 얻은 후에 (나는 잘못하고 있었음) 나는이 질문이 닫힐 수 있다고 생각한다. – awilson53

0

windows 폼에는 Hide(), Show() 및 Activate()와 같은 메서드가 있습니다. 이 방법을 사용하십시오.

채팅 세션과 형태에 대한 참조를 저장하고 양식을 표시해야 할 때 .Show()를 호출하는 것을 사용하지 왜
0

:

session.form.Show(); 

당신은 다음을 표시하지 않고 양식을 만들 수 있습니다 당신은 '돈을 참조 할 때마다 Application.OpenForms에 전화하는 오버 헤드가 있습니다.

나는 이것이 명백하다는 것을 알고 있지만 OpenForms은 열려 있지 않기 때문에 표시되지 않은 양식을 찾지 못할 것입니다. 양식은과 같이 수동으로 할당 할 수 있습니다 나타날 때까지 양식 핸들이 생성되지 않기 때문에

0

:

mf = new MainForm(); 

     /* Need to assign a handle to MainForm instance manually 
     as handle does not get created until form is shown */ 
     IntPtr handle = mf.Handle; 
관련 문제