purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 4:15 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Работа с Editor Gadget
СообщениеДобавлено: Пт авг 31, 2012 7:06 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Выкладываю процедуры для работы с EditorGadget и StringGadget. Может кому-нибудь пригодиться
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
ProcedureDLL EditorUndo(Gadget) ; Отменить последнее изменение текста в редакторе
  SendMessage_(GadgetID(Gadget),#EM_UNDO,0,0)
EndProcedure
ProcedureDLL EditorCanUndo(Gadget) ; Проверить возможность отмены изменения текста
  If SendMessage_(GadgetID(Gadget),#EM_CANUNDO,0,0) <>0
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
ProcedureDLL EditorRedo(Gadget) ; Повторить отменённое изменение текста в редакторе
  SendMessage_(GadgetID(Gadget),#EM_REDO,0,0)
EndProcedure
ProcedureDLL EditorCanRedo(Gadget) ; Проверить возможность повтора отменённого изменения текста
  If SendMessage_(GadgetID(Gadget),#EM_CANREDO,0,0) <>0
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
ProcedureDLL EditorCut(Gadget) ; Переместить выделенный текст в буфер обмена
  SendMessage_(GadgetID(Gadget),#WM_CUT,0,0)
EndProcedure
ProcedureDLL EditorCopy(Gadget) ; Скопировать выделенный текст в буфер обмена
  SendMessage_(GadgetID(Gadget),#WM_COPY,0,0)
EndProcedure
ProcedureDLL EditorPaste(Gadget) ; Вставить текст из буфера обмена в текущую позицию курсора
  SendMessage_(GadgetID(Gadget),#WM_PASTE,0,0)
EndProcedure
ProcedureDLL SetEditorTextColor(Gadget,Color) ; Установить цвет текста
  SetGadgetColor(Gadget,#PB_Gadget_FrontColor,Color)
EndProcedure
ProcedureDLL SetEditorBackgroundColor(Gadget,Color) ; Установить цвет фона редактора
  SetGadgetColor(Gadget,#PB_Gadget_BackColor,Color)
EndProcedure
ProcedureDLL GetEditorTextColor(Gadget) ; Получить цвет текста
  ProcedureReturn GetGadgetColor(Gadget,#PB_Gadget_FrontColor)
EndProcedure
ProcedureDLL GetEditorBackgroundColor(Gadget) ; Получить цвет фона редактора
  ProcedureReturn GetGadgetColor(Gadget,#PB_Gadget_BackColor)
EndProcedure
ProcedureDLL AddEditorString(Gadget,NumberString,String$) ; Добавить строку под указанным номером
  AddGadgetItem(Gadget,NumberString,String$)
EndProcedure
ProcedureDLL.s GetEditorText(Gadget) ; Получить текст редактора
  ProcedureReturn GetGadgetText(Gadget)
EndProcedure
ProcedureDLL SetEditorText(Gadget,Text$) ; Установить текст редактора
  SetGadgetText(Gadget,Text$)
EndProcedure
ProcedureDLL GetCountStrings(Gadget) ; Получить количество строк в редакторе
  ProcedureReturn CountGadgetItems(Gadget)
EndProcedure
ProcedureDLL.s GetStringText(Gadget,StringNumber) ; Получить текст заданной строки
  ProcedureReturn GetGadgetItemText(Gadget,StringNumber)
EndProcedure
ProcedureDLL RemoveStringEditor(Gadget,String) ; Удалить заданную строку
  RemoveGadgetItem(Gadget,String)
EndProcedure
ProcedureDLL SetStringText(Gadget,StringNumber,Text$) ; Установить текст заданной строки
  SetGadgetItemText(Gadget,StringNumber,Text$)
EndProcedure
ProcedureDLL RemoveEditorText(Gadget) ; Удалить содержание редактора
  ClearGadgetItems(Gadget)
EndProcedure
ProcedureDLL SetEditorReadOnly(Gadget,State) ; Установить состояние блокировки редактирования
  SetGadgetAttribute(Gadget,#PB_Editor_ReadOnly,State)
EndProcedure
ProcedureDLL GetEditorReadOnly(Gadget) ; Получить состояние блокировки редактирования
  ProcedureReturn GetGadgetAttribute(Gadget,#PB_Editor_ReadOnly)
EndProcedure
ProcedureDLL FindText(Gadget,Text$,Color) ; Найти текст и выделить его указанным цветом
  #CFM_BACKCOLOR = $FFFFFF
  #SCF_ALL = 4
  Structure myCHARFORMAT2
    cbSize.l
    dwMask.l
    dwEffects.l
    yHeight.l
    yOffset.l
    crTextColor.l
    bCharSet.b
    bPitchAndFamily.b
    szFaceName.b[#LF_FACESIZE]
    nullPad.w
    wWeight.w
    sSpacing.w
    crBackColor.l
    LCID.l
    dwReserved.l
    sStyle.w
    wKerning.w
    bUnderlineType.b
    bAnimation.b
    bRevAuthor.b
    bReserved1.b
  EndStructure
  Global editFind.FINDTEXT
  editFind\chrg\cpMin = 0
  editFind\chrg\cpMax = -1
  Global editFormat.myCHARFORMAT2
  editFormat\cbSize = SizeOf(myCHARFORMAT2)
  editFormat\dwMask = #CFM_BACKCOLOR
  editFormat\crBackColor = color
  Global defaultFormat.myCHARFORMAT2
  defaultFormat\cbSize = SizeOf(myCHARFORMAT2)
  defaultFormat\dwMask = #CFM_BACKCOLOR
  defaultFormat\crBackColor = GetEditorBackgroundColor(Gadget)
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, 0, 0)  
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_ALL, defaultFormat)
  spaces = CountString(textToFind$, " ")  
  For i = 1 To spaces+1
    editFind\chrg\cpMin = 0
    thisFind$ = StringField(Text$, i, " ")
    editFind\lpstrText = @thisFind$
    Repeat
      found = SendMessage_(GadgetID(Gadget), #EM_FINDTEXT, #FR_DOWN, editFind)
      If found > -1
        editFind\chrg\cpMin = found+1
        SendMessage_(GadgetID(Gadget), #EM_SETSEL, found, found + Len(thisFind$))  
        SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION | #SCF_WORD, editFormat)
      EndIf
    Until found = -1
  Next i
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, 0, 0)
EndProcedure
ProcedureDLL ReplaceText(Gadget,TextSerch$,TextReplace$) ; Найти текст и заменить его на указанный текст
  SetGadgetText(Gadget,ReplaceString(GetGadgetText(GadgetID),TextSerch$,TextReplace$))
EndProcedure
ProcedureDLL SelectAll(Gadget) ; Выделить всё содержание редактора
  range.CHARRANGE\cpMin = 0
  range\cpMax = -1
  SendMessage_(GadgetID(Gadget),#EM_EXSETSEL,0,@range)
EndProcedure
ProcedureDLL SetLimitEditor(Gadget,NumberCharacters) ; Установить максимальное количество символов для редактора
  SendMessage_(GadgetID(Gadget),#EM_LIMITTEXT,NumberOfCharacters,0)
EndProcedure
ProcedureDLL GetModifyEditor(Gadget) ;Установить, изменялось ли содержимое редактора
  If SendMessage_(GadgetID(Gadget),#EM_GETMODIFY,0,0) = 0
    ProcedureReturn 0
  Else
    ProcedureReturn 1
  EndIf
EndProcedure
ProcedureDLL ReplaceSelectText(Gadget,TextReplace$) ;Заменить выделенный текст на указанный текст
  SendMessage_(GadgetID(Gadget),#EM_REPLACESEL,0,TextReplace$)
EndProcedure
ProcedureDLL SetFontSize(Gadget,Size) ;Установить размер шрифта
  SendMessage_(GadgetID(Gadget),#EM_SETFONTSIZE,Size,0)
EndProcedure
ProcedureDLL SetSel(Gadget,Pos1,Pos2) ;Выделить текст по указанным индексам
  SendMessage_(GadgetID(Gadget),#EM_SETSEL,Pos1,Pos2)
EndProcedure
ProcedureDLL GetFirstDisplayString(Gadget) ;Получить номер первой видимой строки в редакторе
  ProcedureReturn SendMessage_(GadgetID(Gadget),#EM_GETFIRSTVISIBLELINE,0,0)
EndProcedure
ProcedureDLL SetUndoLimit(Gadget,Limit) ;Установить максимальное количество отмен в редакторе
  SendMessage_(GadgetID(Gadget),#EM_SETUNDOLIMIT,Limit,0)
EndProcedure


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Вс июл 23, 2017 5:57 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Всем, привет.
Кто подскажет как можно определить выделен ли текст/фрагмент в EditorGadget'e? Нужно для контекстного меню. Блокировать пункт "Копировать", когда нет выделенного текста в гаджете.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Вс июл 23, 2017 9:40 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Код:
1
2
3
4
5
6
7
8
9
 
hndGdt=GadgetID(gadget)
SendMessage_(hndGdt, #EM_GETSEL, @Min,@Max)
If Min=Max ; ничего не выделено
  DisableMenuItem(x,x,1)
Else
 DisableMenuItem(x,x,0)
Endif
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Вс июл 23, 2017 10:11 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
КЭС, спасибо. То, что надо!
И если можно ещё вопрос: как можно подсчитать количество символов в загруженном тексте?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Вс июл 23, 2017 10:33 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
Код:
1
2
3
4
a$=GetGadgetText(Gadget)
a$=ReplaceString(a$,#CRLF$,"") ; без перевода строк
a$=ReplaceString(a$," ","") ; без пробелов
Debug Len(a$)


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 6:22 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Спасибо большое, kvitaliy.
Без перевода строк (вариант 2):
Код:
1
2
a$=GetGadgetText(Gadget)
Debug Len(a$) - 2*(CountGadgetItems(Gadget) - 1)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 11:11 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
knower писал(а):
Без перевода строк (вариант 2):
Код:
1
2
a$=GetGadgetText(Gadget)
Debug Len(a$) - 2*(CountGadgetItems(Gadget) - 1)


Оригинальное решение :D !

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 11:17 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
https://msdn.microsoft.com/ru-ru/librar ... p/bb774195

Код:
1
SendMessage_(hWndControl, #EM_GETTEXTLENGTHEX, lpGetTextLengthEx, #Null)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 1:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
Полностью это будет так
Код:
1
2
3
4
5
6
7
Procedure GetRTFTextLength(hWndRTF.l)
  gtlex.GETTEXTLENGTHEX
   gtlex\flags     = #GTL_PRECISE
  gtlex\codepage  = #CP_ACP
  ret = SendMessage_(hWndRTF, #EM_GETTEXTLENGTHEX, @gtlex, 0 )
  ProcedureReturn ret
EndProcedure


Но считает символы перевода строк!

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 2:34 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
КЭС, kvitaliy, Пётр, безусловно спасибо вам за помощь, но... как бы это сказать помягче... нет оно конечно нужно, но... это второстепенно. Индикация. Косметика.
А мучает меня совсем другой вопрос. Можно так сказать основная функция программы.

Вобщем, есть один очень хороший код с зарубежного форума. Автор: infratec. Который производит последовательный поиск указанного текста в EditorGadget. Вся проблема в том, что ищет он только "вперёд". Очень не хватает поиска в обратную сторону (реверсного). Чтобы можно было искать с конца документа. Так же последовательно. Ниже сам код (в оригинале):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
EnableExplicit
 
 
Global defaultFormat.CHARFORMAT
 
; Find text strings inside an editorgadget
 
Procedure Editor_FindText(Gadget.i, TextToFind.s, ResetFlag.i)
 
  Protected.i found, Exit
  Protected format.CHARFORMAT, Range.CHARRANGE
  Static editFind.FINDTEXT
  Static LastText$
 
 
  If LastText$ <> TextToFind
    editFind\chrg\cpMin = 0
    LastText$ = TextToFind
  EndIf
 
  editFind\chrg\cpMax = -1
  editFind\lpstrText  = @TextToFind
  Repeat
    found = SendMessage_(GadgetID(Gadget), #EM_FINDTEXT, #FR_DOWN, @editFind)
    If found > - 1
      SendMessage_(GadgetID(Gadget), #EM_SETSEL, found, found + Len(TextToFind))
      editFind\chrg\cpMin = found + 1
      Exit = #True
    Else
      If editFind\chrg\cpMin > 0
        editFind\chrg\cpMin = 0
      Else
        Exit = #True
      EndIf
    EndIf
  Until Exit
EndProcedure
 
 
 
Define.i Exit, Event
 
OpenWindow(0, 0, 0, 400, 400, "Editor", #PB_Window_SystemMenu)
 
EditorGadget(0, 10, 10, 380, 340)
ButtonGadget(1, 10, 360, 100, 20, "Search qwe")
ButtonGadget(2, 130, 360, 100, 20, "Search asd")
 
 
SendMessage_(GadgetID(0), #EM_GETCHARFORMAT, #SC_DEFAULT, defaultFormat)
defaultFormat\cbSize = SizeOf(CHARFORMAT)
defaultFormat\dwMask = #CFM_ITALIC  | #CFM_BOLD | #CFM_STRIKEOUT | #CFM_UNDERLINE
 
Repeat
 
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Editor_FindText(0, "qwe", #False)
        Case 2
          Editor_FindText(0, "asd", #True)
      EndSelect
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
 
Until Exit


здесь особый интерес представляет строка поиска
Код:
1
found = SendMessage_(GadgetID(Gadget), #EM_FINDTEXT, #FR_DOWN, @editFind)


но константы #FR_UP - не существует. Что же получается, что там где реализован поиск "назад" по факту он производится "вперёд" (от начала документа)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 2:54 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
knower писал(а):
но константы #FR_UP - не существует
Она и не нужна. https://msdn.microsoft.com/ru-ru/librar ... p/bb788009
Переведенный фрагмент описания FR_DOWN
Цитата:
Microsoft Rich Edit 2.0 и более поздние версии: если установлено, поиск находится от конца текущего выбора до конца документа. Если не задано, поиск начинается с конца текущего выбора до начала документа.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 3:10 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Пётр, если #FR_DOWN заменить на 0 (#NUL), то всегда возвращает -1, вместо позиции.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 3:50 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Надо допиливать:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
;EnableExplicit
 
 
Global defaultFormat.CHARFORMAT
 
; Find text strings inside an editorgadget
 
Procedure Editor_FindText_Reverse(Gadget.i, TextToFind.s, ResetFlag.i)
 
  Protected.i found, Exit
  Protected format.CHARFORMAT, Range.CHARRANGE
  Static editFind.FINDTEXT
  Static LastText$
 
  lentxt=Len(GetGadgetText(Gadget))
  If LastText$ <> TextToFind
    editFind\chrg\cpMin = lentxt
    LastText$ = TextToFind
  EndIf
 
  editFind\chrg\cpMax = -1
  editFind\lpstrText  = @TextToFind
  Repeat
    found = SendMessage_(GadgetID(Gadget), #EM_FINDTEXT, 0, @editFind)  
    If found > - 1
      SendMessage_(GadgetID(Gadget), #EM_SETSEL, found, found + Len(TextToFind))
      editFind\chrg\cpMin = found ;-1
      Exit = #True
    Else
      If editFind\chrg\cpMin =0
        editFind\chrg\cpMin = lentxt
      Else
        Exit = #True
      EndIf
    EndIf
  Until Exit
EndProcedure
 
 
 
Define.i Exit, Event
 
OpenWindow(0, 0, 0, 400, 400, "Editor", #PB_Window_SystemMenu)
 
EditorGadget(0, 10, 10, 380, 340)
ButtonGadget(1, 10, 360, 100, 20, "Search qwe")
ButtonGadget(2, 130, 360, 100, 20, "Search asd")
 
 
SendMessage_(GadgetID(0), #EM_GETCHARFORMAT, #SC_DEFAULT, defaultFormat)
defaultFormat\cbSize = SizeOf(CHARFORMAT)
defaultFormat\dwMask = #CFM_ITALIC  | #CFM_BOLD | #CFM_STRIKEOUT | #CFM_UNDERLINE
 
Repeat
 
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Editor_FindText_Reverse(0, "qwe", #False)
        Case 2
          Editor_FindText_Reverse(0, "asd", #True)
      EndSelect
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
 
Until Exit



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пн июл 24, 2017 4:13 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
КЭС, ОГРОМНОЕ спасибо тебе!
Теперь вижу, что было не так. По глупости задавал:
Код:
1
2
editFind\chrg\cpMin = -1
editFind\chrg\cpMax = 0


Естественно безрезультатно.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с Editor Gadget
СообщениеДобавлено: Пт сен 22, 2017 6:57 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Всем привет.
Возник вопрос по заполнению EditorGadget'а. Задача следующая: есть список с множеством строковых элементов. Его весь нужно перекинуть в EditorGadget. Сейчас сделано так:
Код:
1
2
3
ForEach TEXT()
  AddGadgetItem(1, -1, TEXT())
Next


но заполнение происходит очень медленно. Пётр дал дельный совет грузить весь текст целиком, не построчно. В этой теме есть код по вставке всего текста из буфера обмена и глядя на него сделал примерно так, что называется "в лоб":
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
NewList TEXT.s()
 
For i=1 To 1000
  AddElement(TEXT())
  TEXT() = "строка 1   ... 1234" + Chr(13) + "строка 2 ... zzzz" + Chr(13)
 
  AddElement(TEXT())
  TEXT() = "строка 3   ... 82032" + Chr(13) + "строка 4 ... wfdsv" + Chr(13)
 
  AddElement(TEXT())
  TEXT() = "строка 5   ... 1adfasdf" + Chr(13)
Next
 
ForEach TEXT()
  tmp$ + TEXT()
Next
 
ClearClipboard()
SetClipboardText(tmp$)
 
OpenWindow(0, 0, 0, 500, 200, "copytext to EG", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(1, 0, 0, 500, 200)
SendMessage_(GadgetID(1), #WM_PASTE, 0, 0)
 
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow


но и теперь терзают сомнения, так как производится излишняя работа со строками. То есть теперь узким местом является вот этот момент:
Код:
1
tmp$ + TEXT()


где и происходит падение скорости. Пётр, указывал ранее, только не помню в какой теме, про такую особенность работы со строками. Следовательно, как вариант, нужно запросить у системы памяти с запасом, чтобы поместился весь список и туда скопировать весь список? Далее этот импровизированный буфер разово прочитать в строковую переменную и затем её вставить в редактор. Но список - это уже память, только прерывистая/разрозненная в плане адресации элементов, а нужен как понимаю один непрерывный кусок. Тогда вопрос по буферу обмена: можно ли как-то дописывать в него текст во время перебора списка? Естественно без присвоения каждого элемента отдельной строковой переменной. Смутно представляю задачу. У кого какие будут соображения по этому вопросу?

Добавлено:
То есть нужно что-то вроде этого (очень грубо):
Код:
1
2
3
4
5
6
7
8
9
10
size = ListSize(TEXT())
*mem = AllocateMemory(size)
 
n = 0
ForEach TEXT()
  PokeS(@*mem + n, TEXT())
  n + Len(TEXT())
Next
 
tmp$ = PeekS(*mem, size, #PB_Ascii)



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB