"Если вдруг открылся люк, не пугайся, это глюк!" (с) Если что-то работает не так, вы нашли ошибку или опечатку в программе — вам в этот раздел
Verevkin
Что я делаю не так? Параметры формы при выходе сохраняются, но при следующем запуске не восстанавливаются, а инициализируются значениями по умолчанию.

Содержимое файла %LOCALAPPDATA%\MyChat Client\<client_filename>.ini
Код: Выделить всё
[WindowMain]
Top=402
Left=2077
Width=1086
Height=600
ChannelsHeight=631
InputTextPanelHeight=191
ContactsPanelWidth=200

[OtherOptions]
LastUIN=1
LastServerID=1
LastWorkTimeControlStatus=0

Включенная до перезапуска панель форматирования оказывается выключенной. Это косяк программы или у меня тупо руки кривые? Настроение у меня хорошее, ибо пятница, поэтому пёструю фотожабу из 2 скриншотов прилагаю.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Добрый день.


Геометрическое положение и размеры главной формы запоминаются и восстанавливаются, а открытая панель форматирования закрывается всегда автоматически.

Однако, судя по вашей цитате, вы запихиваете окно MyChat за край экрана, и картинка на скрине не соответствует действительности.
Left=2077
Width=1086


У вас размер монитора по горизонтали больше 3163 точек?
Verevkin
открытая панель форматирования закрывается всегда автоматически.

Зачем???!!!1
Однако, судя по вашей цитате, вы запихиваете окно MyChat за край экрана, и картинка на скрине не соответствует действительности.

Код: Выделить всё
    Left=2077
    Width=1086


У вас размер монитора по горизонтали больше 3163 точек?

Вы прикалываетесь? Или на самом деле не в курсе, что в компу можно больше одного монитора подключить?
У меня их, например 3 штуки. И ширина рабочего стола = 2*1280 + 1920 = 4480 точек. А начало отсчёта - TopLeft среднего монитора, так что координаты окон левого монитора все отрицательные, а правого > 1919.
Странно, что вас не навели на эту мысль разные обои рабочего стола. Ну да ладно.

Всё равно, как ни крути, после запуска TopLeft главной формы оказывается в точке 100:100. ЧЯДНТ?

Фотка старая, многое изменилось с тех пор. Но расклад показывает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Зачем???!!!1

Чтобы экран не загромождать. Да и в будущих версиях мы её выпилим, шрифтовая разметка будет работать по-другому.
Вы прикалываетесь? Или на самом деле не в курсе, что в компу можно больше одного монитора подключить?

Сарказм не засчитан.

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

Совершенно непонятно, как себя вести, если у вас поменяется конфигурация мониторов, разрешения или ещё что-либо. Тогда просто перезапуск программы может ничего не дать и окно останется в таком месте, откуда его достать будет проблематично.

Ввиду экзотической ситуации — можно написать плагин, который решит вашу проблему (будет просто железобетонно помнить размеры, наплевав на всё), надо будет немного доработать API.

Если вам это реально нужно — пишите.
Verevkin
Сарказм не засчитан.

А никакого сарказма! Я серьёзно.
У нас двухмониторные конфигурации, но рабочие столы разделяем на отдельные, а не клеим их.

И чего? Разве поведение программы должно зависеть от конфигурации устройств вывода? ИМХО, программы должны учитывать ВСЕ возможные конфигурации и, в том числе, количество и расположение мониторов и рабочих столов. Разве нет?

Проблема-то не в этом, а в том, что программа не читает параметры из ini-файла или читает, но неверно обрабатывает. Что вам стоит под дебаггером-то посмотреть, что происходит? Делов-то на 5 минут - и одним багом меньше.

Про нормальные отрицательные координаты рабочего стола слышу впервые, никогда не сталкивался. Обычно, если координата по вертикали либо горизонтали меньше нуля, значит, левый верхний угол за границей экрана.

Век живи - век учись. Кстати, значения координат вас не должны волновать, ибо система сама корректно расположит окно при вызове CreateWindowEx()/SetWindowPos(), главное - передать ей правильные координаты через методы TForm.

Совершенно непонятно, как себя вести, если у вас поменяется конфигурация мониторов, разрешения или ещё что-либо. Тогда просто перезапуск программы может ничего не дать и окно останется в таком месте, откуда его достать будет проблематично.

