FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 19:10Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 4 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Пожелания или дополнения к библиотеке
haavДата: Среда, 26.01.2022, 18:49 | Сообщение # 46
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата electrik ()
А что если к гаджетам привязать последний необязательный параметр который по умолчанию будет равный NULL - вызов событийной функции?

Не, Серега. Возни много , профит околонулевой. Я очень редко изменяю или добавляю параметры и то только тогда,  когда это действительно необходимо и дает хорошую функциональность. Пойми,  кроме кода , которого будет немало, есть еще справочная система , в том числе английская. А в итоге это даст принцип GTK , от которого я ушел в Linux , объединяя все события колбаков в одну функцию. А теперь ты предлагаешь их снова разветвлять smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 03.02.2022, 03:18 | Сообщение # 47
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
привет. Ты в других темах говорил, что не следует надеятся на то, что при использовании CloseWindow, система освободит ресурсы корректно. Судя потому, что я мельком глянул в исходниках, у тебя все гаджеты записываются в список. туда входит его номер и хендл окна. А что, если сделать функцию FreeAllGadgets(hwnd)? или обернуть CloseWindow, которая будет удалять сама гаджеты пренадлежащие хендлу? Ну ведь, всёравно приходится в списке отыскивать гаджет по номеру. Реально было бы обернуть закрытие окна, перебрать список и если совпадает хендл, вычищаем все гаджеты пренадлежащие этому хендлу. Думаю, не долго такое будет работать. Ну я не представляю окно даже с 500 гаджетами, оно не реально. Ну даже если будет 1000 гаджетов, перебрать 1000 элементов это не долго. Если не хочешь перекрывать API функции, значит написать свою, ну скажем closeWindowW9 ну или как-то.
А да, всё же жалко, что ты не хочешь писать функцию установки фокуса по номеру гаджета. Я понимаю что в винде есть SetFocus, но опять таки если делать замах на кроссплатформенность, ну к примеру я не знаю как это написать в линуксе, да и зачем, это знать, если я пользуюсь посути фреймворком. Расскажу для чего это может понадобиться. предположим, у меня есть программа которая ищет песни в инете. В поле ввода я ввожу название песни, и если он что-то нашёл, я добавляю это в список, и потом устанавливаю туда фокус. Очень удобно, а так чтобы попасть в список, придётся несколько раз жмякать таб, проходя какие-то опции поиска, которые редко использую. Такая функция точно не бесполезна, варианты логики софта могут быть разные.


Сообщение отредактировал electrik - Четверг, 03.02.2022, 03:20
 
haavДата: Четверг, 03.02.2022, 09:08 | Сообщение # 48
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата electrik ()
Ты в других темах говорил, что не следует надеятся на то, что при использовании CloseWindow, система освободит ресурсы корректно. Судя потому, что я мельком глянул в исходниках, у тебя все гаджеты записываются в список. туда входит его номер и хендл окна. А что, если сделать функцию FreeAllGadgets(hwnd)? или обернуть CloseWindow, которая будет удалять сама гаджеты пренадлежащие хендлу? Ну ведь, всёравно приходится в списке отыскивать гаджет по номеру. Реально было бы обернуть закрытие окна, перебрать список и если совпадает хендл, вычищаем все гаджеты пренадлежащие этому хендлу. Думаю, не долго такое будет работать. Ну я не представляю окно даже с 500 гаджетами, оно не реально. Ну даже если будет 1000 гаджетов, перебрать 1000 элементов это не долго. Если не хочешь перекрывать API функции, значит написать свою, ну скажем closeWindowW9 ну или как-то.


Если бы это было просто , я давно бы это сделал. Это в винде ты можешь хоть 1000 раз вызывать DestroyWindow для одного и того же хендла , а в linux это как минимум варнинг , и как максимум креш. Что будет в линукс , если в списке по очереди сначала идет контейнер , а потом гаджеты находящиеся в нем? Я тебе отвечу. GTK удалит контейнер вместе с дочерними элементами и далее когда по списку я дойду до гаджета из контейнера и стану его удалять, будет исключение. И это только один пример , на самом деле нюансов вагон и маленькая тележка. А что делать с хоткеями , с меню и пр. Это тоже перебирать?

Программист , использующий библиотеку, точно знает , какие гаджеты создавал , какие для гаджетов выделял ресурсы (иконки, картинки, проперти и пр.) , в каком порядке их следует удалять , чтобы избежать утечки памяти. Поэтому все просто: освобождение явных ресурсов , выделяемых программистом - прерогатива самого программиста.

