문제

문서 브라우저가 기본 양식으로있는 델파이 응용 프로그램이 있습니다. 사용자가 문서를 열면 편집기 창이 열립니다. 작업 표시 줄에 버튼이있는 각 편집기와 기본 양식을 갖고 싶습니다. 이 작업을 수행하기 위해 일반 코드를 적용했지만 편집기 창을 사용한 후 기본 양식을 클릭하면 편집기가 맨 위에 남아 있고 초점은 기본 형식에 있습니다. 이 행동의 원인을 해결할 수 없습니다.

스테이지 설정 : 기본 양식과 문서 양식을 열었습니다.

  1. 다른 앱을 클릭하고 기본 양식을 클릭하고 메인 양식은 집중적입니다. (예상대로 행동.)

  2. 문서 양식을 클릭하고 기본 양식을 클릭하면 문서 양식이 앞쪽으로 돌아 오지만 비활성이 표시됩니다. (사진 쇼 결과)

대체 텍스트 http://www.matthew-jones.com/temp_xfer/titlebarfailure.jpg

첫 번째 단계, 이것은 Delphi 2007이며 프로젝트에 있습니다.

Application.MainFormOnTaskBar := True;

기본 양식의 경우 추가 코드가 없습니다.

문서 양식을 위해서는 있습니다

procedure TCommonEditForm.CreateParams(var params: TCreateParams);
begin
  inherited;
  params.WndParent := 0; // GetDeskTopWindow; no diff
end;

이런 일이 발생하는 메시지가 있지만 적절한 것을 찾을 수없는 경우 운동하려고 노력했습니다. "Activate"와 관련하여 코드를 검색했습니다. 단서를 환영합니다!

도움이 되었습니까?

해결책

내 응용 프로그램은 당신이 설명하는 방식으로 작동합니다. 여기에 내가 취한 접근법이 있습니다. 나는 더 간단한 접근 방식을 찾고 싶었지만 결코하지 않았다.

나는이 기사를 읽는 것으로 시작했습니다. 이 첫 번째는 아래의 Peter의 훌륭한 글입니다.

http://groups-beta.google.com/group/borland.public.delphi.winapi/msg/e9f75ff48ce960eb?hl=en

다른 정보도 여기에 발견되었지만 이것은 유효한 해결책이 아닙니다. 제 사용 : http://blogs.teamb.com/deepakshenoy/archive/2005/04/26/4050.aspx

결국 여기에 내가 끝났던 것입니다.

스플래시 화면은 응용 프로그램 기본 형식으로 두 배가됩니다. 기본 양식에는 응용 프로그램 객체와 특별한 관계가 있습니다. 모든 보조 형식을 사용하면 내가 찾고있는 행동이 나에게 제공됩니다.

작업 표시 줄에서 원하는 각 형태에서 CreateParams를 무시합니다. 나는 편집 양식과 사용자가 "기본 형식"으로 보는 것에 대해 이것을합니다.

procedure TUaarSalesMain.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;

Delphi에 관한 한 나의 "주요"형태는 Activitate 기능에 진정한 주요 형태를로드합니다. 첫 번째 활성화를 추적하기 위해 멤버 변수를 사용합니다. 그런 다음 함수의 끝에서 나는 스플래시 양식을 숨기지 만 닫지 마십시오. 사용자가 문서를 편집하고 기본 양식을 닫으면 편집 화면이 동시에 닫히기를 원하지 않았기 때문에 이것은 중요했습니다. 이런 식으로 모든 가시적 형태는 동일하게 처리됩니다.

    if FFirstActivate = false then
      exit;

    FFristActivate := false;

    /* 
       Main Load code here 
       Update Splash label, repaint
       Application.CreateForm
       etc.
    */


    // I can't change visible here but I can change the size of the window
    Self.Height := 0;
    Self.Width := 0;
    Self.Enabled := false;

    //  It is tempting to set Self.Visible := false here but that is not
    // possible because you can't change the Visible status inside this
    // function.  So we need to send a message instead.
    ShowWindow(Self.Handle, SW_HIDE);

  end;

그러나 여전히 문제가 있습니다. 다른 모든 양식을 닫을 때 메인/스플래시 창이 닫으려면 닫으려면 닫으려면 닫으십시오. 플러그인으로 양식을 사용하기 때문에 부모 <> NIL에 대한 긴밀한 루틴을 추가로 점검합니다 (프레임보다 더 잘 작동하는 목적).

나는 유휴 이벤트를 사용하는 것을 정말로 좋아하지 않았지만 이것이 CPU의 드래그 인 것을 알지 못합니다.

{
  TApplicationManager.ApplicationEventsIdle
  ---------------------------------------------------------------------------
}
procedure TApplicationManager.ApplicationEventsIdle(Sender: TObject;
  var Done: Boolean);
begin

  if Screen.FormCount < 2 then
    Close;
end;

{
  TApplicationManager.FormCloseQuery
  ---------------------------------------------------------------------------
}
procedure TApplicationManager.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
  i: integer;
begin

  for i := 0 to Screen.FormCount - 1 do
  begin
    if Screen.Forms[i] <> self then
    begin
      // Forms that have a parent will be cleaned up by that parent so
      // ignore them here and only attempt to close the parent forms
      if Screen.Forms[i].Parent = nil then
      begin
        if Screen.Forms[i].CloseQuery = false then
        begin
          CanClose := false;
          break;
        end;
      end;
    end;
  end;

end;

{
  TApplicationManager.FormClose
  ---------------------------------------------------------------------------
}
procedure TApplicationManager.FormClose(Sender: TObject;
  var Action: TCloseAction);
var
  i: integer;
begin

  for i := Screen.FormCount - 1 downto 0 do
  begin
    if Screen.Forms[i] <> self then
    begin
      // Forms that have a parent will be cleaned up by that parent so
      // ignore them here and only attempt to close the parent forms
      if Screen.Forms[i].Parent = nil then
      begin
        Screen.Forms[i].Close;
      end;
    end;
  end;

end;

이것은 지금까지 나를 잘 섬겼습니다. 내 "메인/스플래쉬"화면의 아이콘이 여전히 표시 되었기 때문에 Vista를 약간 변경했습니다. 나는 그것이 무엇인지 기억 나지 않습니다. 아마도 너비, 높이, 활성화를 설정하고 스플래쉬 화면에서 숨은 메시지를 보낼 필요가 없습니다. 나는 그것이 나타나지 않도록하고 싶었다 :-).

가까운 이벤트를 다루는 것이 필요했습니다. Windows가 종료 메시지를 보냈을 때 필요한 것을 정확하게 기억한다면 나는 주요 형식만이 그 메시지를 얻는다고 생각합니다.

다른 팁

이것이 정말 어리석은 경우 미안하지만 FSSTAYONTOP로 설정된 FormStyle이 없습니까? 이것은이 행동을 설명 할 것입니다.

아마도 이것을 Createparams에 추가하십시오

Params.ExStyle := Params.ExStyle OR WS_EX_APPWINDOW;

또는 코드의 어느 곳에서나 시도해보십시오. 나는 gresecreate 이벤트에서 presonally를 사용합니다.

SetWindowLong(Wnd, GWL_EXSTYLE, 
  GetWindowLong(Wnd, GWL_EXSTYLE) or WS_EX_APPWINDOW) ;

이것의 단점은 기본 형태가 최소화되면 다른 형태가 숨겨져 있지만 기본 형식이있을 때 복원한다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top