Чо, опять матчасть? Бывает. Я тоже как-то в молодости так недоглядел. 5 минуть чтения хэлпов и был найден TScreen.Monitors[]
http://docs.embarcadero.com/products/ra ... itors.html
Щас это проще - всё онлайн.

Чтобы экран не загромождать. Да и в будущих версиях мы её выпилим, шрифтовая разметка будет работать по-другому.

ИМХО, решать за всех пользователей, что им хорошо и что плохо, - это плохая идея. Оставьте пользователю возможность включать, выключать и настраивать под свои хотелки все возможные в программе функции и прибамбасы. Смотрите на программу не с точки зрения эффективности, эргономики, оптимизации и т.п., а с точки зрения пользователей, которые все разные.

Ввиду экзотической ситуации — можно написать плагин, который решит вашу проблему (будет просто железобетонно помнить размеры, наплевав на всё), надо будет немного доработать API.
Если вам это реально нужно — пишите.

Не надо никаких костылей, умоляю! Это неприлично. На данный момент нужно просто выявить баг с восстановлением позиции окна, и продолжить двигаться дальше.
Надеюсь, текст выше убедил вас, что это не экзотическая ситуация, а вполне обычная. Я сам могу написать крохотную программу, которая будет расставлять окна, как я хочу (даже за пределами десктопа), но это же не наш метод, правда?

Пожалуйста, перестаньте думать, будто я сплю и вижу, как бы обвинить вас в некомпетенции. Напротив - я помочь хочу, мне программа нравится. Всё знать невозможно, т.е. не знать что-то - это нормально. Я готов ответить на любые ваши вопросы. Тестирование вашего чата продолжается.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Кстати, значения координат вас не должны волновать

К сожалению, должны. Если пользователь перетаскивает окно приложения за границы экрана, что тогда делать? Сейчас логика такая: если при запуске программа видит, что координаты отрицательные либо вылезают за границы рабочего стола — размеры и положение сбрасываются в дефолтные. В такой конфигурации жалоб нет.
TScreen.Monitors

Как этот класс поможет нам в логике определения, видит пользователь приложение или оно находится за пределами видимых экранов в данный момент?
ИМХО, решать за всех пользователей, что им хорошо и что плохо, - это плохая идея. Оставьте пользователю возможность включать, выключать и настраивать под свои хотелки все возможные в программе функции и прибамбасы. Смотрите на программу не с точки зрения эффективности, эргономики, оптимизации и т.п., а с точки зрения пользователей, которые все разные.

Функционал шрифтовой разметки будет полностью убран из отправки сообщений, как неудачное решение. Будут специальные сниппеты, в которых будет шрифтовая разметка. Соответственно, включать сейчас в настройку, показывать эту панельку или нет — никакого смысла.
Пожалуйста, перестаньте думать, будто я сплю и вижу, как бы обвинить вас в некомпетенции

Всё Ок, за много лет мы уже привыкли :)
Verevkin
Если пользователь перетаскивает окно приложения за границы экрана, что тогда делать?

А ничего не делать. Подчиниться. Юзеру виднее. К тому же, полностью перетащить мышью за пределы области видимости всё равно не получится.
Сейчас логика такая: если при запуске программа видит, что координаты отрицательные либо вылезают за границы рабочего стола — размеры и положение сбрасываются в дефолтные. В такой конфигурации жалоб нет.

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

Может вы сходите по ссылке, которую я вам прислал? Я даже на скриншоте обвёл, куда тыкнуть надо. [smilie=dash3.gif]
Ну ладно, ладно, хотите, я напишу вам потомка от TForm, который будет иметь такой виртуальный метод?
Код: Выделить всё
function TVForm.InDesktopRect(var APartial: Boolean): Boolean;

Просто вставите этот класс в корень своего дерева иерархии классов форм, да и всё.
На основании этого метода можно и событие прикрутить типа
Код: Выделить всё
procedure OnOutOfDesktopBounds(Sender: TObject) of object;

чтобы реагировать на выход окна за пределы десктопа.
Будут специальные сниппеты, в которых будет шрифтовая разметка. Соответственно, включать сейчас в настройку, показывать эту панельку или нет — никакого смысла.

