PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ScintillaGadget - нативное переключение документов.


ScintillaGadget - нативное переключение документов.

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

1

Ребят, кто-то может изучал тему переключения гаджета Scintilla по вкладкам. Т.е. переключаешься по вкладкам как в IDE или в Notepad++ и включается новый документ, связанный с этой вкладкой. Соответственно, история сохраняется для каждого документа. Создавать для каждой вкладки новый гаджет, дело не хитрое, но это костыль, в особенности, если эта возможность, уже заложена нативно.
Внутри компонента Scintilla, есть внутренний движок для этого. Он описан в документации (если я правильно понял): Doc
Что-то я нащупал, работает несколько раз, потом вылетает по памяти. Там есть ссылки документов, но логики пока не понял. Может кто-то сможет доходчиво объяснить этот раздел документации. Мне бы конечно реально рабочий пример.

Отредактировано Webarion (22.02.2023 18:45:43)

0

2

На сколько я понимаю Scintilla создаёт один объект и не создаёт их нативно сколько угодно. Есть один объект и один дескриптор. Допускается 2 нативно в одном окне (в Notepad++ но это два объекта с разными вкладками), да это поддерживается (может больше), но редактор любой создаёт столько Scintilla, сколько вкладок в редакторе. Каждый Scintilla содержит документ собственный и при работе будет получен его дескритор и любая команда с этим дескриптором работает с конкретным документом- файлом. То есть в итоге надо создавать число Scintilla сколько юзер захочет открыть файлов. В момент открытия какой либо документ становится активным и с ним производится работа. Надо каждый раз проверять какой документ активный или кешировать хендл при смене вкладки. Для примера возьми любой редактор меняй вкладки и получай дескриптор активного документа с помощью Au3Info.exe и будет доказательство что у каждого свой дескриптор, а значит это свой собственный документ и выделенная для него память. А в dll находятся всего лишь функции по работе с документом.

Судя по описанию того раздела, там явно дано понять что это множественный просмотр, то есть не вкладки, а два документа в одном окне. То есть это не тоже самое что создавать 15 документов используя один объект.
То есть нативно допускается просмотр 2-х и более документов в одном окне, но это не значит что это один и тот же дескриптор, один и тот же объект-документ.

Отредактировано AZJIO (22.02.2023 19:20:50)

0

3

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

Судя по описанию того раздела, там явно дано понять что это множественный просмотр, то есть не вкладки, а два документа в одном окне. То есть это не тоже самое что создавать 15 документов используя один объект.
То есть нативно допускается просмотр 2-х и более документов в одном окне, но это не значит что это один и тот же дескриптор, один и тот же объект-документ.

Я тоже думал об этом, но вроде получилось. Не знаю на сколько это правильно и не будет ли утечки памяти. Но пока, этот код работает. Если нажимать на кнопки, то будут переключаться документы в одном ScintillaGadget:

Код:
#Win = 0
#Sci = 0

; возвращает рандомный текст
Procedure.s _Get_Random_Text()
  Protected Text$ = ""
  For i=0 To 300
    Define Rnd = Random(90, 65)
    Text$ + Chr( Rnd )
    If Rnd < 67: Text$ + #CRLF$ : EndIf
  Next
  ProcedureReturn Text$
EndProcedure

; событие клика по кнопке
Procedure _Event_Click_Tab()
  Protected Button  = EventGadget() ; получаем кнопку
  Protected *SciDoc = GetGadgetData(Button) ; получаем записанный указатель на документ
  ScintillaSendMessage( #Sci, #SCI_SETDOCPOINTER, 0, *SciDoc ) ; устанавливаемся на документ
EndProcedure


If OpenWindow( #Win, 0, 0, 700, 500, "Пример", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget )
  
  If Not InitScintilla() : MessageRequester("", "Не удалось инициализировать компонент Scintilla" ) : End : EndIf
  ; создаём один Scintilla гаджет
  ScintillaGadget( #Sci, 3, 25, WindowWidth(#Win)-7, WindowHeight(#Win)-27, 0 ) 
  ScintillaSendMessage( #Sci, #SCI_STYLESETFORE, 0, $006400 ) ; покрасим основной текст
  
  Define CountTabs = 8 ; сколько будет табов
  
  For i=0 To CountTabs-1
    Define Button = #Sci+i+1 ; это будут кнопочки после ScintillaGadget
    ButtonGadget(Button, 3+i*50, 3, 50, 20, "Tab"+Str(i+1) )
    
    ; Пишем текст в текущий выбранный документ
    Define Text$ = _Get_Random_Text()
    Define *Text=UTF8(Text$)
    ScintillaSendMessage(#Sci, #SCI_APPENDTEXT, Len(Text$), *Text)
    FreeMemory(*Text)      
    
    Define *SciDoc = ScintillaSendMessage(#Sci, #SCI_GETDOCPOINTER ) ; получаем дескриптор текущего документа
    ScintillaSendMessage(#Sci, #SCI_ADDREFDOCUMENT, 0, *SciDoc )     ; создаём следующий документ
    ScintillaSendMessage(#Sci, #SCI_SETDOCPOINTER, 0, 0 )            ; устанавливаемся на новый документ
    SetGadgetData(Button, *SciDoc)                                   ; привязываем документ к кнопке
    
    
    BindGadgetEvent(Button, @_Event_Click_Tab(), 0 ) 
    
  Next
  
  ; показываем документ, связанный с последней кнопкой
  ScintillaSendMessage( #Sci, #SCI_SETDOCPOINTER, 0, GetGadgetData(Button) )
  
  Repeat
    Define Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  
EndIf

Отредактировано Webarion (22.02.2023 22:05:13)

0

4

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

Создавать для каждой вкладки новый гаджет, дело не хитрое, но это костыль

Почему? Это нормальная практика.

0

5

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

Почему? Это нормальная практика.

Каждому своё, как говорится. Я пробовал, мне не понравилось. При переключении, гаджеты мерцают. Для каждого нужно задавать все параметры, подсветку. В моё понимание нормальности, это не укладывается. Scintilla увесистый гаджет. Иметь кучу таких объектов, при многих открытых вкладках, при этом зная, что внутри самого компонента уже заложена такая возможность. Я бы себе не простил. Лучше чуть исследую и постараюсь сделать красиво. Тем более что результат есть.
Посмотрев исходники Scintilla, я увидел, что там действительно есть система документов и ссылок. Поэтому как и AZJIO прав, сказав о множественном просмотре, так и я прав, сказав о переключении документов. Этот раздел в документации относится и к тому и к другому.

Отредактировано Webarion (24.02.2023 03:09:46)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ScintillaGadget - нативное переключение документов.