![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
В общем, меня тоже стал угнетать вид 300-килобайтового екзешника, состоящего из голой формы, поэтому решил и я попробовать себя в более низкоуровневом программировании.
После ковыряний в гугле и долгих блужданий по таинственным и запутаннным лабиринтам VCL я таки родил то, что прикладываю к проекту. Итак, вопросы. 1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт. 2. Если в системе поставить галочку "отображать содержимое окна при перетаскивании", то редактор очень мерцает при изменениях размера. Отлов сообщения wm_EraseBkgnd помог не полностью - если в поле ввода ввести много текста, то видно, как текст мигает. Заметил, что в Микрософте при написании Блокнота и Пейнта об этом не парились, а вот с ВордПадом - парились. 3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше. 4. Забавный нюанс - если поле ввода с двумя полосами прокрутки подогнать под размер окна, то в правом нижнем углу сам собой появится треугольничек для изменения размера. 5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить. Если перевести фокус на поле ввода и нажать F2, то программа не получает вообще никакого сообщения (как видно по содержимому консоли, введённой тут только для изучения сообщений). Также непонятно, что ловить, чтобы узнать, что "файл *** изменён" (чтобы задавать глупые вопросы пользователю). 6. Диалоги открытия/сохранения (чем они вообще отличаются?). У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там. И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании. Прикрепленные файлы ![]() -------------------- |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата 1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт. Перед тем, как менять шрифт, неплохо было бы убедиться, что он создан:if Font <> 0 thenЕсли же Font равен 0, надо смотреть, почему. Используем GetLastError... Цитата 3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше. Стандартная как раз и создается WS_BORDER-ом. Какая именно другая нужна?Цитата 5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить. Еще меньше понятно - зачем ты делаешь такую замороченную систему создания меню, вместо того, чтобы создать его в RC-файле. и там же назначить ему акселераторы, которые потом подгрузить через LoadAccelerators и использовать. Зачем понадобилось выделять массив размера $FFFF, спрашивается?Цитата Также непонятно, что ловить, чтобы узнать, что "файл *** изменён" EN_CHANGE Notification Цитата У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там. Убери ее, для этого Флаги и предназначены - используешь только то, что надо:with OpenFN do begin Цитата И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании. Меняется...Цитата(MSDN) Current Working Directory is altered when a file is opened When the user selects at least one file and clicks the OK button, the process' current working directory is changed to the directory contain the file(s) being opened. Для GetSaveFileName Можно поправить это с помощью тех же Флагов, но для GetOpenFileName этот флаг не работает (вот тебе и разница между этими функциями): Цитата OFN_NOCHANGEDIR Restores the current directory to its original value if the user changed the directory while searching for files. Windows NT 4.0/2000/XP: This flag is ineffective for GetOpenFileName. Остальное посмотрю чуть позже, тут уже надо Дельфи запускать и тестировать догадку... |
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
1. Вставил в код уничтожение всех созданных окон, программа теперь запускается нормально. Винда разве автоматом не удаляет их при закрытии приложения?
3. У меня через ws_Border получилась только просто линия вокруг. Но смотрится лучше набившей оскомину псевдотрёхмерности. 5. Чтобы всё по-честному. Для общего развития. Я так понял, горячие клавиши только через расстановку ловушек на клавиатуру? en_Change вроде помог, спасибо. 6. Я думал, флаги только для ДОБАВЛЕНИЯ фич, то есть по умолчанию всё пусто. Разница у диалогов в кнопочке, у одного "сохранить", у другого "открыть". И как открыть файл, не трогая главный каталог? Модифицировать диалог сохранения через флаги? |
TarasBer |
![]()
Сообщение
#4
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Предыдущий пост - мой.
-------------------- |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата Чтобы всё по-честному. Для общего развития. Ага.Ну, раз по-честному - значит слушай... 1. Начнем с того, что ты некорректно описываешь главную функцию окна. Что это за прототип? Цитата function fEditorWndProc(Handle: HWND; Message: word; WParam, LParam: longint): longint; stdcall; ? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться: function fEditorWndProc(Handle: HWND; Message: UINT; 2. Цитата Я так понял, горячие клавиши только через расстановку ловушек на клавиатуру? RegisterHotKey - это один способ, второй я уже описывал: создавать меню так:MainMenu MENU myAccels := LoadAccelerators(hInstance, 'myAccel'); Если ты собрался писать на чистом API - то все, что ты натворил в своем проекте можно уложить в сотню строк. В одну сотню, понимаешь? Причем программа будет хорошо структурированной и понятной с первого взгляда. Если же ты ушел от VCL, чтобы изобрести "свою" VCL - то я подожду, пока ты наиграешься с этим, и потом начнешь задавать вопросы либо о чистом WinAPI, либо о стандартной Дельфийской VCL. В мутантах разбираться у меня нет никакого желания. Твой, практически ничего не делающий, код из первого сообщения компилируется уже в 126К на Дельфи 2009. Код, написанный на чистом WinAPI уложится в 50К. Ну, и от чего ты ушел и куда пришел? Будешь добавлять "фичи" - размер твоего EXE-шника будет расти как на дрожжах, и станет больше VCL-ного как пить дать. Хочешь продолжать с созданием своих неизвестно зачем понадобившихся классов - продолжай заниматься непонятно чем. Только предупреди, чтоб я мог знать, стоит ли сюда заходить или проходить мимо... |
TarasBer |
![]()
Сообщение
#6
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> ? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться:
INT_PTR выдаёт ошибку. Остальное поправил, спасибо. > RegisterHotKey - это один способ Ага, оно. > Если же ты ушел от VCL, чтобы изобрести "свою" VCL Ну нужно же мне хоть какое-то упрощение, да и не собираюсь я полностью абстрагироваться от WinAPI, даже у Борланда всё равно не вышло. У меня на размер оно не повлияло. Я не знаю, что делает с моим кодом D2009. У меня, после компиляции семёркой, екзешник занимает 25 Кб (пустой екзе - 13 Кб). И это логично, потому что все модули очень маленькие и почти каждый участок кода из библиотек используется. Может быть, D2009 на каждое упоминание модуля в uses создаёт свою копию модуля? Остались вопросы: 1. Что делать с диалогом открытия? 2. Какие ресурсы надо освобождать, а какие - нет? Особенно интересует DC. Когда нужен ReleaseDC и DeleteDC? -------------------- |
![]() ![]() |
![]() |
Текстовая версия | 13.07.2025 0:55 |