Ключевое слово тут - "будут". Нет ничего более постоянного, чем нечто, скрученное синей изолентой. Добавьте запоминание Visible панели форматирования в том же ini-файле. Это ж не километр кода, делов-то на 3 минуты.
Всё Ок, за много лет мы уже привыкли :)

В том-то и дело: программу пилите несколько лет, а очевидные бытовые удобства для обычных людей так и не добавили (про шрифты - это я писал в другой теме). Это настораживает. :)
Аватара пользователя
Алексей Пикуров
А ничего не делать. Подчиниться. Юзеру виднее. К тому же, полностью перетащить мышью за пределы области видимости всё равно не получится.

Извините, но вы не понимаете, о чём говорите. Такую реакцию сделали как раз против таких ситуаций, были реальные проблемы, когда клиенты как раз умудрялись перетащить окно за границы экрана и потом не могли его достать оттуда.
Может вы сходите по ссылке, которую я вам прислал? Я даже на скриншоте обвёл, куда тыкнуть надо.

Сходил. Давайте конкретику.
function TVForm.InDesktopRect(var APartial: Boolean): Boolean;

Что это за функция?

Покажите работающий код, который реально решит проблему с вашими тремя мониторами и не сломает логику у тех, у кого монитор один или два, у кого десктоп разделён или склеен.

А также сработает верно, если один или несколько мониторов выключат либо поменяют логику работы.

А ещё если юзер перенастроит разрешение экрана на любом мониторе, или на всех сразу.

P.S. Постарайтесь учесть, что наш софт работает на десятках тысяч компьютеров, на разных окружениях, от XP до 10, на серверных ОС, в WINE, на терминалках и в виртуальных машинах.

Хорошо, что вы уверены в своих силах. Но имейте в виду, разработка коммерческого софта и "для себя" — это огромная разница.
Аватара пользователя
Алексей Пикуров
В общем, сделали так: MyChat Client восстанавливает своё исходное положение только в том случае, если края главного окна находятся в области видимости десктопа. Если нет — размеры устанавливаются в дефолтные и окно переносится на основной монитор.

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

https://nsoft-s.com/mcclient.zip

Если у вас есть работающее предложение для решения такой ситуации — пишите. Проблему закрываем.
Verevkin
Таки мне удалось вас расшевелить. Это радует.
MyChat Client восстанавливает своё исходное положение только в том случае, если края главного окна находятся в области видимости десктопа. Если нет — размеры устанавливаются в дефолтные и окно переносится на основной монитор.

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

От сбоев надо избавляться. Неприлично это. [smilie=biggrin.gif]
Думаю, разрулится. Я слов на ветер не броясаю и с утра уже пишу вам демо для отладки. Пока на ноутбуке, лёжа на диване. Вставать и садиться за настольный комп тупо лень, у меня сёдня выходной. Завтра на работу приду и буду моделировать ситуацию. Щас пока результатов нет, пишу организационный код. Узбагойтесь, короче. :) Если упрусь в непонятку - напишу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Verevkin
Запилил я вам прогу, как и обещал.
Прежде чем скачать, посмотрите вот это видео, демонстрирующее работу проги.

З.Ы. Пришлось файл переименовать в .zip, т.к. 7z и 7zip почему-то запрещены. [smilie=shok.gif]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
EXE-файл не нужен, приложите пожалуйста zip архив с сорцами, я скомпилирую и гляну. Спасибо.

7z и 7zip почему-то запрещены.

Разрешили, спасибо.
Verevkin
Сорцы вшиты внутрь EXE как ресурс. Это я от лени такую автоматизацию сделал, когда на форумах по программированию результаты работы показывал. Посмотрите, плиз, видео, я там объяснил, как их извлечь оттуда. Это сделано для того, чтобы одним файлом передавать сразу всё. Потому что есть вероятность того, что скомпилить сходу мой исходник не удастся в виду отсутствия каких-то компонентов, несовместимости или ещё чего-то, зато бинарник уже готовый в комплекте.

Для разъяснения этого я и записал видео, не поленился. В нём показано, как программа раотает.

UPD.: Извлечение сорцов из бинарника на видео с отсечки 4:40.
Аватара пользователя
Алексей Пикуров
Я уже достал исходник из ресурса, дело не в этом. Жаль времени на подобные изыски, могли просто выложить в архиве или на Git.
Verevkin
Жаль времени на подобные изыски, могли просто выложить в архиве или на Git.

