Форум » [x]Harbour » Как сохранить K_TAB внутри MEMOEDIT() ? » Ответить

Как сохранить K_TAB внутри MEMOEDIT() ?

Sergy: Добрый день. Ситуация: ------------ 1) Юзер копирует в буфер обмена windows несколько строк/столбцов информации из Excel. 2) Переключается в окно программы и в MENOEDIT() вставляет через Ctrl+V информацию из буфера обмена. Строки разделяются стандартными CRLF, столбцы - K_TAB = CHR(9). Редактор преобразует все символы табуляции на нужное кол-во пробелов. 3) Далее выходит из MEMOEDIT(), информация из этого окна передается на дальнейшую обработку как очень длинная текстовая переменная. -- Вопрос: "съеденные" символы табуляции оооочень помогли-бы в разборе полученной информации. Нужно их как-то сохранить или заменить на что угодно - хоть CHR(0), хоть CHR(255) - внешний вид строк в окне редактора особо никого не волнует. Как к этому подступиться? Либо получить как-то сам буфер обмена и в нем сделать CHARREPL() перед вставкой в редактор. Либо пошаманить в редакторе. Посмотрел MEMOEDIT() -> HBEDITOR() -> Edit(nPassedKey) со всеми остановками... Дописать свой класс канешно можно, но есть ли лучший вариант? Стыдно признаться, краем уха слышал про наследование, но так ни разу его и не использовал...

Ответов - 5

Dima: В Memoedit не уверен что сможешь контролировать нажатие CTRL+V В HbEditor можно. И вот в нем можно сделать что типа замены chr(9) в hb_gtInfo( HB_GTI_CLIPBOARDDATA ) на что то свое Какой нить charrepl над hb_gtInfo( HB_GTI_CLIPBOARDDATA ) и затем hb_keyins

Sergy: Dima пишет: В Memoedit не уверен что сможешь контролировать нажатие CTRL+V В HbEditor можно. И вот в нем можно сделать что типа замены chr(9) в hb_gtInfo( HB_GTI_CLIPBOARDDATA ) на что то свое У меня стоит "глобальный" обработчик каждого нажатия: HB_GTInfo( HB_GTI_INKEYFILTER, { | nKey | KeyDriver(nKey) } ) В нем уже прописано: [pre2] FUNC KeyDriver(nKey) // обработчик всех кнопок в программе! .... SWITCH nKey // CASE K_INS // проверяем на вставку из буфера IF ShiftPressed() .OR. CtrlPressed() // Shift+Ins или Ctrl+V ? // вставляем из буфера: hb_GtInfo( HB_GTI_CLIPBOARDPASTE ) nKey := 0 // остальное не нужно ENDIF EXIT ... [/pre2]Так что Ctrl+V или Shift+Ins работают во всей программе "как нужно", включая GET/MEMOEDIT/BROWSE и тп... А вариант с hb_GtInfo(HB_GTI_CLIPBOARDDATA) - похоже то, что доктор прописал. tmp := hb_GtInfo(HB_GTI_CLIPBOARDDATA) hb_GtInfo(HB_GTI_CLIPBOARDDATA,CHARREPL(CHR(9),tmp,CHR(254))) hb_GtInfo( HB_GTI_CLIPBOARDPASTE ) Спасибо!

petr707: Буфер легко получить и так.. переокрыть MEMOEDIT - по нужной клавише ,например признаки lexit , lrepl - можно переопределять в пользовательской функции user_memo cBufer:=... lexit:=.f. lrepl:=.f. do while !lexit cBufer:=MEMOEDIT(cBufer,,,"user_memo",,,) if lrepl // здесь замена cBufer endif lexit :=(lastkey()=K_ESC)// .or. ... if lexit; exit;endif enddo


Sergy: petr707 пишет: Буфер легко получить и так.. переокрыть MEMOEDIT - по нужной клавише ,например признаки lexit , lrepl - можно переопределять в пользовательской функции user_memo Либо я не понял идею, либо не получится. MEMOEDIT(), да и в целом класс HBEDITOR() сразу заменяет табуляции на нужное число пробелов. После выхода из MEMOEDIT() - как понять, в каком именно месте текстовой переменной должны быть табуляции ?

petr707: <Shift+F6> вставка с заменой K_TAB на "!" <F2> сохранить в файл test.txt Текст примера (форум немного испортил текстовые комментарии) #include "hbgtinfo.ch" #include "inkey.ch" #include "memoedit.ch" // hbct.hbc Procedure main Local cBuf:= "1234567890ASDFGHJK§¶§Ѕ§Ј§Ў§±§І§°§-§ҐЁ\ЁЂ©Р©ёЁkЁlЁpЁj©¤" Local loem:=.f. Public lexit:=.f. Public lwas_esc:=.f. Public lsave:=.f. Public lch_oem:=.f. STRFILE(CHR(K_TAB)+"1"+CHR(K_TAB)+"2","for_ins.txt",.f.) // §Ґ§Э§с §У§г§д§С§У§Ь§Ъ <TAB> cls do while !lexit lch_oem:=.f. lsave:=.f. cBuf:=MEMOEDIT(cBuf,5,0,Maxrow()-5,Maxcol()-5,.T.,"user_MEMO",80,60) if lastkey()=K_ESC .or. lwas_esc keyboard(CHR(K_ESC));inkey() EXIT endif if lch_oem lexit:=.f. if loem cBuf:=hb_oemToAnsi(cBuf) else cBuf:=hb_AnsiToOem(cBuf) endif loem:=!loem LOOP endif if lsave STRFILE(cBuf,"test.txt",.f.) endif if lexit EXIT endif enddo return procedure User_memo(mode,line,col) Local lkey := lastkey(),nKey:=0,lchange:=.f. Local nret := ME_DEFAULT Local cPaste:="" do case case mode=ME_INIT return ME_DEFAULT case lkey =K_F8 lwas_esc :=.f. lch_oem :=.t. return K_CTRL_W case lkey =K_F2 lexit :=.t. lsave :=.t. return K_CTRL_W case lkey =K_ESC lwas_esc :=.t. return K_CTRL_W case lastkey()=K_SH_F6 cPaste:= hb_gtInfo( HB_GTI_CLIPBOARDDATA ) //cPaste:= hb_ansitooem(cPaste) cPaste := STRTRAN(cPaste,chr(K_TAB),"!") // CHR(0) hb_keyins( cPaste ) return 110 //ME_PASTE otherwise endcase return nret



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