IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Написание простого редактора без VCL, Только WinAPI
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


В общем, меня тоже стал угнетать вид 300-килобайтового екзешника, состоящего из голой формы, поэтому решил и я попробовать себя в более низкоуровневом программировании.
После ковыряний в гугле и долгих блужданий по таинственным и запутаннным лабиринтам VCL я таки родил то, что прикладываю к проекту.
Итак, вопросы.
1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт.
2. Если в системе поставить галочку "отображать содержимое окна при перетаскивании", то редактор очень мерцает при изменениях размера. Отлов сообщения wm_EraseBkgnd помог не полностью - если в поле ввода ввести много текста, то видно, как текст мигает. Заметил, что в Микрософте при написании Блокнота и Пейнта об этом не парились, а вот с ВордПадом - парились.
3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше.
4. Забавный нюанс - если поле ввода с двумя полосами прокрутки подогнать под размер окна, то в правом нижнем углу сам собой появится треугольничек для изменения размера.
5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить. Если перевести фокус на поле ввода и нажать F2, то программа не получает вообще никакого сообщения (как видно по содержимому консоли, введённой тут только для изучения сообщений). Также непонятно, что ловить, чтобы узнать, что "файл *** изменён" (чтобы задавать глупые вопросы пользователю).
6. Диалоги открытия/сохранения (чем они вообще отличаются?). У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там. И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании.


Прикрепленные файлы
Прикрепленный файл  NotepadAPI.rar ( 5.04 килобайт ) Кол-во скачиваний: 228


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт.
Перед тем, как менять шрифт, неплохо было бы убедиться, что он создан:
    if Font <> 0 then
SendMessage(Handle, wm_SetFont, Font, 0);
Если же Font равен 0, надо смотреть, почему. Используем GetLastError...

Цитата
3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше.
Стандартная как раз и создается WS_BORDER-ом. Какая именно другая нужна?

Цитата
5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить.
Еще меньше понятно - зачем ты делаешь такую замороченную систему создания меню, вместо того, чтобы создать его в RC-файле. и там же назначить ему акселераторы, которые потом подгрузить через LoadAccelerators и использовать. Зачем понадобилось выделять массив размера $FFFF, спрашивается?

Цитата
Также непонятно, что ловить, чтобы узнать, что "файл *** изменён"

EN_CHANGE Notification

Цитата
У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там.
Убери ее, для этого Флаги и предназначены - используешь только то, что надо:
  with OpenFN do begin
Flags := OFN_HIDEREADONLY; // <--- Вот здесь
lStructSize := SizeOf(OpenFN);


Цитата
И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании.
Меняется...
Цитата(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. Я думал, флаги только для ДОБАВЛЕНИЯ фич, то есть по умолчанию всё пусто.
Разница у диалогов в кнопочке, у одного "сохранить", у другого "открыть". И как открыть файл, не трогая главный каталог? Модифицировать диалог сохранения через флаги?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Предыдущий пост - мой.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Чтобы всё по-честному. Для общего развития.
Ага.
Ну, раз по-честному - значит слушай...

1. Начнем с того, что ты некорректно описываешь главную функцию окна. Что это за прототип?
Цитата
function fEditorWndProc(Handle: HWND; Message: word; WParam, LParam: longint): longint; stdcall;

? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться:
function fEditorWndProc(Handle: HWND; Message: UINT;
myWParam: WPARAM; myLParam: LPARAM): INT_PTR; stdcall;


2.
Цитата
Я так понял, горячие клавиши только через расстановку ловушек на клавиатуру?
RegisterHotKey - это один способ, второй я уже описывал: создавать меню так:
MainMenu MENU
BEGIN
POPUP "Файл (&F)"
BEGIN
MENUITEM "Новый (&N)\tCtrl+N", IDM_NEW
MENUITEM "Сохранить (&S)\tF2", IDM_SAVE
MENUITEM "Открыть(&O)\tF3", IDM_OPEN
MENUITEM "Сохранить как... (&A)\tCtrl+A", IDM_SAVEAS
MENUITEM SEPARATOR
MENUITEM "Выйти... (&X)\tAlt+F4", IDM_EXIT
END
END

myAccel ACCELERATORS
BEGIN
VK_F2, IDM_SAVE, VIRTKEY, NOINVERT
VK_F3, IDM_OPEN, VIRTKEY, NOINVERT
VK_F4, IDM_EXIT, VIRTKEY, ALT, NOINVERT

"N", IDM_NEW, VIRTKEY, CONTROL, NOINVERT
"A", IDM_SAVEAS, VIRTKEY, CONTROL, NOINVERT
END
, а потом менюшку добавляем в WNDCLASS перед регистрацией класса окна, а акселераторы - перед основным циклом:

myAccels := LoadAccelerators(hInstance, 'myAccel');
while GetMessage(msg, 0, 0, 0) do
begin
if TranslateAccelerator(hwnd, myAccels, msg) <> 0 then
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;


Если ты собрался писать на чистом API - то все, что ты натворил в своем проекте можно уложить в сотню строк. В одну сотню, понимаешь? Причем программа будет хорошо структурированной и понятной с первого взгляда. Если же ты ушел от VCL, чтобы изобрести "свою" VCL - то я подожду, пока ты наиграешься с этим, и потом начнешь задавать вопросы либо о чистом WinAPI, либо о стандартной Дельфийской VCL. В мутантах разбираться у меня нет никакого желания. Твой, практически ничего не делающий, код из первого сообщения компилируется уже в 126К на Дельфи 2009. Код, написанный на чистом WinAPI уложится в 50К. Ну, и от чего ты ушел и куда пришел? Будешь добавлять "фичи" - размер твоего EXE-шника будет расти как на дрожжах, и станет больше VCL-ного как пить дать. Хочешь продолжать с созданием своих неизвестно зачем понадобившихся классов - продолжай заниматься непонятно чем. Только предупреди, чтоб я мог знать, стоит ли сюда заходить или проходить мимо...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> ? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться:

INT_PTR выдаёт ошибку. Остальное поправил, спасибо.

> RegisterHotKey - это один способ

Ага, оно.

> Если же ты ушел от VCL, чтобы изобрести "свою" VCL

Ну нужно же мне хоть какое-то упрощение, да и не собираюсь я полностью абстрагироваться от WinAPI, даже у Борланда всё равно не вышло. У меня на размер оно не повлияло. Я не знаю, что делает с моим кодом D2009. У меня, после компиляции семёркой, екзешник занимает 25 Кб (пустой екзе - 13 Кб). И это логично, потому что все модули очень маленькие и почти каждый участок кода из библиотек используется. Может быть, D2009 на каждое упоминание модуля в uses создаёт свою копию модуля?

Остались вопросы:
1. Что делать с диалогом открытия?
2. Какие ресурсы надо освобождать, а какие - нет? Особенно интересует DC. Когда нужен ReleaseDC и DeleteDC?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 3:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name