Понимаю. Смотрится довольно необычно, но только на первый взгляд. Но когда требуется часто передавать одноразовую прогу с исходником, этот подход очень сильно время экономит. Исходник полностью автоматически архивируется (с фильтрованием типов файлов), формируется res-контейнер, который пришпиливается компайлером в exe. Всё автоматически при каждой сборке.
Аватара пользователя
Алексей Пикуров
As you like.
Verevkin
Recommended for everyone. I can teach if you want. [smilie=crazy.gif]
Аватара пользователя
Алексей Пикуров
Спасибо за пример, но ваша программа не решает проблему вычисления видимости окна в случае, который описал выше:
Я не знаю, как корректно отработать ситуацию, когда мониторы находятся не в ряд, по вертикали или горизонтали, а, например, по диагонали. В этом случае алгоритм определения видимости даст сбой, но ситуация редкая.


2displays.png


Т.е. в вашем примере "Partial visible" не показывается при размещении окна полностью или частично в невидимой области, "слева сверху" либо "справа снизу".
А если частично?

Я уже ответил. Скачайте сборку и посмотрите, как она себя ведёт при разных вариантах.

Мы уже сделали контроль в новой сборке, в большинстве случаев он работает хорошо, кроме диагонального варианта двух или более мониторов. Если придумаете что-то работающее в такой ситуации — пишите.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Verevkin
Пришлите побольше скриншотов и/или видео. Пропробую смоделировать у себя такую ситуацию. Меня больше интересуют значения свойств глобальных объектов, которые выводит на экран программа. Это необходимо, чтобы найти ошибку в алгоритме.
Аватара пользователя
Алексей Пикуров
Включаете два монитора, расставляете их по диагонали, рабочий стол растянут на два монитора. Всё.
Verevkin
Нет, не всё. Системе глубоко пофигу, как мониторы расположены физически. Рабочий стол и окна относительно его координат рисуются согласно заданным параметрам. Мне нужны фактические значения этих параметров, чтобы смоделировать ситуацию. Их моя прога отображает. Поэтому я и просил скрины и видео.
Аватара пользователя
Алексей Пикуров
Я не спорю с вами. Я описал, почему ваша программа работает неверно и как это увидеть. Спасибо за желание помочь, но мы сами сделали всё, что нужно. Использование сторонних компонент для программы-примера — дурной тон, этого нужно избегать. Собрать вашу программу "с ходу" я не могу по причине использования вами нестандартных компонент, приходится тратить время на доводку. Чужие exe-файлы мы не запускаем, политика безопасности.
Verevkin
Использование сторонних компонент для программы-примера — дурной тон, этого нужно избегать.

Нет. Это хороший тон. Не нужно этого избегать. Это сильно ускоряет написание одноразовых примеров.
Собрать вашу программу "с ходу" я не могу по причине использования вами нестандартных компонент

Поэтому я и предоставил бинарник. И видео с демонстрацией его работы, с закадровыми пояснениями.
Чужие exe-файлы мы не запускаем, политика безопасности.

Тогда как, чёрт возьми, вы узнали, что она работает неправильно?
Компоненты, которые я использую, общедоступны в исходниках. Я и предположить не мог, что если у вас какого-то из них не окажется, вы будете тратить время на какую-то там "доводку" вместо того, что просто попросить прислать этот компонент или пакет (или ссылку на источник).

Что происходит? [smilie=shok.gif]
Аватара пользователя
Алексей Пикуров
Отвечу развёрнуто и закроем дискуссию.

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

Я не спорю с вами, я сказал, что использовать нестандарные компоненты в примерах — плохо, это заставляет устанавливать эти компоненты, никто этого делать не будет и не хочет. Это общепринятые правила хорошего тона. Повторюсь, речь только о примерах.

Вкладывать сорцы как ресурс — плохой тон. Как в анекдоте "winrar.rar". Это заставляет искать утилиту для распаковки ресурсов, ковыряться в них и тратить своё время на ненужные телодвижения. Удобно лично вам — неудобно остальным. Приложить сорцы к архиву или на Git — хороший тон. Вы спорите.

