Страница: 1 | 2 |
Вопрос: x3mEd, редактор с подсветкой asm
Добавлено: 15.12.05 08:45
Автор вопроса: mc-black | Web-сайт:
Вот, это конечно далеко не RadASM, и даже не QEditor, просто текстовый редактор с подсветкой синтаксиса ассембрера masm32, и минимум функций.
http://mc-black.narod.ru/x3mEd016.zip
Программка незаконченная, до этого пока далеко, поэтому выкладываю без исходников. Просто интересно послушать ваши мнения. Просьба не судить строго ;)
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 15.12.05 11:56
Как раз наоборот, недоделанные программы надо выкладывать с исходниками, чтобы 1) юзер сам мог добавить нехватающую функциональность и послать ее автору, 2) чтобы можно было понять и исправить возникающие ошибки (опять-таки с отсылкой автору)
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 15.12.05 12:15
Выделенное слово плохо читается (теряется на синем фоне выделения). Может попробовать старый ричедит? У него выделение черного цвета.
Номер ответа: 3
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #3
Добавлено: 15.12.05 12:51
Toolbar было бы неплохо сделать.
Номер ответа: 4
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #4
Добавлено: 15.12.05 13:06
Sharp
Ой, мне-то этого не надо может рассказывать. Я не собирался из какого-то редактора делать открытый проект. Старые исходники на wasm.ru/forum есть, а более новых может никто и не увидит. Исправлением багов собираюсь заниматься сам. Продукт из этого делать не планировал.
Кто хочет, может добавить нехватающую функциональность на основе многочисленных редакторов в исходниках того же wasm.ru А сказать, что x3mEd чем-то лучше тех, что там есть я не берусь. Просто ещё один.
HOOLIGAN
Там наверняка можно сделать двуцветное выделение без того, чтобы таскать за собой старый richedit, тоже обратил внимание - будем работать! Добавлю в 2do list.
Номер ответа: 5
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #5
Добавлено: 15.12.05 13:14
Toolbar.. может быть, но это как-нить потом, не скоро. Слишком много багов. Слабый пока поиск, нет замены текста, нет help'а Не хранимые настройки. Ограниченный размер открываемых файлов. Нет нумерации строк и перехода к строке по номеру. Много всего в общем. Кстати, может кому встречался пример прорисовки картинки ПОД текстом Rich Edit, т.е. фоновой рисунок?
Номер ответа: 6
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #6
Добавлено: 15.12.05 21:36
Думаю, ты разберешься что к чему:
On Error Resume Next
Dim mPos As Long
mPos = Val(InputBox("Введите номер строки для перехода на нее", "Переход на строку", mRichEdit.CurrentLine + 1))
With cRich
.SelStart = SendMessage(.hwnd, &HBB, mPos - 1, 0& 'EM_LINEINDEX
End With
End Sub
Private Sub mnuFindJumpOnLineSymbol_Click()
On Error Resume Next
Dim mPos As String, mLineLen As Long, mPosLine As Long, mPosString As Long, mInput() As String
With cRich
mPos = InputBox("Введите номер строки и столбца. Например:" & vbCrLf & "24:5, где 24 - строка, а 5 - символ в строке", "Переход на строку и столбец", CStr(mRichEdit.CurrentLine + 1) & ":" & CStr(cRich.SelStart - SendMessage(cRich.hwnd, &HBB, mRichEdit.CurrentLine, 0& + 1))
mInput = Split(mPos, ":"
' Вычисление нужной строки
mPosLine = SendMessage(.hwnd, &HBB, CLng(Val(Trim(mInput(0)))) - 1, 0&
' Если строки с введенным номером нету, то берем в конец текста
If mPosLine = (-1) Then mPosLine = SendMessage(.hwnd, &HBB, SendMessage(.hwnd, &HBA, 0&, 0& - 1, 0&
' Вычисление номера символа в строке для переходана него
mLineLen = SendMessage(.hwnd, &HC1, mPosLine, 0&
' Если он больше, чем длина, то делаем его равным длине
If CLng(Val(Trim(mInput(1)))) > mLineLen + 1 Then mPosString = mLineLen + 1 Else mPosString = CLng(Val(Trim(mInput(1)))) - 1
If CLng(Val(Trim(mInput(1)))) > &H0 Then .SelStart = mPosLine + mPosString
End With
End Sub
Номер ответа: 7
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #7
Добавлено: 15.12.05 21:38
Private Const cNull As Long = &H0
Public Property Get CurrentLine() As Long
CurrentLine = SendMessage(hRichEdit,EM_EXLINEFROMCHAR, cNull, ByVal GetTextSel.cpMin)
End Property
Номер ответа: 8
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #8
Добавлено: 15.12.05 21:39
Private Const cNull As Long = &H0
Public Property Get CurrentLine() As Long
CurrentLine = SendMessage(hRichEdit,EM_EXLINEFROMCHAR, cNull, ByVal GetTextSel.cpMin)
End Property
Номер ответа: 9
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #9
Добавлено: 15.12.05 21:51
Нумерацией тоже могу поделиться - пиши на аську или на мыло.
Номер ответа: 10
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #10
Добавлено: 16.12.05 11:49
Спасибо за помощь, Александр, я мог бы наверное и сам переход к строке, символу. Теперь и в справочник не надо лезьть смотреть нужные сообщения. Только пишу на masm32. С нумерацией у меня не то, чтобы проблемы как это сделать, сложнее определиться куда писать номера строк чисто технически: в отдельный контрол или при перерисовке Rich Edit рисовать их на правом поле. В общем надо браться и делать, чего уж там...
Насчёт тулбара: его скорее всего не будет вообще. Дело в том, что мысль была всё управление редактора сделать на горячих клавишах. Меню, ещё пусть будет, там к тому же написаны сочетания клавиш. Статус строка пусть будет, там некоторая инфа, которая нужна постоянно. Тулбар, я считаю - это уже лишнее. Потом всегда можно будет добавить. Пока, я считаю, важнее наращивать возможности программы, устранять баги, а не наворачивать интерфейс. Успеется ещё.
Номер ответа: 11
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #11
Добавлено: 18.12.05 10:07
Немного доработанная версия, есть две хранимых настройки: язык интерфейса и перенос слов
http://mc-black.narod.ru/x3mEd017.zip
Номер ответа: 12
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #12
Добавлено: 18.12.05 13:21
Маленький совет:
Все настройки объединить в структуру типа
langID dd ?
lpFont LOGFONT <?>
BackColor dd ?
lastCursorPos dd ?
......
SETTINGS ends
и завести переменную
MySettings SETTINGS<?>
И сохранять всю переменную скопом в файл или в реестр, как бинарные данные. При открытии программы читать из файла в переменную MySettings.
По мере развития не надо будет раз за разом переписывать процедуру сохранения настроек. Только добавляешь в структуру новое поле.
Номер ответа: 13
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #13
Добавлено: 19.12.05 10:16
Хорошая мысль, мне она жизнь облегчит существенно. Только не знаю, как пользователю: не будет же он при желании лезть с HEX-редактором и описанием в .ini. А так сложней мне, но наглядней файл с настройками. Хотел как в totcmd, чтобы просто, наглядно и понятно. Можно таким способом объединить некоторые взамисвязанные настройки, например размеры и положение окна на экране.
Номер ответа: 14
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #14
Добавлено: 19.12.05 11:38
Юзеру необязательно лазить с hex-редактором в реестр
Пример: юзер меняет язык интерфейса. При этом в WndProc посылается соответствующее сообщение. По этому сообщению пишешь код:
invoke GetKeyboardLayout, NULL
and eax,0FFFFh
mov MySettings.landID, eax
xor eax,eax
ret
И всё. Никаких редакторов.
А при закрытии программы сохраняешь MySettings
Точно так же решается и сохранение размеров окна, и выбранный шрифт и т.д. и т.п.
Номер ответа: 15
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #15
Добавлено: 19.12.05 11:56
Поделюсь с тобой примером, как я меняю шрифт и сохраняю сделанный выбор:
Есть структура типа упоминавшейся MySettings - tmpDATA.
dwWidth dd ? ;ширина окна
BackColor dd ? ;цвет заливки
FrameColor dd ? ;цвет рамки
ForeColor dd ? ;цвет шрифта
FrameBrush dd ? ;хэндл кисти по цвету FrameColor
lpFont LOGFONT <?> ;структура шрифта
hFont dd ? ;хэндл шрифта, созданного по данным в lpFont
SndPath db 256 dup(?) ;буфер для имени файла
appDATA ends
tmpDATA appDATA <?>
GetFont proc
LOCAL cf :CHOOSEFONT
LOCAL buffer[128] :BYTE
;получаем текущие данные структуры LOGFONT по хэндлу шрифта
;прямо передавая адреса внутри переменной tmpDATA в ф-цию GetObject
invoke GetObject, tmpDATA.hFont, sizeof LOGFONT, addr tmpDATA.lpFont
invoke RtlZeroMemory, addr cf, sizeof CHOOSEFONT
mov cf.lStructSize, sizeof CHOOSEFONT
m2m cf.hwndOwner, hDlg
mov cf.iPointSize, 8
;указываем буфер для сохранения выбора юзера - tmpDATA.lpFont
mov cf.lpLogFont, offset tmpDATA.lpFont
mov cf.Flags, CF_EFFECTS or CF_INITTOLOGFONTSTRUCT or CF_SCREENFONTS
m2m cf.hInstance, hInstance
invoke ChooseFont, addr cf
.if (eax)
;теперь если юзер сделал выбор шрифта, его выбор сидит в tmpDATA.lpFont
;создаем шрифт в соответствии с его выбором
invoke CreateFontIndirect, addr tmpDATA.lpFont
;и сохраняем в нашу же переменную: tmpDATA.hFont
mov tmpDATA.hFont,eax
invoke lstrcpy, addr buffer, addr szFont
invoke lstrcat, addr buffer, addr tmpDATA.lpFont.lfFaceName
invoke SetDlgItemText, hDlg, STC_FONT, addr buffer
.endif
ret
GetFont endp
Опять же никаких редакторов для изменения не нужно
Диалог выбора шрифта сам заполняет нашу переменную настроек, надо только ему дать адреса полей этой переменной.