Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Блокирование крестика-выхода


Автор: Ganoci 16.5.2008, 13:24
Ребят, подскажите пожалуйста как можно (если это возможно) заблокировать на форме в Delphi (конечно когда программа запущена) крестик-выход, т.к. имеется кнопка выхода?
При этом два других компонента (свернуть/развернуть) пускай останутся как есть...

Хорошо если этого крестика вобще не будет видно, но сойдет, чтобы он был неактивным.

Автор: Poseidon 16.5.2008, 13:30
Можно просто отключить возможность закрытия окна по этому "крестику"

Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caNone;
end;


А вот диактивирование кнопки [X]
Код
procedure TForm1.FormCreate(Sender: TObject);
var
hwndHandle: THANDLE;
hMenuHandle: HMENU;
iPos: Integer;

begin
hwndHandle := FindWindow(nil, PChar(Caption));
if (hwndHandle <> 0) then
  begin
     hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
     if (hMenuHandle <> 0) then
     begin
       DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
       iPos := GetMenuItemCount(hMenuHandle);
       Dec(iPos);
         { Надо быть уверенным, что нет ошибки т.к. -1 указывает на ошибку }
       if iPos > -1 then
         DeleteMenu(hMenuHandle, iPos, MF_BYPOSITION);
     end;
  end;
end;

Автор: Qu1nt 16.5.2008, 13:36
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  hMenuHandle : HMENU;
begin
  hMenuHandle := GetSystemMenu(Handle, False);
  if (hMenuHandle <> 0) then
    DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
end;

Ы?

Автор: Poseidon 16.5.2008, 13:44
Qu1nt, в твоем варианте появляется некрасивость в виде разделительной линии в системном меню окна. Нужно и его удалять, раз удаляешь пункт меню, который он отделяет.

Автор: Qu1nt 16.5.2008, 14:00
Не заметил, получается немножко длиннее:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  hMenuHandle : HMENU;
begin
  hMenuHandle := GetSystemMenu(Handle, False);
  if hMenuHandle = 0 then
    Exit;
  DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
  if GetMenuItemCount(hMenuHandle) > - 1 then
    DeleteMenu(hMenuHandle, GetMenuItemCount(hMenuHandle) - 1, MF_BYPOSITION);
end;

Автор: Ganoci 16.5.2008, 14:11
Poseidon
Qu1nt 
Не вижу принципиальной разницы в результате.
Поэтому огромное вам спасибо!

Автор: Poseidon 16.5.2008, 15:14
Цитата(Ganoci @  16.5.2008,  14:11 Найти цитируемый пост)
Не вижу принципиальной разницы в результате.
Разница в системном меню. Первый вариант Qu1nt выдавал вот такое меню:
http://ipicture.ru/

черта внизу - это разделитель. Он там лишний, т.к. по умолчанию он разделяет пункт "Закрыть" от всех остальных. Раз "Закрыть" удалили, то и этот разделитель тоже нужно бы удалить. Во втором варианте Qu1nt это исправил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)