Про кроссплатформенную функцию SetFocus:
я давно уже думал ее написать , просто все время забываю , хотя написание самой функции вопрос 5 минут , а вот редактирование справки измеряется десятками минут.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 03.02.2022, 16:04 | Сообщение # 49
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Поповоду справки понимаю. Тут даже ChangeLog лень писать, что тут говорить о документации.
С гаджетами, ну фиг с ними, действительно я подумал с точки зрения винды.
А в linux не пробовал работать с GTK4? Или он сыроват? У меня то там тёмный лес, просто я читал про GTK4, что они наконец то там взялись за доступность, и вроде там она будет универсальной. Тоесть скринридерам должно быть всё доступно. Но вроде, в гноме с Orca на третьем GTK  тоже всё не плохо.
 
haavДата: Четверг, 03.02.2022, 19:00 | Сообщение # 50
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата electrik ()
А в linux не пробовал работать с GTK4?


Не пробовал.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 18.02.2022, 01:48 | Сообщение # 51
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Привет. Будет желание, нарисуй кроссплатформенные функции проверки существования файлов и директории. Ну проверить существование файла впринципе я могу попробовать при помощи ReadFile. Директорию, конечно тоже можно проверить при помощи ExamineDirectory, но это такое, если директория или файл существует, надо потом закрывать хендлы. Можно конечно обернуть, но думаю, для обычных юзеров будет удобно вызывать функцию, которая вернёт истину или лож, а под капотом, пущай она сама там разбирается.
Под виндой, самый короткий вариант - это получить атрибуты файла при помощи GetFileAttributes. Когда-то давно, я на форуме выкладывал функцию проверки существования файла для винды.
Та которая есть в составе FB, она только zstring ptr.
 
haavДата: Пятница, 18.02.2022, 06:46 | Сообщение # 52
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата electrik ()
Будет желание, нарисуй кроссплатформенные функции проверки существования файлов и директории.


Хорошо.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 18.02.2022, 19:06 | Сообщение # 53
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Ну вот и ещё в догоночку. Ты уж извини что я вот так, только прошу. Надо переделать функцию. ибо я сталкнулся с проблемой. Чтобы не ломать совместимость можно сделать так:

Код

  Function GetCurrentFileName(byval fullPathFlag as integer = 0) As USTRING Export
        dim as USTRING wsRet = WSPACE(512)
        GetModuleFileName(0,cast(any ptr , *wsRet),512)
        if fullPathFlag = 0 then
            wsRet = GetFilePart(wsRet)
end if
        Return wsRet
    End Function


Дальше уже не западло будет путь откусить при помощи GetPathPart.

Раньше такого не наблюдал, с диалогами открытия файлов. Возможно, потому что не раскидывал файлы по разным папкам, писал на FB ансишные проги, и подстраховывался ExePath когда нужно. Так уж складывается, что программа хранит настройки в своей папке. В программе предусмотрены таблицы, которые лежат в другой папке. После выбора Этих таблиц в диалоге открытия файла, текущая директория, походу становится та, из которой последний раз выбирал. Соответственно, пути к настройкам никакого нет, и они сохраняются в ту выбранную папку. А я то и думаю, что за хрень, код правильный, а настройки не сохраняет. И только зайдя в директорию с таблицами, я там обнаружил Settings.dat.
Я конечно могу при старте программы зафигачить глобальную переменную и в ней хранить, но а если, предположим, я буду в консоли находиться на диске d:\qqq, и запущу свою программу оттуда по прямому пути, какой будет тогда у программы CurrentDir? К сожалению опять таки у FB ExePath только string.
По хорошему, системные функции надо править в рантайме FreeBasic, а то я чувствую, мы скоро всю систему в Window9 перетащим.

Добавлено (18.02.2022, 19:24)
---------------------------------------------
а  ещё, я понимаю, что когда ты начинал писать Window9, возможно, знал инглиш плохо. Я его и сейчас плохо знаю. Но можно народ потихоньку переводить из не правильных написаний в правильное. Есть у тебя функция GetCurentDir, так она пишется с двумя r. Чтобы не ломать людям проги, можно так и оставить, но в документации и в коде поправить, а чтобы работало старое задефайнить.
Я вчера матерился, думаю как это так, функции нет, а в документации есть! Потом уже глянул и в коде поправил.
Кстати, как раз наша многострадальная написана правильно, GetCurrentFileName.
Когда я ввожу яндексу curent он исправляет на Current, а когда пихаю переводчику, он переводит и правильное и неправильное написание.

 
haavДата: Пятница, 18.02.2022, 20:50 | Сообщение # 54
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата
GetCurrentFileName


