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

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

21.01.2020, 17:20. Показов 2187. Ответов 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
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,346
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
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,346
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,609
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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru