Здравствуйте. возможно тема замыленная, но всё же есть вопросы. В соседней теме Пётр давал код работы с форматированным текстом, однако те функции предназначены для изменения текста в ЕдиторГаджете, интересует вопрос чтения форматированного текста из редактора. Просто текст считать получается, а форматированный нет. Вопрос второй возможно ли програмно менять текст в файлах ".doc" и ".odt". Вопрос третий какие дополнительные библиотеки существуют для работы с ЕдиторГаджетом, Библиотека LEP0_4Beta не хочет работать(в смысле не работает ни один пример с её использованием), как её правильно установить? Пока вроде всё, заранее спасибо всем, кто сможет помочь.
Текстовый редактор
Сообщений 1 страница 30 из 33
Поделиться219.04.2010 17:23:14
Библиотека LEP0_4Beta не хочет работать
Она для PB 4.00
Вопрос второй возможно ли програмно менять текст в файлах ".doc" и ".odt".
Можно конечно, но нужно знать структуру этих файлов.
интересует вопрос чтения форматированного текста из редактора.
В библиотеке LEP0_4Beta есть функция считывающая такой текст
String.s=Editor_RTF_GetRTFCode(#Gadget)
Поделиться319.04.2010 17:35:06
Я так понимаю что выход поставить РВ4.0 или есть другие библиотеки для РВ 4.40 . И ещё вопрос как сделать возможность добавления пользователем TextGadget, ComboBoxGadget, DateGadget и т.д.
Поделиться419.04.2010 18:20:56
ещё вопрос как сделать возможность добавления пользователем TextGadget, ComboBoxGadget, DateGadget и т.д.
Примерно как здесь Создатель программ
Поделиться519.04.2010 18:37:50
Спасибо поизучаю. А возможно сделать мини прогу которая будет считывать текст из другой проги, т.е. основная прграмма запускает вспомогательную, та в свою очередь считывает текс из основной проги, записывает в файл и завершает работу( это к тому, чтобы не возвращаться на РВ 4.0)?
Поделиться619.04.2010 19:18:08
Сделай лучше DLLку или LIB библиотеку.
Хотя нет, это не прокатит, функция Editor_RTF_GetRTFCode требует идентификатор гаджета.
Но можно сделать так
Procedure StreamRTF_Callback(hFile, pbBuff, cb, pcb) Shared Proc_RTF_Text.s Proc_RTF_Text+PeekS(pbBuff) ProcedureReturn 1 EndProcedure Procedure.s RTF_StreamOut(Gadget.l) Shared Proc_RTF_Text.s Proc_RTF_Text="" Protected StreamData.EDITSTREAM StreamData\dwCookie = 0 StreamData\dwError = #Null StreamData\pfnCallback = @StreamRTF_Callback() SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_RTF, @StreamData) ProcedureReturn Proc_RTF_Text EndProcedure
Вызываем RTF_StreamOut и получаем RTF код.
Это слегка изменённый код сохранения RTF данных в файле из соседней темы.
Structure CHARFORMAT2_ cbSize.l dwMask.l dwEffects.l yHeight.l yOffset.l crTextColor.l bCharSet.b bPitchAndFamily.b szFaceName.b[#LF_FACESIZE] _wPad2.w wWeight.w sSpacing.w crBackColor.l lcid.l dwReserved.l sStyle.w wKerning.w bUnderlineType.b bAnimation.b bRevAuthor.b bReserved1.b EndStructure Procedure EditorBackColor(Gadget, Color.l) format.CHARFORMAT2_ format\cbSize = SizeOf(CHARFORMAT2_) format\dwMask = $4000000 ; = #CFM_BACKCOLOR format\crBackColor = Color SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure Procedure EditorSelect(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l) sel.CHARRANGE sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineStart, 0) + CharStart - 1 If LineEnd = -1 LineEnd = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 EndIf sel\cpMax = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineEnd, 0) If CharEnd = -1 sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) Else sel\cpMax + CharEnd - 1 EndIf SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @sel) EndProcedure ; Set the Text color for the Selection ; in RGB format Procedure EditorColor(Gadget, Color.l) format.CHARFORMAT format\cbSize = SizeOf(CHARFORMAT) format\dwMask = #CFM_COLOR format\crTextColor = Color SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure ; Set Font Size for the Selection ; in pt Procedure EditorFontSize(Gadget, Fontsize.l) format.CHARFORMAT format\cbSize = SizeOf(CHARFORMAT) format\dwMask = #CFM_SIZE format\yHeight = FontSize*20 SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure ; Set Font for the Selection ; You must specify a font name, the font doesn't need ; to be loaded Procedure EditorFont(Gadget, FontName.s) format.CHARFORMAT format\cbSize = SizeOf(CHARFORMAT) format\dwMask = #CFM_FACE PokeS(@format\szFaceName, FontName) SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure ; Set Format of the Selection. This can be a combination of ; the following values: ; #CFM_BOLD ; #CFM_ITALIC ; #CFM_UNDERLINE ; #CFM_STRIKEOUT Procedure EditorFormat(Gadget, Flags.l) format.CHARFORMAT format\cbSize = SizeOf(CHARFORMAT) format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE format\dwEffects = Flags SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) EndProcedure Procedure StreamRTF_Callback(hFile, pbBuff, cb, pcb) Shared Proc_RTF_Text.s Proc_RTF_Text+PeekS(pbBuff) ProcedureReturn 1 EndProcedure Procedure.s RTF_StreamOut(Gadget.l) Shared Proc_RTF_Text.s Proc_RTF_Text="" Protected StreamData.EDITSTREAM StreamData\dwCookie = 0 StreamData\dwError = #Null StreamData\pfnCallback = @StreamRTF_Callback() SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_RTF, @StreamData) ProcedureReturn Proc_RTF_Text EndProcedure #Editor = 1 If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) If CreateGadgetList(WindowID(0)) ButtonGadget(0,40,10,220,28,"Получить RTF код") EditorGadget(#Editor, 10, 50, 480, 430) AddGadgetItem(#Editor, 0, "This is a blue, bold and underlined big text") AddGadgetItem(#Editor, 1, "Times new Roman, red, striked out and italic") AddGadgetItem(#Editor, 2, "This is usual text, with a yellow background color") AddGadgetItem(#Editor, 3, "This is usual Text.") EditorSelect(#Editor, 0, 1, 0, -1) ; select line 1 EditorColor(#Editor, RGB(0,0,255)) EditorFontSize(#Editor, 18) EditorFormat(#Editor, #CFM_UNDERLINE) EditorSelect(#Editor, 1, 1, 1, -1) ; select line 2 EditorColor(#Editor, RGB(255,0,0)) EditorFont(#Editor, "Times New Roman") EditorFormat(#Editor, #CFM_ITALIC|#CFM_STRIKEOUT) EditorSelect(#Editor, 2, 1, 2, -1) ; select line 2 EditorBackColor(#Editor, RGB(255,200,100)) EditorSelect(#Editor, 0, 0, 0, 0) ; select nothing again Repeat Event=WaitWindowEvent() If Event=#PB_Event_Gadget If EventGadget()=0 RTF_Text.s=RTF_StreamOut(1) Debug RTF_Text EndIf EndIf Until Event = #PB_Event_CloseWindow EndIf EndIf End
Поделиться722.04.2010 06:17:39
Всем доброго времени. Пётр спасибо за код! Два дня курил гугл и ваш код, но так до меня и не дошло как работает функция EditorSelect(), откуда берётся и для чего нужна структура sel.CHARRANGE. Вот здесь вроде объясняется, но там для Си или дельфи, поэтому не особо понятно.
В принципе изменять и сохранить RTF получается, а вот вывести его обратно в редактор неполучается. Вот код
Result = OpenFile(#PB_Any , "C:\Documents And Settings\Admin\Рабочий стол\Текстовый документ.rtf") Text.s = ReadString(Result) While Eof(Result) = 0 ; loop as long the 'end of file' isn't reached Text + ReadString(Result) ; display line by line in the debug window Wend If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) If CreateGadgetList(WindowID(0)) EditorGadget(1, 10, 50, 480, 430) SetGadgetText(1, Text) Debug Text Repeat Event=WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf EndIf End
выводит текст в редактор но слегка изменённый. Подскажите где ошибка.
Сделай лучше DLLку или LIB библиотеку
С удоволствием, но пока до этого не дрос. Пётр если есть такая возможность, не могли бы Вы собрать такую библиотечку, думаю будет полезна многим. Или скажите где можно почитать, как делать эти бибиотеки.
Поделиться822.04.2010 06:40:58
Подскажите где ошибка.
Наверно так:
ReadFile(1 , "c:\1.rtf") While Eof(1) = 0 Text.s+ ReadString(1) Wend CloseFile(1) If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) EditorGadget(1, 10, 50, 480, 430) SetGadgetText(1, Text) Debug Text Repeat Event=WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Или скажите где можно почитать, как делать эти бибиотеки.
Про создание DLL можно почитать в учебнике Петра на http://pure-basic.narod.ru
Про LIB библиотеку: http://purebasic.info/phpBB2/viewtopic. … t=tailbite
Поделиться922.04.2010 06:47:38
Спасибо haav, но таже история. попробуй открыть этот файл в ворде, потом этим кодом, и увидиш разницу.
Поделиться1022.04.2010 06:54:06
А в чем разница? Не пойму чего то.
Вроде все нормально.
ReadFile(1 , "c:\1.rtf") While Eof(1) = 0 Text.s+ ReadString(1) Wend CloseFile(1) If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) EditorGadget(1, 10, 50, 480, 430) SetGadgetText(1, Text) Debug Text Repeat Event=WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf If OpenFile(1,"c:\2.rtf") WriteString(1,Text) EndIf
Поделиться1122.04.2010 07:28:45
haav в 6 посте код Петра, запусти его и сохрани в rtf. затем открой своим или моим кодом этот файл, и увидиш что вместо четырёх строк останется три и то не полностью.
Поделиться1222.04.2010 08:03:31
If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) EditorGadget(1, 10, 50, 480, 430) If ReadFile(1, "c:\1.rtf") ; Открытие файла. FileSize=Lof(1) ; Определение размера файла в байтах. *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла. ReadData(1, *mem, FileSize) ; Копирование данных из файла в память. SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор. FreeMemory(*mem) ; Освобождение памяти. CloseFile(1) ; Закрытие файла. Else MessageRequester("Ошибка", "Не удалось открыть файл") EndIf Repeat Event=WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Поделиться1322.04.2010 08:07:55
Огромное спасибо haav, помогло . Просьба к Петру (о библиотеки) остаётся в силе.
Поделиться1422.04.2010 11:44:28
Просьба к Петру (о библиотеки) остаётся в силе
Посмотри здесь http://pure-basic.narod.ru/docs/dll.html
Поделиться1522.04.2010 17:44:44
Спасибо всем! Собрал пробную библиотеку. Скажите, а как её можно здесь выложить для теста?
Поделиться1622.04.2010 17:53:08
Скажите, а как её можно здесь выложить для теста?
Закачать на файлообменик и ссылку сюда.
Поделиться1722.04.2010 17:55:47
Пётр. Я ими ни когда не пользовался, подскажи ссылкой как это сделать?
Поделиться1822.04.2010 18:04:42
Открываешь этот сайт http://depositfiles.com/ru
Указываешь путь к файлу и нажимаешь на кнопку "Загрузить сейчас".
По завершению загрузки, будет несколько ссылок, копируешь сюда самую верхнюю.
Поделиться1922.04.2010 18:10:03
Вот Здесь. Приготовился слушать критику .
Отредактировано lakomet (23.04.2010 02:43:34)
Поделиться2022.04.2010 19:41:22
Сейчас пробовать желания нет, но на будующее возможно пригодится.
Один вопрос: в справке команда DV_RTF_SELECT убрана намеренно?
Поделиться2122.04.2010 19:51:01
Вот Здесь. Приготовился слушать критику
Собирал DLLку или библиотеку функций для пурика?
Поделиться2223.04.2010 02:41:38
в справке команда DV_RTF_SELECT убрана намеренно?
Я не знаю как её описать.
Собирал DLLку или библиотеку функций для пурика?
Библиотека функций для пурика.
Поделиться2323.04.2010 06:35:19
Я не знаю как её описать.
Надо было тогда оставить в первоначальном виде(английский вариант этой страницы).
Поделиться2423.04.2010 08:56:23
Надо было тогда оставить в первоначальном виде(английский вариант этой страницы)
Ну эту справку я сочинял сам, а не переводил (потому что эта библиотека сделана из кода Петра, и у неё нет другой справки)
Поделиться2524.04.2010 17:53:42
Здравствуйте. Вопрос слегка не в тему, при создании dll-ки, созле неё появились файлы с расширением ".exp и .lib", для чего они нужны? И как из dll-ки сделать библиотеку Пурика? Программа LibImporter выдаёт мессагу ,чтото про fasm?
Поделиться2624.04.2010 18:02:16
Здравствуйте. Вопрос слегка не в тему, при создании dll-ки, созле неё появились файлы с расширением ".exp и .lib", для чего они нужны? И как из dll-ки сделать библиотеку Пурика? Программа LibImporter выдаёт мессагу ,чтото про fasm?
Я же писал в 8 посте ссыль
Поделиться2724.04.2010 18:09:48
Я же писал в 8 посте ссыль
Спасибо haav я там курил, но мне нужно из dll-ки сделать библиотеку пурика. Прога tailbite, делает библиотеку из сырцов ".pb" пурика.
Поделиться2809.07.2010 10:53:25
Здравствуйте. Подскажите возможно ли прикрутить вот это к пурику
Поделиться2909.07.2010 13:19:35
Подскажите возможно ли прикрутить вот это к пурику
Думаю что да.
Там использован обычный LinAPI.
Например, в статье есть такой код
Для добавления простого текста (без форматирования) можно сделать так:
GtkTextIter iter;
gtk_text_buffer_get_end_iter(buffer,&iter);// определяем положение в конце текстового буфера
gtk_text_buffer_insert(buffer,&iter,"New text",-1);// вставляем текст "New text" в конец буфера
В пурике это будет выглядеть так
iter.GtkTextIter gtk_text_buffer_get_end_iter_(*buffer, @iter);// определяем положение в конце текстового буфера gtk_text_buffer_insert_(*buffer, @iter, "New text", -1);// вставляем текст "New text" в конец буфера
Поделиться3009.07.2010 16:30:56
В пурике это будет выглядеть так
Код:iter.GtkTextIter
gtk_text_buffer_get_end_iter_(*buffer, @iter);// определяем положение в конце текстового буфера
gtk_text_buffer_insert_(*buffer, @iter, "New text", -1);// вставляем текст "New text" в конец буфера
Из этого следует, что можно использовать все функции описанные в статье просто подставляя "_" в конец?
Похожие темы
Визуальный редактор | OffTop | 07.07.2011 |
PurePortable - портабелизация программ | OpenSource | 11.11.2024 |
My_Notepad_Sci | PureBasic для Windows | 30.06.2023 |
Ищу наставника (ментора). | PureBasic для Windows | 27.07.2022 |
Многомерные массивы переменной размерности | PureBasic для Windows | 29.08.2023 |