Функция делает то , для чего она задумана, исправлять не буду. Для получения пути к exe есть exepath. Ничего страшного , что exepath возвращает STRING , динамическая строка USTRING или если тебе нравится extWstring автоматически преобразует STRING<->USTRING. Не нужно в библиотеке создавать лишних функций на каждый чих. И уж тем более не нужно редактировать текущие под определенную задачу.

Цитата
Есть у тебя функция GetCurentDir, так она пишется с двумя r


Не знаю , может быть когда-нибудь и исправлю , когда от безделья буду маяться , а пока у меня есть более полезные дела.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Суббота, 19.02.2022, 03:53 | Сообщение # 55
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Ага, спасибо, я повнимательней посмотрел extWstring. Просто там макросов много, и сразу не сообразил что и во что преобразует. Тогда действительно можно использовать штатную функцию получения полного пути.
 
zamabuvaraeuДата: Суббота, 19.02.2022, 11:24 | Сообщение # 56
Подполковник
Группа: Друзья
Сообщений: 149
Репутация: 5
Статус: Offline
(Храню настройки в реестре, ни о чём не жалею.)
 
haavДата: Суббота, 19.02.2022, 15:31 | Сообщение # 57
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата zamabuvaraeu ()
(Храню настройки в реестре, ни о чём не жалею.)


Каждый кодит как хочет , но я ненавижу программы , использующие реестр для настроек. Если стоит выбор между софтом использующим реестр и ini файлы, то я всегда выбираю последний вариант. У меня есть две полезные утилиты , которые используют реестр. Так вот после переустановки системы , ни одна из них не запустится. И дело не в защите , а банально установщик этих утилит при установке что-то пишет в реестр и без этих параметров хрен запустить. Поэтому когда я вижу сообщения , подобные твоему , я сразу вспоминаю этих разработчиков. Их программы мало того , что гадят в реестр , с каждым шагом повышая неповоротливость системы в целом, так еще и делают программы полностью зависимыми от него.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Понедельник, 21.02.2022, 13:48 | Сообщение # 58
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Тоже предпочитаю Ini файлы. Вопервых, надо думать, а вдруг я потом захочу перенести программу на другую платформу. Действительно, есть моменты когда без реестра ну совсем не возможно, к примеру com сервер или автостарт с Windows. В моём случае, сейчас в программе для пумы, я пишу бинарные настройки, ибо там всё рулится с GUI, и ручками точно никому не захочется редактировать файл, Да и мне проще, сохранил структуру в файл и всё. Главное, чтобы настройки работали во всех системах, нужно юзать переменные которые заявлены как одинаковых размеров на всех платформах. Не юзайте в настройках Integer и будет всё норм.

Добавлено (21.02.2022, 19:42)
---------------------------------------------
Привет. написал функцию StringField. Не стал скидывать в тему про extlib, ибо скорее всего то останется для себя любимого.
для разделения строки используется strtok, но не штатный.
Дело в том, что во FreeBasic, и в mingw с wide функцией wcstok, мутная история. везде в C она объявлена как:
wchar_t * wcstok(wchar_t * restrict string1, const wchar_t * restrict string2, wchar_t ** restrict ptr)
во FreeBasic объявлена так:
declare function wcstok (byval as wchar_t ptr, byval as const wchar_t ptr) as wchar_t ptr
У mingw вообще помечена как устаревшая:
wchar_t *__cdecl wcstok(wchar_t * __restrict__ _Str,const wchar_t * __restrict__ _Delim) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
Может где у MINGW ещё есть заголовочные файлы, мне уже не хотелось с этим разбираться, ибо на поиски можно убить много времени.
Короче, не мудрствуя лукаво, я нашёл в интернете несколько реализаций функции strtok, и выбрал для себя удобную. На счёт скорости не замерял.
вот их реализации на c: https://russianblogs.com/article/2711817163/
Теперь на FreeBasic эта функция работает с доп параметром сохранения внутреннего состояния, чтобы можно было безопасно вызывать в потоках. Соответственно функции реализованы для ansi и wideString.
Далее, ниже для unicode и ansi реализован StringField.

Код
#define UNICODE
#include "window9.bi"
#include "crt/string.bi"

#ifdef UNICODE
    function StrToken(byval s as wstring ptr, _ ' string to search for tokens
    byval delim as const wstring ptr, _ ' delimiting characters
    byval lasts as wstring ptr ptr _ ' stores information necessary for it to continue scanning the same string
    ) as wstring ptr  
        dim ch as integer
        
        if s = 0 then s = *lasts
        
        do
            ch = *s
            s += 1
            if ch =  0 then return 0
        loop while wcschr(delim, ch)
        s -= 1
        *lasts = s + wcscspn(s, delim)
        if **lasts <> 0 then
            **lasts = 0
            *lasts += 1
        end if
        return s
    end function
    
    function StringField(byval s as ustring, byval index as integer, byval delim as ustring) as ustring
        if index > 0 then
            dim nFields as integer = 1
            dim store as wstring ptr
            dim pch as wstring ptr = StrToken(strptr(s), strptr(delim), @store)
            while pch <> NULL
                if nFields = index then return *pch
                nFields += 1
                pch = strtoken(NULL, strptr(delim), @store)
            wend
        end if
        return ""
    end function
    
#else
    function StrToken(byval s as zstring ptr, _ ' string to search for tokens
    byval delim as const zstring ptr, _ ' delimiting characters
    byval lasts as zstring ptr ptr _ ' stores information necessary for it to continue scanning the same string
    ) as zstring ptr  
        dim ch as integer
        
        if s = 0 then s = *lasts
        
        do
            ch = *s
            s += 1
            if ch =  0 then return 0
        loop while strchr(delim, ch)
        s -= 1
        *lasts = s + strcspn(s, delim)
        if **lasts <> 0 then
            **lasts = 0
            *lasts += 1
        end if
        return s
    end function
    
    function StringField(byval s as ustring, byval index as integer, byval delim as ustring) as ustring
        if index > 0 then
            dim nFields as integer = 1
            dim store as zstring ptr
            dim pch as zstring ptr = StrToken(strptr(s), strptr(delim), @store)
            while pch <> NULL
                if nFields = index then return *pch
                nFields += 1
                pch = strtoken(NULL, strptr(delim), @store)
            wend
        end if
        return ""
    end function
#endif

' Проверочный пример
dim mystring as ustring = "Проверка текста на разделители. По идее, текст должен разделиться на слова."
for i as integer = 1 to 14 ' специально длиннее числа слов в тексте.
print StringField(mystring, i, " .,")
next

Добавлено (21.02.2022, 20:08)
---------------------------------------------
Единственное, при использовании StringField, в цикле, чем больше индекс, тем медленнее отыскивается field, ибо при каждом запуске StringField, перебираются все предыдущие.
Мне кажется, такая функция и не предназначена для обработки по сто мегабайт данных, для пару мегабайт будет не заметно, ну а если нужна скорость, юзайте StrToken напрямую, он за один цикл отдаст все строки.

 
haavДата: Понедельник, 21.02.2022, 20:56 | Сообщение # 59
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Привет!

Вроде работает wcstok , но не с FB декларацией. Судя по всему , в каком из стандартов Си , данная функция была изменена. У меня есть книга от профессора Павловской , так у ней тоже определение как в FB , но с таким определением не работает. В общем вот пример (пробовал на линуксе):

Код
#define UNICODE
#include "window9.bi"

#undef wcstok
extern "C"
    declare function wcstok(as const wstring ptr ,  as const wstring ptr , as wstring ptr ptr) as wstring ptr
End Extern

' Проверочный пример
dim mystring as ustring = "Проверка текста на разделители. По идее, текст должен разделиться на слова."
dim as wstring ptr p
dim as USTRING us = *wcstok(*mystring, " .," , @p)

while len(us)
    ? Us  
    us = *wcstok(0, " .," , @p)
wend


Пока на скорость не тестировал wcstok и твой пример.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Пятница, 02.09.2022, 11:35 | Сообщение # 60
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Есть ли в Window9 гаджет для ввода времени (2 или 3 поля с разделителями) ?
Нашел из похожего только SpinGadget, но там только 1 поле ввода.
Если такого нет, сложно ли добавить такой гаджет в библиотеку?
 
  • Страница 4 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: