Форум » [x]Harbour » Memoedit » Ответить

Memoedit

Dima: В 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 то работает , но хотелось бы запись повесить на свою кнопку

Ответов - 20

Andrey: Посмотри "мемоэдит" по справке хХарбора ! У меня работает своя функция, тоже по F2.....

Dima: Andrey пишет: Посмотри "мемоэдит" по справке хХарбора ! У меня работает своя функция, тоже по F2..... Тогда пример покажи.

Петр: Вот если верить этому самому примеру - вы должны написать что-то вроде #include "Inkey.ch" #include "Memoedit.ch" [pre2]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 [/pre2]


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 ... ?

Додик: Петр пишет: #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.

Pasha: К сожалению, функция 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

Додик: То есть я могу до вызова memoedit(), обратиться к "своей" функции myfunc() и она позволит завершить редактирование мемополя Esc-ом с сохранением занесенного в переменную?! Вот как ты тут мне подправил недавно... А на счет "освежите"... Побойтесь Бога! Я клиппер-то изучал на коленке методом "научного тыка"... А первые попытки были сделаны в возрасте за 30 на "Партнере ВЦ-01" у которого вместо винта был магнитофон кассетный, в вместо монитора - телевизор (отечественные, разумеется!)... Я уж год как пенсию получаю, освежать уже вообще скоро нечем будет!

Петр: Додик пишет: То есть я могу до вызова memoedit(), обратиться к "своей" функции myfunc() К ней не нужно обращаться непосредственно - memoedit сама вызовет myfunc. Самодостаточный пример [pre2]#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 [/pre2]

Петр: Додик пишет: А на счет "освежите"... Это все лирика - учиться никогда не поздно, мозг и память нужно тренировать в любом возрасте и в любой доступной форме.

Додик: Петр, спасибо. Буду пытаться. И освежать и писать. О результатах доложу. Если не задолбал, конечно!

Dima: В функции пользователя MEMOEDIT необходимо каждые 10 секунд опрашивать некую базу. Это работает пока кнопки нажимаются , кнопки не давяться и нет опроса базы. Не пойму как выкрутится. Повесить перед MEMOEDIT что то типа HB_IDLEADD c функцией опроса этой базы не предлагать PS Проехали. Переделал через HBEDITOR , в топку MEMOEDIT.

Andrey: Dima пишет: В Clipper этот код работает Я тоже с этим столкнулся. Переделал как в хелпе пишут: #include "Inkey.ch" #include "Memoedit.ch" .... и т.д.

Dima: Andrey пишет: Dima пишет: цитата: В Clipper этот код работает Ты не смотришь на дату когда вопрос был задан Это было 7 лет назад.

MIKHAIL: Где можно посмотреть документацию на класс HBEDITOR() ? Можно в нем выделять фрагменты текста и перемещаться по строкам ? Какой допустимый размер текста он поддерживает ?

Pasha: Насчет доки не скажу, может где-то и есть. Если нет - то смотреть сырцы, хотя бы список методов. В классе HBEDITOR работы с фрагментами текста нет. Этот класс конечно бедноват. См. contrib\xhb\xhbredit.prg, класс XHBEditor, аналогичный класс из xHarbour. Там есть и выделение текста, и еще много чего есть. Насчет допустимого размера - вряд ли сейчас есть какое-то ограничение. Разве что 4Г для 32-х битных систем. Размер текста безграничен в пределах разумного.

alkresin: Pasha пишет: См. contrib\xhb\xhbredit.prg, класс XHBEditor, аналогичный класс из xHarbour. Там есть и выделение текста, и еще много чего есть. Выделение текста есть, но какими клавишами он копируется в clipboard, так и не понял (в исходниках не искал). "Много чего еще" тоже не заметил). Ни help'а встроенного, ни меню. Просто чуь-чуть расширенная версия Memoedit. Тема эта мне близка, сам пишу сейчас консольный редактор на Harbour - чтобы можно было и в приложение встроить, и использовать как реальный редактор - замену Far, mc и др. Много функций ведь и не надо, нужны только те, что реально нужны).

MIKHAIL: 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 ?

alkresin: 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, как я понимаю, что-то такое тоже есть, но сделано по-другому.

Pasha: 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 не поддерживает.



полная версия страницы