purebasic.info

PureBasic forum
Текущее время: Чт дек 13, 2018 7:13 am

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Чт окт 19, 2017 5:44 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 709
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
отловил такой глюк
Если в коде присутствует сортировка листа, то при удалении строки в редакторе, она не удаляется, а заменяется строкой иероглифов. Как мне показалось, строка иероглифов всегда одна, не зависит от удаляемой строки.
Можете попинать сортировку по разным углам, я в разные места совал эту строку, похоже достаточно её присутствия в коде.
Обойти эту бяку получилось, смотрите в коде, а потом упёрся и методом удаления кусков кода, таки нашёл эту самую сортировку, тогда и получилось этот код слепить.
Пробовал в ХР и ВИН7.
Код:
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
If OpenWindow(111, 870, 640, 400, 300, "")
AddKeyboardShortcut(111, #PB_Shortcut_Escape, 0); ESC
 
edi1=EditorGadget(#PB_Any, 9, 9, 333, 222)
SetGadgetAttribute(edi1, #PB_Editor_WordWrap, 0)
s.s="1 удаляем сторку из редактора"+#CRLF$+"2 удаляем сторку из редактора"+#CRLF$
s+"3 удаляем сторку из редактора"+#CRLF$+"4 удаляем сторку из редактора"+#CRLF$
s+"5 удаляем сторку из редактора"+#CRLF$+"6 удаляем сторку из редактора"
SetGadgetText(edi1, s)
MessageRequester("","")
n=CountGadgetItems(edi1)
For k=0 To n; удаляем сторку из редактора
s1.s=GetGadgetItemText(edi1, k); читаем строку
f=FindString(s1, "3 "); ищем ключ
 
If f<>0
RemoveGadgetItem(edi1, k); не работает
;s2.s=GetGadgetText(edi1):s2=ReplaceString(s2, s1, ""):SetGadgetText(edi1, s2); работает
Break
EndIf
Next
 
Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC
 
Until ev = #PB_Event_CloseWindow
EndIf
 
Procedure sortir()
NewList ext.s()
AddElement(ext()):ext()=".bmp":AddElement(ext()):ext()=".jpg":AddElement(ext()):ext()=".png"
; с сортировкой не работает
SortList(ext(), #PB_Sort_NoCase);#PB_Sort_Descending);#PB_Sort_Ascending)
 
 
EndProcedure



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт окт 19, 2017 8:09 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Да, ошибка реально есть, на "юникодных" версиях (начиная с 5.50)
конкретно сорт-лист, не при чем, код ниже тоже дает ошибку, предполагаю неправильную адресацию при работе с эдитор-гаджетом и не аглицкой кодировкой)
Код:
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
Procedure sortir()
  NewList ext.s()
  AddElement(ext())
EndProcedure
 
 
If OpenWindow(111, 870, 640, 400, 300, "")
  AddKeyboardShortcut(111, #PB_Shortcut_Escape, 0); ESC
 
  edi1=EditorGadget(#PB_Any, 9, 9, 333, 222)
  SetGadgetAttribute(edi1, #PB_Editor_WordWrap, 0)
  s.s="1 удаляем сторку из редактора"+#CRLF$+"2 удаляем сторку из редактора"+#CRLF$
  s+"3 удаляем сторку из редактора"+#CRLF$+"4 удаляем сторку из редактора"+#CRLF$
  s+"5 удаляем сторку из редактора"+#CRLF$+"6 удаляем сторку из редактора"
  SetGadgetText(edi1, s)
  MessageRequester("","")
  n=CountGadgetItems(edi1)
  For k=0 To n; удаляем сторку из редактора
    s1.s=GetGadgetItemText(edi1, k); читаем строку
    f=FindString(s1, "3 ")         ; ищем ключ
   
    If f<>0
      RemoveGadgetItem(edi1, k); не работает
                               ;s2.s=GetGadgetText(edi1):s2=ReplaceString(s2, s1, ""):SetGadgetText(edi1, s2); работает
      Break
    EndIf
  Next
 
  Repeat
    ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
    If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC
   
  Until ev = #PB_Event_CloseWindow
EndIf
 



зы. противная ошибка, похоже зависит от положения (RemoveGadgetItem) в программе.

зызы укороченный вариант:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure sortir()
  NewList ext.s()
  SortList(ext(), #PB_Sort_NoCase)
EndProcedure
 
OpenWindow(111, 870, 640, 400, 300, "")
edi1 = EditorGadget(#PB_Any, 9, 9, 333, 222)
s.s  = "1 удаляем сторку из редактора" + #CRLF$ + "2 удаляем сторку из редактора" + #CRLF$
s    + "3 удаляем сторку из редактора" + #CRLF$ + "4 удаляем сторку из редактора" + #CRLF$
SetGadgetText(edi1, s)
MessageRequester("Warning","Press to delete line №2")
n = CountGadgetItems(edi1)
For k=0 To n; удаляем сторку из редактора
  s1.s = GetGadgetItemText(edi1, k); читаем строку
  If FindString(s1, "2 ")
    RemoveGadgetItem(edi1, k)
    Break
  EndIf
Next
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт окт 19, 2017 9:47 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
EnableExplicit
Define ns
 
NewList myext.s()
AddElement(myext()) : myext()=".bmp"
AddElement(myext()) : myext()=".jpg"
AddElement(myext()) : myext()=".png"
 
OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
EditorGadget(0, 8, 8, 306, 133)
For ns = 0 To 9
  AddGadgetItem(0, ns, "line "+Str(ns))
Next
RemoveGadgetItem(0,5)
RemoveGadgetItem(0,7)
 
If 0
  ;Debug "Если вдруг ))))"
  SortList(myext(), #PB_Sort_Descending) ;#PB_Sort_Ascending) ;#PB_Sort_NoCase)
EndIf  
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow



Весело ещё и то, что при отключенном отладчике всё работает отлично и из под ide и автономно после компиляции (проверял только win10-x64-PB561).
И как видно в моём варианте вызывать sortlist совсем не нужно для достижения эффекта


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 20, 2017 7:16 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 709
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Kuzmat писал(а):
предполагаю неправильную адресацию при работе с эдитор-гаджетом и не аглицкой кодировкой)

Это в примере русский текст оказался, а в программе были чисто англицкие строки, html теги.


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

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


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

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


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

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