Form Style - fsStayOnTop 효과

 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)

<-> SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

 

출처 :  http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=41&indx=405581&keyword1=fsStayOnTop&keyword2=

이 글은 스프링노트에서 작성되었습니다.

 폼 소스 부분은 생략하고 처리부분만 기술한다.

  • Form Style : fsStayOnTop
  • 해당 폼을 TObject 형태로 구현 함수로 넘긴다
    (경우에 따라서 TForm으로 넘기던지 상속클래스 만들어서 넘기던지...그건 알아서...단, 구현부분 파라메터 타입과 구현부분도 거기에 맞추어서 ^^)

 

 

 구현 부분

  1. procedure ShowSaveDialogBox(Sender : TObject = nil)
  2. var
  3. saveDlg : TSaveDialog;
  4. SenderFormStyle : TFormStyle;
  5. isSenderFormStyleChange : Boolean;
  6. begin
  7. isSenderFormStyleChange := False;

    if (Sender <> nil) and Assigned(Sender) and (Sender is TForm) then

    saveDlg := TSaveDialog.Create(TForm(Sender))

    else

    saveDlg := TSaveDialog.Create(nil);

  8. saveDlg.Title := '파일 저장';
  9. saveDlg.Filter := 'TEXT 파일|*.txt';
  10. saveDlg.DefaultExt := 'txt';
  11. saveDlg.Options := saveDlg.Options + [ofOverwritePrompt];
  12. saveDlg.FileName := 'ExportText' + '.xls';
  13. if (Sender <> nil) and Assigned(Sender) and (Sender is TForm) and (TForm(Sender).FormStyle = fsStayOnTop) then
  14. begin
  15. //BEGIN 1안. 폼을 아래로 위치 시킨다(사라지는 효과 나타남)
  16. TForm(Sender).SendToBack;
  17. isSenderFormStyleChange = True;
  18. //END 1안.
  19. //BEGIN 2안. 폼을 일반 폼으로 변경함(화면이 심하게 깜빡거리는 단점)
    SenderFormStyle := TForm(Sender).FormStyle;
  20. isSenderFormStyleChange := True;
  21. TForm(Sender).FormStyle := fsNormal;
  22. Application.ProcessMessages; //(생략가능 혹시나 해서.....^^;;)
  23. //END 2안.
  24.  end;
  25. if saveDlg.Execute then
  26. begin
  27.  {처리 코드}
  28. end;
  29. if isSenderFormStyleChange = True then

    begin

  30. //1안.
  31. TForm(Sender).BringToFront;
  32. //2안.
  33. TForm(Sender).FormStyle := SenderFormStyle;
  34. Application.ProcessMessages; //(생략가능 혹시나 해서.....^^;;)
  35. end;
  36. end;

 

출처 : 자작(userpark)

이 글은 스프링노트에서 작성되었습니다.

 Showmessage 박스 Owner가 Application으로 되어져 있는 현상 때문에 Form이 StayOnTop일 경우 아래에 숨어버리는 현상 발생

해결 방법은 아래 소스.... Screen.ActiveForm을 이용한 방법

 

  1. TForm1 = class(TForm)
  2. {...생략...}
  3. procedure OnScreenActiveFormChange(Sender: TObject);
  4. private
  5. {...생략...}
  6. protected
  7. {...생략...}
  8. public
  9. {...생략...}
  10. end;
  11. procedure TForm1.FormCreate(Sender: TObject);
    begin
  12. Screen.OnActiveControlChange := OnScreenActiveFormChange;
  13. end;
  14. procedure TfrmUbBase_S.OnScreenActiveFormChange(Sender: TObject);
  15. begin
  16. if Assigned(Screen.ActiveForm) and ( (UpperCase(Screen.ActiveForm.ClassName) = UpperCase('TMessageForm')) ) then
  17. begin
  18. SetWindowPos(Screen.ActiveForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
  19. end;
  20. end;

 

출처 : 델마당 for Modify By Userpark

이 글은 스프링노트에서 작성되었습니다.

 Showmessage 박스 Owner가 Application으로 되어져 있는 현상 때문에 Form이 StayOnTop일 경우 아래에 숨어버리는 현상 발생

해결 방법은 아래 소스.... Screen.ActiveForm을 이용한 방법

 

  1. TForm1 = class(TForm)
  2. {...생략...}
  3. procedure OnScreenActiveFormChange(Sender: TObject);
  4. private
  5. {...생략...}
  6. protected
  7. {...생략...}
  8. public
  9. {...생략...}
  10. end;
  11. procedure TForm1.FormCreate(Sender: TObject);
    begin
  12. Screen.OnActiveControlChange := OnScreenActiveFormChange;
  13. end;
  14. procedure TfrmUbBase_S.OnScreenActiveFormChange(Sender: TObject);
  15. begin
  16. if Assigned(Screen.ActiveForm) and ( (UpperCase(Screen.ActiveForm.ClassName) = UpperCase('TMessageForm')) ) then
  17. begin
  18. SetWindowPos(Screen.ActiveForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
  19. end;
  20. end;

 

출처 : 델마당 for Modify By Userpark

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts