Автор | Сообщение |
|
| |
Пост N: 936
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.10.08 13:24. Заголовок: Memoedit
В Clipper этот код работает repl prime with memoedit(prime,11,11,18,69,.t.,"myfunc",58) ***************************** func myfunc() local key:=lastkey() do case case key ==-1 keyboard chr(23) return 0 endcase return 0 Жмем F2 , окно редактирования закрывается и данные сохраняются. В Xharbour ни чего не просиходит. Как решить проблемку ? ЗЫ Если нажать CTRL_W то работает , но хотелось бы запись повесить на свою кнопку
|
|
|
Новых ответов нет
[см. все]
|
|
|
| постоянный участник
|
Пост N: 694
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.08 16:46. Заголовок: Посмотри "мемоэд..
Посмотри "мемоэдит" по справке хХарбора ! У меня работает своя функция, тоже по F2.....
|
|
|
|
| |
Пост N: 943
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.10.08 16:59. Заголовок: Andrey пишет: Посмо..
Andrey пишет: цитата: | Посмотри "мемоэдит" по справке хХарбора ! У меня работает своя функция, тоже по F2..... |
| Тогда пример покажи.
|
|
|
|
| постоянный участник
|
Пост N: 504
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.10.08 17:33. Заголовок: Вот если верить этом..
Вот если верить этому самому примеру - вы должны написать что-то вроде #include "Inkey.ch" #include "Memoedit.ch" FUNCTION myfunc() LOCAL nKey := LastKey() LOCAL nRet := ME_DEFAULT DO CASE CASE nKey IN { K_ALT_W, K_CTRL_W, K_ESC } nRet := ME_IGNORE // ignore default termination keys CASE nKey == K_F2 nRet := K_ALT_W // Save with F2 CASE nKey == K_ALT_C nRet := K_ESC // Cancel with Alt+C ENDCASE // RETURN nRet
|
|
|
|
| |
Пост N: 946
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.10.08 09:09. Заголовок: Петр Спасибо !!!!!!..
Петр Спасибо !!!!!!!!
|
|
|
|
| |
Пост N: 15
Зарегистрирован: 01.04.12
|
|
Отправлено: 07.04.12 19:15. Заголовок: to Andrey end Dima
Dima пишет: цитата: | repl prime with memoedit(prime,11,11,18,69,.t.,"myfunc",58) ***************************** func myfunc() local key:=lastkey() do case case key ==-1 keyboard chr(23) return 0 endcase return 0 |
| Что-то подобное я читал у Рика Спенса "Программирование на клиппер", только там сложнее. Меня интересует не F2! Мне ОЧЕНЬ нужно, чтобы при нажатии esc введенные данные в мемополе сохранились в переменную, используемую далее с выводом на печать. Именно чтобы при Esc сохранялись данные! Не F2, не Ctrl-W, только ESC!!! Нельзя ли прописать так? case key ==23 keyboard chr (27) Я хочу добиться одного, чтобы при нажатии Esc (23) в буфер уходила команда на запоминание мемополя (27), то бишь Ctrl-W. И еще, обязательно ли в начале подпрограммы прописывать #include ... ?
|
|
|
|
| |
Пост N: 16
Зарегистрирован: 01.04.12
|
|
Отправлено: 07.04.12 19:27. Заголовок: to Петр
Петр пишет: цитата: | #include "Inkey.ch" #include "Memoedit.ch" FUNCTION myfunc() LOCAL nKey := LastKey() LOCAL nRet := ME_DEFAULT DO CASE CASE nKey IN { K_ALT_W, K_CTRL_W, K_ESC } nRet := ME_IGNORE // ignore default termination keys CASE nKey == K_F2 nRet := K_ALT_W // Save with F2 CASE nKey == K_ALT_C nRet := K_ESC // Cancel with Alt+C ENDCASE // RETURN nRet |
| или так, к примеру можно? #include "Inkey.ch" #include "Memoedit.ch" FUNCTION myfunc() LOCAL nKey := LastKey() LOCAL nRet := ME_DEFAULT DO CASE CASE nKey IN { K_ALT_W, K_CTRL_W , K_ESC } nRet := ME_IGNORE // ignore default termination keys CASE nKey == K_ESC nRet := K_CTRL_W // Save with ESC end cancel CASE nKey == K_ALT_C nRet := K_ESC // Cancel with Alt+C ENDCASE // RETURN nRet Петр: Вот так - можно. Освежите свои знания о использовании оператора DO CASE.
|
|
|
|
| Администратор
|
Пост N: 2335
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.04.12 21:53. Заголовок: К сожалению, функция..
К сожалению, функция memoedit из xharbour не полностью совместима с клипперовским memoedit. С этой функцией в harbour дело обстоит еще хуже, чем в xharbour. Но клипперовский mtmoedit - это атавизм от ранних версий клиппера, summer'87 В xHarbour/Harbour для просмотра/редактирования текста есть класс HBEditor. С помощью это класса в харборе делается попытка эмулировать поведение memoedit Я сторонник немного другого подхода, а именно - использование непосредственно этого класса. Вот небольшой пример: oEd := HBEditor():New( ct, nTop, nLeft, nBottom, nRight, ; .t., nLen, nTab ) //oEd:MemoInit() oEd:RefreshWindow() while ! oEd:lExitEdit nKey := Inkey(0, 255) if bUser # nil nKey := Eval(bUser, nKey) endif oEd:Edit( nKey ) enddo bUser - этот блок кода, которому в качестве параметра передается нажатая клавижа, для ее специальной обработки. Это вместо пользовательской функции memoedit
|
|
|
|
| |
Пост N: 19
Зарегистрирован: 01.04.12
|
|
Отправлено: 08.04.12 12:27. Заголовок: to Петр
То есть я могу до вызова memoedit(), обратиться к "своей" функции myfunc() и она позволит завершить редактирование мемополя Esc-ом с сохранением занесенного в переменную?! Вот как ты тут мне подправил недавно... А на счет "освежите"... Побойтесь Бога! Я клиппер-то изучал на коленке методом "научного тыка"... А первые попытки были сделаны в возрасте за 30 на "Партнере ВЦ-01" у которого вместо винта был магнитофон кассетный, в вместо монитора - телевизор (отечественные, разумеется!)... Я уж год как пенсию получаю, освежать уже вообще скоро нечем будет!
|
|
|
|
| постоянный участник
|
Пост N: 1084
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.04.12 13:53. Заголовок: Додик пишет: То ест..
Додик пишет: цитата: | То есть я могу до вызова memoedit(), обратиться к "своей" функции myfunc() |
| К ней не нужно обращаться непосредственно - memoedit сама вызовет myfunc. Самодостаточный пример Скрытый текст #include "Inkey.ch" #include "Memoedit.ch" STATIC slChanged := .F. PROCEDURE Main( cFileName ) LOCAL cScreen LOCAL cText := "" SAVE SCREEN TO cScreen SET SCOREBOARD OFF SetCancel( .F. ) CLS IF .NOT. Empty( cFileName ) .AND. File( cFileName ) cText := MemoRead( cFileName ) ENDIF @ 0, 0 TO MaxRow(), MaxCol() DOUBLE cText := MemoEdit( cText, ; 1, 1 , ; MaxRow()-1, MaxCol()-1, ; .T., "MYFUNC" ) IF .NOT. Empty( cFileName ) .AND. ; File( cFileName ) .AND. ; slChanged .AND. ; Alert( "Save changes?", { "Yes", "No" } ) == 1 // remove "soft carriage return/line feeds" cText := StrTran( cText, Chr(141)+Chr(10), " " ) // save file MemoWrit( cFileName, cText ) ENDIF RESTORE SCREEN FROM cScreen RETURN FUNCTION myfunc() LOCAL nKey := LastKey() LOCAL nRet := ME_DEFAULT DO CASE CASE nKey IN { K_ALT_W, K_CTRL_W } // CASE AScan( {K_ALT_W, K_CTRL_W}, nKey ) > 0 nRet := ME_IGNORE // ignore default termination keys CASE nKey == K_ESC nRet := K_CTRL_W // Save with ESC end cancel CASE nKey == K_ALT_C nRet := K_ESC // Cancel with Alt+C OTHERWISE slChanged := .T. ENDCASE // RETURN nRet
|
|
|
|
|
| постоянный участник
|
Пост N: 1085
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.04.12 14:01. Заголовок: Додик пишет: А на ..
Додик пишет: Это все лирика - учиться никогда не поздно, мозг и память нужно тренировать в любом возрасте и в любой доступной форме.
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 01.04.12
|
|
Отправлено: 08.04.12 15:59. Заголовок: спасибо!
Петр, спасибо. Буду пытаться. И освежать и писать. О результатах доложу. Если не задолбал, конечно!
|
|
|
|
|
| |
Пост N: 4750
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.04.15 16:04. Заголовок: В функции пользовате..
В функции пользователя MEMOEDIT необходимо каждые 10 секунд опрашивать некую базу. Это работает пока кнопки нажимаются , кнопки не давяться и нет опроса базы. Не пойму как выкрутится. Повесить перед MEMOEDIT что то типа HB_IDLEADD c функцией опроса этой базы не предлагать PS Проехали. Переделал через HBEDITOR , в топку MEMOEDIT.
|
|
|
|
| постоянный участник
|
Пост N: 4117
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.04.15 22:21. Заголовок: Dima пишет: В Clipp..
Dima пишет: цитата: | В Clipper этот код работает |
| Я тоже с этим столкнулся. Переделал как в хелпе пишут: #include "Inkey.ch" #include "Memoedit.ch" .... и т.д.
|
|
|
|
| |
Пост N: 4751
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.04.15 15:31. Заголовок: Andrey пишет: Dima ..
Andrey пишет: цитата: | Dima пишет: цитата: В Clipper этот код работает |
| Ты не смотришь на дату когда вопрос был задан Это было 7 лет назад.
|
|
|
|
| |
Пост N: 201
Зарегистрирован: 05.10.06
|
|
Отправлено: 27.03.19 12:44. Заголовок: Где можно посмотреть..
Где можно посмотреть документацию на класс HBEDITOR() ? Можно в нем выделять фрагменты текста и перемещаться по строкам ? Какой допустимый размер текста он поддерживает ?
|
|
|
|
| Администратор
|
Пост N: 3834
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.03.19 13:23. Заголовок: Насчет доки не скажу..
Насчет доки не скажу, может где-то и есть. Если нет - то смотреть сырцы, хотя бы список методов. В классе HBEDITOR работы с фрагментами текста нет. Этот класс конечно бедноват. См. contrib\xhb\xhbredit.prg, класс XHBEditor, аналогичный класс из xHarbour. Там есть и выделение текста, и еще много чего есть. Насчет допустимого размера - вряд ли сейчас есть какое-то ограничение. Разве что 4Г для 32-х битных систем. Размер текста безграничен в пределах разумного.
|
|
|
|
| moderator
|
Пост N: 1172
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.19 09:26. Заголовок: Pasha пишет: См. co..
Pasha пишет: цитата: | См. contrib\xhb\xhbredit.prg, класс XHBEditor, аналогичный класс из xHarbour. Там есть и выделение текста, и еще много чего есть. |
| Выделение текста есть, но какими клавишами он копируется в clipboard, так и не понял (в исходниках не искал). "Много чего еще" тоже не заметил). Ни help'а встроенного, ни меню. Просто чуь-чуть расширенная версия Memoedit. Тема эта мне близка, сам пишу сейчас консольный редактор на Harbour - чтобы можно было и в приложение встроить, и использовать как реальный редактор - замену Far, mc и др. Много функций ведь и не надо, нужны только те, что реально нужны).
|
|
|
|
| |
Пост N: 202
Зарегистрирован: 05.10.06
|
|
Отправлено: 31.03.19 07:22. Заголовок: alkresin пишет: Выд..
alkresin пишет: цитата: | Выделение текста есть, но какими клавишами он копируется в clipboard, так и не понял (в исходниках не искал) |
| в исходниках: #ifdef HB_EXT_INKEY CASE K_CTRL_A // Select all ::SetTextSelection( "ALL" ) EXIT CASE K_CTRL_C // Copy hb_gtInfo( HB_GTI_CLIPBOARDDATA, ::GetTextSelection() ) // ::ClrTextSelection() EXIT CASE K_CTRL_X // Cut hb_gtInfo( HB_GTI_CLIPBOARDDATA, ::GetTextSelection() ) IF ::lEditAllow ::DelTextSelection() ENDIF EXIT CASE K_CTRL_V // Paste IF ::lEditAllow ::AddText( StrTran( hb_gtInfo( HB_GTI_CLIPBOARDDATA ), Chr( 0 ), " " ), .T. ) ::ClrTextSelection() ENDIF EXIT а что такое #ifdef HB_EXT_INKEY ?
|
|
|
|
| moderator
|
Пост N: 1173
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.03.19 13:36. Заголовок: MIKHAIL пишет: а чт..
MIKHAIL пишет: цитата: | а что такое #ifdef HB_EXT_INKEY ? |
| 2013-04-26 14:31 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + contrib/xhb/xhbinkey.ch + contrib/xhb/xhbkey.c * contrib/xhb/xhb.hbp * contrib/xhb/xhb.hbx + added support for xHarbour compatible extended Inkey() key codes This functionality works with GTs which can operate on Harbour extended key codes which are translated at runtime to xHarbour extended keys (HB_EXT_INKEY). Но все равно непонятно, зачем в xhbredit.prg стоит эта проверка. В Harbour можно вызвать Inkey() таким образом: Inkey( 0, HB_INKEY_ALL + HB_INKEY_EXT ) - в этом случае будут ловиться и события от мыши, и фиксироваться, нажаты ли вместе с основной клавишей Shift, Ctrl, Alt. В xHarbour, как я понимаю, что-то такое тоже есть, но сделано по-другому.
|
|
|
|
| Администратор
|
Пост N: 3835
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.04.19 16:34. Заголовок: alkresin пишет: Но ..
alkresin пишет: цитата: | Но все равно непонятно, зачем в xhbredit.prg стоит эта проверка. |
| В xHb и Harbour по разному реализована поддержка расширенных кодов. В xHb в inkey.ch просто тупо сделаны другие коды, если определен макрос HB_EXT_INKEY. Дешево и сердито, но нет совместимости с клиппером по кодам. В Harbour сделана отдельная расширенная кодировка: см. hbinkey.ch, и надо использовать не коды K_*, а HB_K_* Но в сырцах модуля contrib\xhb\xhbredit.prg осталась проверка на HB_EXT_INKEY, которую Harbour не поддерживает.
|
|
|
|