PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Текстовый редактор


Текстовый редактор

Сообщений 1 страница 30 из 33

1

Здравствуйте. возможно тема замыленная, но всё же есть вопросы. В соседней теме Пётр давал код работы с форматированным текстом, однако те функции предназначены для изменения текста в ЕдиторГаджете, интересует вопрос чтения форматированного текста из редактора. Просто текст считать получается, а форматированный нет. Вопрос второй возможно ли програмно менять текст в файлах ".doc" и ".odt". Вопрос третий какие дополнительные библиотеки существуют для работы с ЕдиторГаджетом, Библиотека LEP0_4Beta не хочет работать(в смысле не работает ни один пример с её использованием), как её правильно установить? Пока вроде всё, заранее спасибо всем, кто сможет помочь.

0

2

lakomet написал(а):

Библиотека LEP0_4Beta не хочет работать

Она для PB 4.00

lakomet написал(а):

Вопрос второй возможно ли програмно менять текст в файлах ".doc" и ".odt".

Можно конечно, но нужно знать структуру этих файлов.

lakomet написал(а):

интересует вопрос чтения форматированного текста из редактора.

В библиотеке LEP0_4Beta есть функция считывающая такой текст

Код:
String.s=Editor_RTF_GetRTFCode(#Gadget)

0

3

Я так понимаю что выход поставить РВ4.0 или есть другие библиотеки для РВ 4.40 . И ещё вопрос как сделать возможность добавления пользователем TextGadget, ComboBoxGadget, DateGadget и т.д.

0

4

lakomet написал(а):

ещё вопрос как сделать возможность добавления пользователем TextGadget, ComboBoxGadget, DateGadget и т.д.

Примерно как здесь Создатель программ

0

5

Спасибо поизучаю. А возможно сделать мини прогу которая будет считывать текст из другой проги, т.е. основная прграмма запускает вспомогательную, та в свою очередь считывает текс из основной проги, записывает в файл и завершает работу( это к тому, чтобы не возвращаться на РВ 4.0)?

0

6

Сделай лучше 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

0

7

Всем доброго времени. Пётр спасибо за код! Два дня курил гугл и ваш код, но так до меня и не дошло как работает функция 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 библиотеку

С удоволствием, но пока до этого не дрос. Пётр если есть такая возможность, не могли бы Вы собрать такую библиотечку, думаю будет полезна многим. Или скажите где можно почитать, как делать эти бибиотеки.

0

8

lakomet написал(а):

Подскажите где ошибка.

Наверно так:

Код:
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
lakomet написал(а):

Или скажите где можно почитать, как делать эти бибиотеки.

Про создание DLL можно почитать в учебнике Петра на http://pure-basic.narod.ru

Про LIB библиотеку:  http://purebasic.info/phpBB2/viewtopic. … t=tailbite

0

9

Спасибо haav, но таже история. попробуй открыть этот файл в ворде, потом этим кодом, и увидиш разницу.

0

10

А в чем разница? Не пойму чего то.  o.O   
Вроде все нормально.

Код:
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

0

11

haav в 6 посте код Петра, запусти его и сохрани в rtf. затем открой своим или моим кодом этот файл, и увидиш что вместо четырёх строк останется три и то не полностью.

0

12

Код:
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

0

13

Огромное спасибо haav, помогло :cool: . Просьба к Петру (о библиотеки) остаётся в силе.

0

14

lakomet написал(а):

Просьба к Петру (о библиотеки) остаётся в силе

Посмотри здесь http://pure-basic.narod.ru/docs/dll.html

0

15

Спасибо всем! Собрал пробную библиотеку. Скажите, а как её можно здесь выложить для теста?

0

16

lakomet написал(а):

Скажите, а как её можно здесь выложить для теста?

Закачать на файлообменик и ссылку сюда.

0

17

Пётр. Я ими ни когда не пользовался, подскажи ссылкой как это сделать?

0

18

Открываешь этот сайт http://depositfiles.com/ru
Указываешь путь к файлу и нажимаешь на кнопку "Загрузить сейчас".
По завершению загрузки, будет несколько ссылок, копируешь сюда самую верхнюю.

0

19

Вот Здесь. Приготовился слушать критику :blush: .

Отредактировано lakomet (23.04.2010 02:43:34)

0

20

Сейчас пробовать желания нет, но на будующее возможно пригодится. 
Один вопрос: в справке команда DV_RTF_SELECT убрана намеренно?

0

21

lakomet написал(а):

Вот Здесь. Приготовился слушать критику

Собирал DLLку или библиотеку функций для пурика?

0

22

haav написал(а):

в справке команда DV_RTF_SELECT убрана намеренно?

Я не знаю как её описать. :question:

Пётр написал(а):

Собирал DLLку или библиотеку функций для пурика?

Библиотека функций для пурика. :flag:

0

23

lakomet написал(а):

Я не знаю как её описать.

Надо было тогда оставить в первоначальном виде(английский вариант этой страницы).

0

24

haav написал(а):

Надо было тогда оставить в первоначальном виде(английский вариант этой страницы)

Ну эту справку я сочинял сам, а не переводил (потому что эта библиотека сделана из кода Петра, и у неё нет другой справки)

0

25

Здравствуйте. Вопрос слегка не в тему, при создании dll-ки, созле неё появились файлы с расширением ".exp и .lib", для чего они нужны? И как из dll-ки сделать библиотеку Пурика? Программа LibImporter выдаёт мессагу ,чтото про fasm?

0

26

lakomet написал(а):

Здравствуйте. Вопрос слегка не в тему, при создании dll-ки, созле неё появились файлы с расширением ".exp и .lib", для чего они нужны? И как из dll-ки сделать библиотеку Пурика? Программа LibImporter выдаёт мессагу ,чтото про fasm?

Я же писал в 8 посте ссыль

0

27

haav написал(а):

Я же писал в 8 посте ссыль

Спасибо haav я там курил, но мне нужно из dll-ки сделать библиотеку пурика. Прога tailbite, делает библиотеку из сырцов ".pb" пурика.

0

28

Здравствуйте. Подскажите возможно ли прикрутить вот это к пурику

0

29

lakomet написал(а):

Подскажите возможно ли прикрутить вот это к пурику

Думаю что да.
Там использован обычный 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" в конец буфера

0

30

Пётр написал(а):

В пурике это будет выглядеть так
Код:

iter.GtkTextIter
gtk_text_buffer_get_end_iter_(*buffer, @iter);// определяем положение в конце текстового буфера
gtk_text_buffer_insert_(*buffer, @iter, "New text", -1);// вставляем текст "New text" в конец буфера

Из этого следует, что можно использовать все функции описанные в статье просто подставляя "_" в конец?

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Текстовый редактор