Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
RAD XE3+

Как перехватить событие кнопки biMaximize ?

21.01.2020, 17:20. Показов 2216. Ответов 17

Студворк — интернет-сервис помощи студентам
Подскажите как сделать так, чтобы кнопка Maximize оставалась на форме, но при нажатии на неё форма не разворачивалась на весь экран, а срабатывал этот код (где FOptions - форма на которой кнопка Maximize):

Delphi
1
2
3
4
if FOptions.Height <> 501 then
  FOptions.Height := 501
else
  FOptions.Height := 240;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2020, 17:20
Ответы с готовыми решениями:

Как в TMemo перехватить событие WM_COPY
Здравствуйте! Напишите пожалуйста, как в TMemo перехватить событие WM_COPY ?

Как вызвать событие кнопки, если я знаю номер кнопки?
У меня на форме несколько кнопок. Как вызвать событие кнопки, если я знаю номер кнопки. Например 20 кнопок, номер 10, значит кнопка button10

Событие OnMouseMove одной кнопки, при зажатии другой кнопки
Есть две кнопки. Можно ли как-то сделать так, чтобы событие OnMouseMove одной кнопки работало только тогда, когда активно событие...

17
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
21.01.2020, 17:48
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
  protected
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MAXIMIZE then
  begin
    if Height <> 501 then Height:= 501
    else Height := 240;
  end else inherited;
end;
 
end.
2
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
21.01.2020, 18:20  [ТС]
Я уже видел этот код на форуме, он перехватывает событие, но не так как мне надо. То-есть высота формы сначала делается на 501, а потом сразу на 240 возвращается (при одном нажатии). При этом если убрать else Height := 240;, то она становится равной 501, но при втором нажатии (когда высота формы будет равна 501) она, естественно, не вернётся на 240.
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,428
21.01.2020, 22:24
KopHack, попробовал код на D7 и XE3, всё отлично работает, никакого двойного срабатывания.
0
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
21.01.2020, 23:27
Цитата Сообщение от KopHack Посмотреть сообщение
при одном нажатии
Возможно кнопка мышки даёт двойное срабатывание.
1
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
22.01.2020, 00:51  [ТС]
AzAtom, Я делаю на Rad 10.3, не работает. Делал даже принудительный выход в каждой ветви, всё-равно: меняется, потом возвращается.

Добавлено через 4 минуты
UR1004SWL, Тогда и на других элементах было бы двойное срабатывание, но его нет.

Добавлено через 8 минут
Есть какой-то другой способ перехватить? Может есть событие какое-то, хотя я там все проверил, но всё-же. Как, например, для кнопки biSystemMenu есть Event: OnCloseQuery.
0
 Аватар для Modesty
42 / 35 / 26
Регистрация: 29.11.2013
Сообщений: 77
22.01.2020, 05:06
Цитата Сообщение от KopHack Посмотреть сообщение
Я делаю на Rad 10.3, не работает.
Проверил на, 10.3 работает.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
22.01.2020, 06:32
Цитата Сообщение от KopHack Посмотреть сообщение
Делал даже принудительный выход в каждой ветви, всё-равно: меняется, потом возвращается.
Принудительный выход делать не стоит, в приведенном коде за один проход процедуры нельзя одновременно попасть и в then и в else секции. Тут что-то одно. Соответственно, у вас от ОС приходит два сообщения о нажатии кнопки Maximize, о чем тут и пишут.
1
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,428
22.01.2020, 09:11
KopHack, можно проверить, написав следующий код. Посмотреть, сколько строк добавляется при нажатии на кнопку:
Delphi
1
2
3
4
5
6
7
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MAXIMIZE then
  begin
    Memo1.Lines.Add('Maximize, ' + IntToStr(Random(100)));
  end else inherited;
end;
1
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
23.01.2020, 22:53  [ТС]
AzAtom, Проверил, добавляется одна строка:
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
23.01.2020, 23:08  [ТС]
Понял в чём проблема, если поставить скин из пакета AlphaControls (который у меня как раз-таки и стоял), то происходит такой баг. Если без скина, то всё нормально.

Добавлено через 4 минуты
И да, при наличие скина происходит двойное нажатие.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
23.01.2020, 23:25
Цитата Сообщение от MSDN
An application should return zero if it processes this message.
Цитата Сообщение от MSDN
In WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system. To obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam value by using the bitwise AND operator.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure TForm1.WMSysCommand(Var Msg: TWMSysCommand);
Begin
If ((Msg.CmdType And $FFF0) = SC_MAXIMIZE) Then
  Begin
  Msg.Result := 0;
  If (Height < 500) Then
    Begin
    Height := 500;
    ShowMessage('A');
    End
  Else
    Begin
    Height := 240;
    ShowMessage('B');
    End;
  End
Else
  Inherited;
End;
Добавлено через 5 минут
Надо спросить на их форуме техподдержки. Может быть это как-то отключается.
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
23.01.2020, 23:50  [ТС]
Написал процедуру, костыльно, может кто додумает её. Так-как при одном нажатие у нас две итерации, то одну переменную делим на 2, отнимаем от первой, получаем номер итерации, дальше проверка на чётность. Вроде как работает, но видно как она моргает.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  Check : integer = 0;
  Check2 : integer = 0;
 
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MAXIMIZE then
    begin
      Inc(Check);
      Inc(Check2);
      if Odd(Check - round(Check2/2)) then
          Height:= 501
      else
          Height:= 240;
    end
  else inherited;
end;
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
23.01.2020, 23:58
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  Check : integer = 0;
 
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MAXIMIZE then
    begin
      Check:=(Check+1) mod 2;
      if Check = 0 then
          Height:= 501
      else
          Height:= 240;
    end
  else inherited;
end;
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
24.01.2020, 00:08
Лучший ответ Сообщение было отмечено KopHack как решение

Решение



Добавлено через 9 секунд
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure TForm1.WMSysCommand(Var Msg: TWMSysCommand);
Begin
If ((Msg.CmdType And $FFF0) = SC_MAXIMIZE) Then
  Begin
  Msg.Result := 0;
  If Odd(Tag) Then
    If (Height < 500) Then
      Begin
      Height := 500;
      // ShowMessage('A');
      End
    Else
      Begin
      Height := 240;
      // ShowMessage('B');
      End;
  Tag := Tag + 1;
  End
Else
  Inherited;
End;
Добавлено через 3 минуты
Но это костыли. Надо всё же на их форуме техподдержки спросить. Возможно такое поведение отключается.
1
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
24.01.2020, 00:30
Цитата Сообщение от KopHack Посмотреть сообщение
Понял в чём проблема, если поставить скин из пакета AlphaControls (который у меня как раз-таки и стоял), то происходит такой баг.
Да нифига подобного. Попробывал код DenNik при "ошкуривании" AlphaSkins, никакого двойного срабатывания. Единственное, что всегда делаю, это в onCreate формы пишу такой код
Delphi
1
2
3
4
5
procedure TForm1.FormCreate(Sender: TObject);
begin
  sSkinManager1.Active := False;
  sSkinManager1.Active := True;
end;
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
24.01.2020, 01:07
амм... нну... Текущая версия sSkinManager1 и правда к такому приводит. На Рио.
То что вы всегда делаете (кстати зачем, если не тайна?) никаких изменений не даёт.
1
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
24.01.2020, 12:22
Значит получается для разных версий Delphi у AlphaSkins свои баги. У меня D5, XE2 и AlphaSkins 12.07, двойных срабатываний нет.
Цитата Сообщение от GoodWeather Посмотреть сообщение
кстати зачем, если не тайна?
А вот это и есть баг. Чтобы срабатывал скин, если запустить прогу без этого кода, а свойство sSkinManager Active в True, то не прорисовывается скин.
Чуть не так, пока не "передёрнешь" свойство Active, скин не рисуется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2020, 12:22
Помогаю со студенческими работами здесь

Как при динамическом создании кнопки переназначить OnClick событие
Нужно при создании кнопки переназначить событие OnClick newbutton.OnClick:=MyOnClick Так, чтобы в процедуру MyOnClick передалась...

Как перехватить событие нажатия кнопки "Завершение работы"?
Хотелось бы написать скрипт Когда пользователь выбирает &quot;Завершение работы&quot;, появлялось сообщение &quot;Завершение&quot;, но как...

Как перехватить WMI-событие
Собственно нужно перехватить событие компъютер вышел из режима сна или из режима гибернации. Что-то у меня не получается. Хочу сделать на...

Как создать событие и перехватить его?
Как создать событие и перехватить его?

Как перехватить событие - удаление нескольких записей
Добрый день! Возникла заминка в следующем вопросе: При удалении записи из таблицы проводилась ее архивация на событии формы удаление ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru