Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

2005 г.

Улучшение вспомогательных окон среды Delphi - 2

Владимир Коднянко, «Королевство Delphi»

В статье "Улучшение вспомогательных окон среды Delphi" предложен код, который позволяет решить несколько вопросов, связанных с улучшением стандартных окон Delphi и надписей на них, русификацией надписей. Одним из важных свойств окон является позиционирование их над центром активной формы приложения.

Несколько слов об обсуждении названной статьи. Нельзя сказать, что оно было продуктивным. Главным образом, обсуждающие демонстрировали свою просвещенность, не вдаваясь особенно в суть предлагаемых решений. И все же один из принявших участие в обсуждении под псевдонимом Gemini высказал интересную мысль о том, что код, изложенный в статье, может быть с успехом использован не только для русификации, но и, вообще, для быстрой иной "национализации" надписей окна окна (такой мысли у меня даже не было).

Теперь к теме настоящей статьи. Как показала практика, центрирование окон относительно активной формы не всегда удобно. Например, если активная форма мала или вблизи ее центра расположены данные, которые необходимо видеть, но вспомогательное окно заслоняет их, что при многократном его появлении требует всякий раз перемещения его в сторону, то в таких ситуациях предложенный способ вывода окна следует признать неудачным.

Возможным средством устранения этого недостатка можно считать способ, когда смещенное от центра активной формы вспомогательное окно при следующем вызове появится в том месте, куда его сместили при предыдущем вызове.

Эта задача решается посредством незначительной модернизации описанного в упомянутой статье кода. Возможный вариант такой модернизации приведен ниже.

В секции interface опишем глобальную переменную

// по умолчанию - старый способ
var KdnMessageDlgByLastPosition: boolean = false;

Для фиксации местоположения окна в момент его закрытия введем две переменные KdnMessageDlgLeft, KdnMessageDlgTop, определяющие координаты верхнего левого угла окна. Их описание лучше разместить в секции implementation там, где описаны массивы кнопок:

var

// координаты верхнего левого угла окна на случай
// вывода окна в том месте,
// где оно было закрыто в предыдущее появление
  KdnMessageDlgLeft: Integer = -1;
  KdnMessageDlgTop : Integer = -1;

  // кнопки
  ButtonEngCaptions: array[1..11] of string = ('Yes', 'No', 'OK',
                                               'Cancel', 'Abort',
    ...

В тело функции KdnMessageDlg добавим необходимый код. Текст функции в сокращенном виде приведен ниже.

function KdnMessageDlg(MsgVariant: string;
                       DlgType: TMsgDlgType;
                       Buttons: TMsgDlgButtons): Integer;
  ...
   cx:= L2+w2 div 2; // координаты центра активной формы
   cy:= t2+h2 div 2;
   ScreenActFormVisBoo:= true;
  end;

  if KdnMessageDlgByLastPosition and
   not ((KdnMessageDlgLeft = -1) and (KdnMessageDlgTop = -1)) then
    begin
     F.Left:= KdnMessageDlgLeft;
     F.Top:= KdnMessageDlgTop;
    end
   else
    begin
     w1:= Width; h1:= Height; // параметры F-окна
    ...
    end
     else Position:= poScreenCenter;
  end;
  Result:= ShowModal;
  finally
   Dispose(Msg); Dispose(s);
   KdnMessageDlgLeft:= F.Left; // запоминаем координаты угла
   KdnMessageDlgTop:= F.Top;
   F.Free;
   Application.ProcessMessages;
  end;
end;

Больше ничего менять не нужно.

Чтобы окна появлялось там, где их закрыли при предыдущем вызове, нужно прежде один раз выполнить оператор

KdnMessageDlgByLastPosition:= true;
Теперь функции KdnMessage, KdnMessageV и прочие потомки KdnMessageDlg будут "работать" по-новому.

Если нужно, чтобы после этого все окна стали "работать" по-старому (позиционирование над центром активной формы), следует один раз выполнить оператор

KdnMessageDlgByLastPosition:= false;

Можно вообще ни разу не выполнять ни один из этих операторов. Тогда окна будут "работать" по-старому.

Замечу, что модернизированный код предоставляет пользователю приложений, использующих этот код, более широкие возможности, отличается очевидной гибкостью. Если кто-либо из программистов посчитал целесообразным использовать описанный в предыдущей статье код, то можно порекомендовать модернизировать его вышеописанным либо аналогичным способом. Быть может, модернизированный код следует считать основным (по умолчанию). Не исключено также, что этот код может быть признан кем-либо безальтернативным, что позволит убрать переменную KdnMessageDlgByLastPosition и не заботиться о ее значении при разработке приложения.

В заключение приведу рисунок, который иллюстрирует описанную ниже ситуацию.

На рисунке, представляющем небольшой фрагмент активной формы, изображена ситуация, когда пользователь под контролем со стороны программы многократно добавляет новые записи в таблицу базы данных при помощи нажатия кнопки (она расположена слева от нависшего над активной формой вспомогательного окна). При этом программа после каждого нажатия кнопки посредством вспомогательного окна задает вопрос о необходимости вставки записи. На форме находится 9 таблиц и она занимает всю площадь экрана. Используемая в данный момент таблица находится в самом низу активной формы. Если использовать старый метод вызова окна подтверждения, то в такой ситуации всякий раз пришлось бы "тянуться" мышью к центру активной форму, где появлялось бы окно подтверждения, что, с одной стороны, замедлило бы работу, а с другой стороны, способствовало бы постоянному отвлечению внимания от того участка экрана, на котором как раз и нужно сосредоточить внимание. В модернизированном варианте окно подтверждения теперь можно перетащить ближе к кнопке, как показано на рисунке, и за счет этого, во-первых, укорить работу по вводу данных и, во-вторых, сосредоточить внимание пользователя на ограниченном участке экрана, несколько повысив тем самым производительность и уровень комфортности работы.

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...