За бинарик — спасибо, я запускал его на виртуалке. Опять же, вам поясняют, что передавать EXE — это плохой тон, вы снова спорите.
Что происходит?

Вам сказали, что ваша программа работает неправильно, и объяснили, почему. Расставьте два монитора по диагонали и объедините десктоп. Ваша программа не отслеживает своё положение в невидимых областях, там, где физических мониторов нет. Windows объединяет десктоп в один большой прямоугольник, который охватывает и невидимые области тоже. Скриншот конфигурации расположения мониторов я вам привёл.

Я ценю ваше желание помочь сделать MyChat лучше, благодаря вашему замечанию мы немного улучшили механизм запоминания положения окна. Но без вашего исходника. Ваш поучительный тон со ссылками на справку и классы Delphi неуместен. Вы не можете знать уровень нашей компетенции, внутреннее устройство MyChat и множество других зависимостей.

Хотите что-то предложить — мы всегда выслушаем. Но без менторских понтов, окей?

Тестировать ваши сорцы мы не будем, извините, у нас есть своя работа.

Надеюсь, я доступно всё пояснил.
Verevkin
Не люблю незаконченных дел, самоуважение страдает.
Поэтому я решил вопреки всему код допилить, насколько это возможно в моих условиях. Моя команда состоит из одного человека, но я, хотя бы попытался.

Рабочий день кончается, поэтому посмотрите вот это видео (6 минут), монтировать нет времени, поэтому снимал на дверной глазок и залил как есть.
https://www.youtube.com/watch?v=yPNB7VilGs0

А я пока попробую адаптировать исходник, чтобы вы там смогли его пересобрать.
Вообще говоря, изначально всё затевалось только по одному вопросу:
Как этот класс (TScreen.Monitors) поможет нам в логике определения, видит пользователь приложение или оно находится за пределами видимых экранов в данный момент?

Да, действительно, программа выдавала неверный результат, если мониторы расставлены по диагонали. Я переделал проблемный метод. Попутно выпилил все левые компоненты, кроме двух (из JVCL), которые сохраняют и восстанавливают настройки/данные. Они к задаче не имеют прямого отношения. Результат я свёл в один модуль, который можно приюзать к любой программе. Остальное - для понимания логики и отладки. Вот этот код:
Код: Выделить всё
unit uVForm;

interface

uses
  //============================== Модули проекта ==============================
  //========================= Модули проекта с формами =========================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  Windows, Messages, SysUtils, Classes, Controls, Forms, Graphics;

type
  TDesktopVisibility = (dtvOutOfBounds, dtvPartialVisible, dtvFullVisible);
  TVForm = class abstract(TForm)
  private
    FIsAppWindow: Boolean;
    FOnMove: TNotifyEvent;
    procedure WMMove(var Msg: TWMMove); message WM_MOVE;
  protected
    function InDesktopRect(var APartial: Boolean): Boolean; virtual;
    procedure DoMove; virtual;
    procedure CreateParams(var Params: TCreateParams); override;
    function GetDesktopVisibility: TDesktopVisibility; virtual;                 // <--- это оно
    function GetMonitorVisibleFactor(AMonitor: TMonitor): Single; virtual;
    function GetTotalVisibilityFactor: Single; virtual;
  public
    constructor CreateCustom(AOwner: TComponent; const ShowOnTaskbar: Boolean); virtual;
    function GetVisibilityColor: TColor;
    procedure AppIdle; virtual; abstract;
    property DesktopVisibility: TDesktopVisibility read GetDesktopVisibility;   // <--- это оно
    property MonitorVisibilityFactor[AMonitor: TMonitor]: Single read GetMonitorVisibleFactor;
    property TotalVisibilityFactor: Single read GetTotalVisibilityFactor;
  published
    property OnMove: TNotifyEvent read FOnMove write FOnMove;
  end;

const
  VISIBILITY_COLORS: array[TDesktopVisibility] of TColor =
    (clRed, clYellow, clLime);
  VISIBILITY_BACKGNDS: array[TDesktopVisibility] of TColor =
    (clRed, $003F3F3F, clWhite);

function FactorToDesktopVisibility(const AVisibilityFactor: Single): TDesktopVisibility; inline;

implementation

{$REGION 'service'}
function FactorToDesktopVisibility(const AVisibilityFactor: Single): TDesktopVisibility;
const
  PRECISION = 1e-5;
begin
  if AVisibilityFactor > 1 - PRECISION
    then Exit(dtvFullVisible);
  if AVisibilityFactor > PRECISION
    then Exit(dtvPartialVisible);
  Result:= dtvOutOfBounds;
end;

function RectSquareInPixels(const ARect: TRect): DWORD; inline;
begin
  with ARect do
    Result:= Abs(Right - Left + 1) * Abs(Bottom - Top + 1);
end;
{$ENDREGION}

{$REGION 'TVForm'} { TVForm }
constructor TVForm.CreateCustom(AOwner: TComponent;
  const ShowOnTaskbar: Boolean);
begin
  FIsAppWindow:= ShowOnTaskbar;
  inherited Create(AOwner);
end;

procedure TVForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // Сворачивание формы на панель задач
  if FIsAppWindow
    then begin
           Params.ExStyle   := Params.ExStyle or WS_EX_APPWINDOW;
           Params.WndParent := GetDesktopWindow;
         end;
end;

procedure TVForm.DoMove;
begin
  if Assigned(FOnMove)
    then FOnMove(Self);
end;

function TVForm.GetDesktopVisibility: TDesktopVisibility;
begin
  Result:= FactorToDesktopVisibility(GetTotalVisibilityFactor());
end;

function TVForm.GetMonitorVisibleFactor(AMonitor: TMonitor): Single;
var
  intersection: TRect;
begin
  // отношение площади видимой части окна в пределах экрана монитора AMonitor
  // к общей площади окна (0 ÷ 1.0)
  intersection:= AMonitor.BoundsRect * Self.BoundsRect; // пересечение двух TRect
  if not (Self.BoundsRect.IsEmpty() or intersection.IsEmpty())
    then Result:= RectSquareInPixels(intersection) / RectSquareInPixels(Self.BoundsRect)
    else Result:= 0;
end;

function TVForm.GetTotalVisibilityFactor: Single;
var
  idx: int32;
begin
  Result:= 0.0;
  for idx:= 0 to Screen.MonitorCount - 1 do
    Result:= Result + Self.GetMonitorVisibleFactor(Screen.Monitors[idx]);
end;

function TVForm.GetVisibilityColor: TColor;
begin
  Result:= VISIBILITY_COLORS[Self.DesktopVisibility];
end;

function TVForm.InDesktopRect(var APartial: Boolean): Boolean;
var
  temp: TRect;
begin
  APartial:= IntersectRect(temp, BoundsRect, Screen.DesktopRect);
  Result:= temp = BoundsRect; //Screen.DesktopRect;
end;

procedure TVForm.WMMove(var Msg: TWMMove);
begin
  DoMove();
end;
{$ENDREGION}

end.


Мне нужно сваливать, домой, поэтому пришпилил всю папку с проектом к ответу.
Будут вопросы - задавайте.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Verevkin
Как и обещал - запилил сборку исходника прямо в консоли.
Никакие компоненты устанавливать в IDE не нужно. Главное, чтобы сама IDE стояла в системе.
Сборщику потребуются 2 вещи:
  1. пакет JCL/JVCL - скачать тут (~23 Мб в ZIP-архиве; MD5 = 687A67633625546CE6912B4492A61B96);
  2. архиватор 7-zip - взять тут (в зависимости от разрядности ОС); устанавливать его не обязательно - можно просто разжать куда-нибудь.
Чтобы не заморачиваться, придавил всю папку, вместе в исходниками Jedi, и прицепил во вложения. Общий архив получился меньше процентов на 60+. Но кому стрёмно - скачайте архив сами, в нём 2 папки. Извлеките их в общую папку (рис.1) (или куда угодно и подправьте пути с конфиге mmt.cfg).

Если чо не получается, вот тут видео посмотрите (2 мин 12 сек).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Андрей Раков
Добрый день.

Алексей ушел в небольшой отпуск, поэтому ответит вам позже.
Verevkin
Алексей ушел в небольшой отпуск, поэтому ответит вам позже.

Да ничо страшного. Файлам пофиг, сколько ждать.
Завидую я ему: вот это сила воли! У меня на вторые сутки без интернетов ломка начинается, как у наркомана. [smilie=biggrin.gif]

Шучу!




На третьи сутки... :)