PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Улучшение справки


Улучшение справки

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

1

В общем создал тему чтобы отписывать об ошибках Справку. скачал с ru-board последняя ссылка (5.72)

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

Сразу попалась ошибка:

FileSystem\RenameFile.html
"ни чего" - пишется слитно

Ещё проверка орфографии скриптами:

Window3D/index.html
Gadget3D\index.html

имет  -> имеет

MainGuide\history.html
двухкратном   -> двукратном (не критично, можно написать "двойном")

Reference\Explanation.html
инете   -> интернете (минимум сленга)

Material\AddMaterialLayer.html
фотошопе  -> Photoshop`е (не критично, название фирмы пишется как есть)

в функциях Billboard встречается 9 раз:
требуется получить. этот Номер возвращает  (новое предложение должно быть с большой буквы)

часто используется сокращение "т. д." 11 раз с пробелом и 153 раза "т.д." без пробела, я пишу слитно без пробела т.д. т.п. т.е. т.н.

Поиск двойных слов с помощью регулярного выражения

Код:
(?<![А-яЁё])([А-яЁё]{2,})[\t ]+\1(?![А-яЁё])

Gadget\WebGadget.html
С этим Гаджетом могут могут произойти

MainGuide\history.html
25 Июля 2016 : Версия Версия 5.43 LTS

MainGuide\lgpl.html
копию общедоступной библиотеки библиотеки GNU

Mesh\AddMeshManualLOD.html
разных LOD-Сеток для для одной основной Сетки

Reference\ide_debugger.html
X-сервера, или для для удалённой разработки

String\LCase.html
знаками, т.е. 'E' будет будет преобразовано в 'e'.

String\UCase.html
знаками, т.е. 'e' будет будет преобразовано в 'E'.

ListViewGadget()

- SetGadgetItemState(): Выделяет или снимает выделение с указанного элемента.
...
- SetGadgetState(): Делает указанный элемент выделенным (все прочие выделенные элементы теряют этот статус). 'State'- это индекс элемента, если задано -1, не один элемент не будет выделен.

в описании 2 пункта, с одинаковым описанием "выделяет элемент/пункт", это запутывает, SetGadgetItemState не сработал, SetGadgetState работает.

AESEncoder

Пробел для строки и ее завершающий символ

Пространство (место) для помещения строки и её завершающего символа null, нуль-терминированной строки.

во втором примере этот же текст дробится на 2 строки, мне кажется неправильно таким способом комментировать код.

PathRequester
нужен пример с GetHomeDirectory(), чтобы была универсальность, так как C:\ на линуксе нет.

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

PureBasic - Map (Хеш-Карта)
Почему Хеш? Лучше раздел назвать Map (Карта), без PureBasic (и так понятно) и Хеш. Аналогично PureBasic - Array (Массив), PureBasic - List (Связный Список)

MenuItem()

Модификаторы могут комбинироваться с помощью символа "+": "Сохранить Как" + Chr(9) + "Ctrl+Shift+S". На OS X, когда ярлык создан в Меню, нет никакой необходимости вызывать функцию AddKeyboardShortcut() с помощью этого ярлыка.

здесь Shortcut это не ярлык, это быстрые клавиши, то есть работающие только в окне программы и назначаются пунктам меню, чтобы их вызывать. Иногда это можно назвать просто горячими клавишами. Но в контексте горячие клавиши могут означать глобальные, а быстрые клавиши - локальные в окне программы. Если в контексте пишут глобальные горячие клавиши, то те что не глобальные являются быстрыми. Но это точно не понятие ярлыка.

GetJSONMember
Вероятно в примере в последней строке должно быть "z", а не "y".

WriteConsoleData
которая сможет направит эти данные
нет "ь" на конце слова

CreateImageMenu()
пример требует UsePNGImageDecoder() по крайней мере в Linux

CreatePack()
CreatePack#Pack - пропущена скобка

FindString()
Добавить информацию, что #PB_String_NoCase в Linux работает только для английского языка (в регулярных выражениях этой проблемы нет)

Отредактировано AZJIO (15.02.2023 18:40:13)

0

2

AZJIO
добавь в шапку ссылку на актуальный перевод, а то ж не известно какую редачишь..

Fingerprint()
"До регистрации плагина необходимо вызвать UseCRC32Fingerprint()." - До лучше заменить на "Для" ведь "UseCRC32Fingerprint() - Регистрирует плагин CRC32 fingerprint для будущего использования."
или перефразировать как-то так "Перед использованием необходимо вызвать UseCRC32Fingerprint() для регистрации плагина.""

Отредактировано Lin (20.06.2021 22:26:21)

0

3

Кому интересно, я потихоньку ещё добавил кучу ошибок.

0

4

ну и где обновлённая версия?
у меня 5.72 от 02.06.2020

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

нет "ь" на конце слова

на чьём конце?

0

5

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

ну и где обновлённая версия?

я бы хотел чтобы автор справки исправил, в любом случае исправление в первоисточнике важнее иначе это будет мигрировать и работу придётся делать дважды и трижды. Надеюсь sergey2400 появится здесь, потому что где ещё обсуждать.

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

на чьём конце?

явно не на конце одушевлённого предмета, к которому можно применить принадлежность "чей". Если после гласных мягкий знак не ставиться, то выбор не большой, всего 2 слова, причём одно из них не может иметь мягкого знака ни в каких склонениях, падежах и каких либо формах использования. Строка выше это и есть строка содержащая ошибку, и предоставлена для поиска по тексту, чтобы было меньше телодвижений при исправлении. Извиняюсь но выглядит вопрос как сарказм.

0

6

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

Надеюсь sergey2400 появится здесь, потому что где ещё обсуждать.

а ты пробовал ему писать в личку на кибере?

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

Извиняюсь но выглядит вопрос как сарказм.

так оно само напрашивалось приколоться

0

7

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

а ты пробовал ему писать в личку на кибере?

в июне спрашивал: "Пока крайний. Осенью сделаю обновление, сейчас не до этого..."

Отредактировано Lin (01.10.2021 20:49:49)

0

8

EventlParam(), EventwParam()

Код:
            x = EventlParam() & $FFFF  ; Не-полновесное слово (16 Bits)
            y = EventlParam()>>16        ; Полновесное слово  (16 Bits)

Надо так:

Код:
            x = EventlParam() & $FFFF  ; Младшее слово (16 бит)
            y = EventlParam()>>16        ; Старшее слово  (16 бит)

Здесь одно длинное число типа Quad (8 байтов) состоит из двух чисел по 4 байта Long. Визуально напишем в виде числа 55552222, здесь старшее слово 5555, а младшее 2222, чтобы взять старшее слово надо сдвинуть число вправо на 16 байт и получим 5555 уже в младшем регистре, а чтобы взять младшее слово, надо 5555 обнулить превратив в 0000 и получится 00002222 т.е. 2222. Вот смысл операции, хранить два числа рядом в одной ячейке и взять любое из них битовыми операциями. Можно также сделать структуру POINT и взять из неё x.l или y.l. Хоть это и не привычно, причём тут слово (тип Word), но в любой литературе именно так описывают эти термины. В WinAPI есть макросы MAKEWORD объединяет два числа High и Low и макросы LoWord, HiWord для взятия одного из чисел двойного числа.

Отредактировано AZJIO (08.02.2022 02:38:43)

0

9

SizeOf

Как функция времени компиляции, SizeOf(x) присваивается константе

Я бы перефразировал: Как функция выполняющаяся во время компиляции ... То есть смысл этого текста в том, чтобы дать понять пользователю, что функция будет работать не во время выполнения программы, а на этапе компиляции вычислит размер необходимый для этого типа данных и вернёт число, как если бы это была константа, типа Size=#sizew.

Помните понятие Runtime? Ну что-то похожее видимо имелось ввиду в "compile time". То есть когда говорят что происходит в режиме Runtime подразумевается во время выполнения программы, соответственно  "compile time" - во время выполнения компиляции.

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

0

10

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

EventlParam(), EventwParam()

они устарели, рекомендуют использовать WinCallback(hWnd, Msg, wParam, lParam)

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

Визуально напишем в виде числа 55552222, здесь старшее слово 5555, а младшее 2222

Код:
n=55552222
m=n&$FFFF
Debug m; = 43230
b=n>>16
Debug b; = 847


m=5555
b=2222
n=m+b<<16
Debug n; = 145626547

именно так винда пакует\распаковывает два числа
а макросы в РВ не работают, или я не понял как ими пользоваться
да и зачем вызывать функцию если можно напрямую получить

а так винда rgb() пакует
rn+gn<<8+bn<<16
или
rn+gn*256+bn*65536
а так распаковывает rgba(), а rgb() три первых

Код:
c=RGBA(34, 177, 248, 55)
r=c&$FF
g=c>>8&$FF
b=c>>16&$FF
a=c>>24&$FF

0

11

newJS
Я говорю о правильности перевода и использую числа для того? чтобы показать смысл, а не для того чтобы вставить его в пример PureBasic и оно в точности показало, для этого числа должны быть шестнадцатеричными и большими, тогда ещё можно показать визуально, а c десятеричными это не сработает, так как после сдвига регистра, который происходит в бинарном виде, в десятеричном будет не одно и тоже.
Да и причём тут "устаревшая", на форуме события WinCallback многие используют в основном цикле как события, чуть ли не каждый второй пример, в том числе есть и примеры с EventlParam(), EventwParam().

0

12

В описании SetGadgetItemState для ListIconGadget я не увидел флаг что-то типа UnChecked, проверил "0", работает.

DatabaseQuery()

PostgreSQL использует другой синтаксис: символы $ 1, $ 2

$1, $2 - тут пишется слитно

————————————————————————————————————————————

В "Структуры" упоминается про "динамические объекты" возможно стоит упомянуть что под этим подразумевается, например строки, списки, карты, массивы, то есть как я понимаю объекты, которые не определяют размер структуры как SizeOf, а содержат только указатели на данные. То есть когда мы очищаем структуру с помощью ClearStructure(), она должна сначала очистить контент на который ссылается указатель структуры, то есть вызвать FreeList(), FreeMap(), FreeArray() и т.д., а потом уже заполнить нулями собственно элемент структуры - указатель, иначе в памяти останется список, не смотря что указатель в структуре был затёрт. В то же время в описании  ResetStructure() из сказаного я понимаю что для динамических объектов используется ClearList(), ClearMap(), ReDim. То есть динамические объекты для структуры является всё то, что указывается с помощью указателя.

ReadByte()
В примере комментарий, но понятно что не построчный, а побайтовый.

Код:
ReadByte(0) ; Построчный просмотр содержимого файла

Резидентные объекты
что бы - пишется вместе

Встроенный отладчик
Структур считается
со запуска
byref (не по ссылке, а по указателю)

CheckFilename

Возвращает не нулевое значение, если имя файла не содержит недопустимые символы

двойное отрицание, проще написать "Возвращает не нулевое значение, если имя файла допустимое", а ещё хот и это выглядит неофициально, но кратко "Возвращает #True, если имя файла правильное"

Preferences
В этом разделе по работе с ini-файлами стоит упомянуть некоторое поведение:
1. ExaminePreferenceKeys перечисляет все ключи, даже если они имеют одинаковое имя, в отличии от ReadPreference...(), которое читает первое попавшееся. То есть если ini-файл предназначен только для чтения, то можно не заботиться о разности имён ключей.
2. Игнор пробелов: пробелы перед и после ключа игнорируются. Для значения ситуация иная, перед значением игнорируются, после значения не игнорируются. Чтобы не игнорировать перед значением, надо использовать кавычку, естественно потом её удалять после прочтения.
3. Так как кодировка UTF-8, то ключ может состоять из любого символа, даже пробела если он не первый и не последний, то есть понятие ключ определяется началом некого символа отличным от пробела и до первого символа "=", а всё что после "=" является значением до конца строки (до \r или до \n). Это позволяет использовать ключ как носитель информации при использовании ExaminePreferenceKeys, как бы 2 ячейки разделённых символом "=".
4. Если в строке отсутствует "=", то при использованиии ExaminePreferenceKeys вся строка является ключём, то есть с помощью PreferenceKeyName() можно перечислить строки в файле.

Отредактировано AZJIO (16.11.2022 05:22:28)

0

13

Всем привет! Привет AZJIO и newJS. Ваши соображения прочёл. Сейчас в учебном отпуске... занялся исправлением справки.

0

14

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

Я тоже скоро в отпуск, может пересекёмся отпусками и будет продуктивнее.

Отредактировано AZJIO (31.01.2023 17:18:20)

0

15

AZJIO
Ну, у меня ещё неделя отпуска. Почти всё что Ты написал - я исправил.
Единственно: "В описании SetGadgetItemState для ListIconGadget я не увидел флаг что-то типа UnChecked, проверил "0", работает."
С этим надо разбираться, в прошлый раз в "Гаджеты" я многое дописывал (в английской справке не было),  наверно не всё ещё.

У меня работа очень напряжная, всю творческую составляющую убивает, каждая смена - аврал, между сменами не успеваю восстанавливаться (я начальник смены по автоматизации на ТЭЦ), ещё Университет...
Это я к тому, что примеры можно готовить (собирать инфу), но в этот раз внедрить все не успею.

0

16

Sergey2400
Если бы предупредил, то я бы специально подготовил примеры, А то я даже пару ошибок не стал отписывать, потому что думал что подвижек не будет.

Пример для ButtonImageGadget не очень удачный, так как в реальности рисунки лучше сразу в код вшивать, а не надеяться что они будут загружены по указанному пути. То есть вот реальный пример:

Код:
EnableExplicit
UseGIFImageDecoder()

DataSection
	icon:
	IncludeBinary "images" + #PS$ + "icon.gif"
EndDataSection

If OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	If CatchImage(0, ?icon)
    ButtonImageGadget(0, 10, 10, 30, 30, ImageID(0))
	EndIf

	Repeat
	Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Классический GUI (в OpenWindow). Переменная Event там ни к чему. Константы тоже именованные. Перечисление Enumeration ладно опустим.

Код:
#btn0 = 0
#Window = 0

If OpenWindow(#Window, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ButtonGadget(#btn0, 10, 60, 200, 30, "Сообщение")

	Repeat
    Select WaitWindowEvent()
    	Case #PB_Event_Gadget
        Select EventGadget()
        	Case #btn0
            MessageRequester("", "Событие")
        EndSelect
    	Case #PB_Event_CloseWindow
        CloseWindow(#Window)
        End
    EndSelect
	ForEver
EndIf

Пример для ResizeGadget

Код:
#Window = 0
Enumeration Gadget
	#edr0
	#btn0
EndEnumeration

Define ww = 220
Define wh = 100

If OpenWindow(#Window, 0, 0, ww, wh, "Измени размер окна", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
	WindowBounds(0, ww, wh, #PB_Ignore, #PB_Ignore)

	EditorGadget(#edr0, 10, 10, ww - 20, wh - 60)
	ButtonGadget(#btn0, 10, wh - 40, ww - 20, 30, "Кнопка")

	Repeat
    Select WaitWindowEvent()
    	Case #PB_Event_SizeWindow
        wh = WindowHeight(#Window) 
        ww = WindowWidth(#Window) 
        ResizeGadget(#edr0, #PB_Ignore, #PB_Ignore, ww - 20, wh - 60) 
        ResizeGadget(#btn0, #PB_Ignore, wh - 40, ww - 20, #PB_Ignore) 
    	Case #PB_Event_CloseWindow
        CloseWindow(#Window)
        End
    EndSelect
	ForEver
EndIf

Пример для EventDropFiles и/или EnableGadgetDrop

Код:
#Window = 0
Enumeration Gadget
	#str0
	#edr0
EndEnumeration

If OpenWindow(#Window, 0, 0, 500, 200, "Кинь сюда файл", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

	StringGadget(#str0, 10, 10, 500 - 20, 30, "")
	EditorGadget(#edr0, 10, 50, 500 - 20, 140)
	
	EnableGadgetDrop(#str0, #PB_Drop_Files, #PB_Drag_Copy)
	EnableGadgetDrop(#edr0, #PB_Drop_Files, #PB_Drag_Copy)

	Repeat
    Select WaitWindowEvent()
    	Case #PB_Event_GadgetDrop ; событие перетаскивания
        Select EventGadget()
        	Case #str0 ; гаджеты, которые получили событие перетаскивания файлов/папок
            If Not FindString(EventDropFiles(), Chr(10))
            	SetGadgetText(#str0, EventDropFiles())
            EndIf
        	Case #edr0
            SetGadgetText(#edr0, EventDropFiles())
        EndSelect
    	Case #PB_Event_CloseWindow
        CloseWindow(#Window)
        End
    EndSelect
	ForEver
EndIf

TailleFichier в примере FileSize, все имена функций и переменных поменять на англоязычные

ReadAsciiCharacter, ReadByte, ReadCharacter, ReadDouble, ReadFloat, ReadInteger, ReadLong, ReadQuad, в примерах в комментарии "Построчный просмотр содержимого файла", на самом деле везде разный, посимвольный, побайтовый.

Некоторые страницы отсутствуют в дереве, например параметры компилятора в командной строке. Замучаешься вспоминать, чтобы найти, это есть только на странице "Справочное руководство", хорошо бы добавить эти страницы в дерево и в указатель.

В "Структуры" можно добавить пример список списков структур, обрабатывая в двух вложенных циклах. Я подобное делал в одной из своих программ (поиск дубликатов), что показывает сложную вложенность структур. В общем я не один раз пытался там найти пример структур со списками и каждый раз не находил и говорил себе надо бы этот пример добавить. Самое интересное что доступ к элементу выглядел так a()\b()\x и это работало и даже сортировка по вложенному списку работала.

Reference\links.html - Полезные ссылки - там теперь ссылка на русский форум не работают, думаю надо указать этот форум и раздел киберфорума по PureBasic.

Я делаю дерево, куда включил ключевые слова, разные темы и доп.инфу. Пробуйте
В связи с этим вопрос, как сделать, например в AutoIt3 ключевые слова сортированы, то есть в одном списке указаны ВСЕ ключевые слова, а не группами: основные, разные, прочие, другие. То есть Global, If, For, Goto, Include, Data - все они являются ключевыми словами и не разделяются на важные и не важные. И удобство что когда я кликнул ключевое слова в "Указатель", то на вкладке "Содержание" автоматически открывается раздел ключевых слов и можно просматривать там другие варианты, а не возвращаться на общую страницу.и искать там, то есть сразу в дереве кликать любые.

Отредактировано AZJIO (02.02.2023 07:38:31)

0

17

В разделе "FileSystem" слишком много используется однотипных примеров перечисления файлов. Например в GetExtensionPart() - получить расширения, лучше сделать пример одной строкой, например:

Код:
Debug GetExtensionPart("C:\file.txt") ; вернёт txt

Можно в качестве примеров в одной из функций ExamineDirectory(), NextDirectoryEntry(), DirectoryEntryType(), DirectoryEntryName(), FinishDirectory() использовать другие варианты поиска, например рекурсивный:

Код:
Procedure FileSearch(List Files.s(), dir.s, mask.s = "")
  Protected name.s, id
  
  If Right(dir, 1) <> #PS$
    dir + #PS$
  EndIf

  id = ExamineDirectory(#PB_Any, dir, "")
  If id
    While NextDirectoryEntry(id)
      name = DirectoryEntryName(id)
      If name = "." Or name = ".."
        Continue
      EndIf
      If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory ; если путь является папкой, то
        FileSearch(Files(), dir + name + "\", mask) ; рекурсивный вызов во вложенную папку
      ElseIf (Not Asc(mask) Or GetExtensionPart(name) = mask) And AddElement(Files())
        Files() = dir + DirectoryEntryName(id)
      EndIf
    Wend
    FinishDirectory(id)
  EndIf
EndProcedure

Define NewList Files.s()
FileSearch(Files(), GetTemporaryDirectory(), "exe") ; пустая строка чтобы найти все файлы

ForEach Files()
  Debug Files()
Next

Специально сделал полноценный кроссплатформенный пример сократив до минимума функционал.

ExamineMouse() - пример отсюда у меня просто завис и не реагирует. Через диспетчер задач снимал процесс.

Отредактировано AZJIO (14.02.2023 12:51:23)

0

18

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

n=55552222
m=n&$FFFF
Debug m; = 43230
b=n>>16
Debug b; = 847

m=5555
b=2222
n=m+b<<16
Debug n; = 145626547

Открываем калькулятор программист и пишем  десятичное число 55552222 и видим старшие биты слова и младшие открываем повторно калькулятор и вводим младшие биты слова =50198(деястичное) и старшие биты слова=84(деястичное), я к тому что вы изначально уже десятичное число возомнили как два слова старшее и младшие пополам хотя число(55552222 =32 бита) но не с такими значениями бит. :no:

Отредактировано Sergeihik (14.02.2023 18:20:25)

0

19

Sergeihik
Обсуждать фигуральные фразы тут бессмысленно, только мешать Sergey2400 исправлять справку выискивая между флудом полезную информацию.

Sergey2400
Для функции RunProgram() можно добавить примеры популярных команд как я делал в AutoIt3, это было для новичка в неком смысле справочник по запуску справки, ссылок и т.д. Например:

Код:
; === Windows ===
RunProgram("hh.exe", Chr(34) + "help.chm::/html/index.htm" + Chr(34), "") ; открыть справочный файл
RunProgram("explorer.exe", "/select," + #PB_Compiler_File, "") ; открыть проводник выбрав файл

 ; Сжатие файла "Boot.ini" в архив "Archive.7z" с паролем "Мой пароль"
 #q$ = Chr(34)
 RunProgram(GetUserDirectory(#PB_Directory_Programs) + "7-Zip\7z.exe",
            "a " + #q$ + "C:\ProgramData\PureBasic\Archive.7z" + #q$ + " -p" + #q$ + "Мой пароль" + #q$ + " -mhe -mx9 " + #q$ + "C:\Boot.ini" + #q$, "")

; === Linux ===
tmp$ = "/usr/share/help/ru/myprog/index.html"
RunProgram("xdg-open", tmp$, GetPathPart(tmp$)) ; открыть справочный файл

GetUserDirectory

Код:
Debug GetUserDirectory(#PB_Directory_Programs)
Debug GetUserDirectory(#PB_Directory_Desktop)
Debug GetUserDirectory(#PB_Directory_Downloads)
Debug GetUserDirectory(#PB_Directory_Documents)
Debug GetUserDirectory(#PB_Directory_Videos)
Debug GetUserDirectory(#PB_Directory_Musics)
Debug GetUserDirectory(#PB_Directory_Pictures)
Debug GetUserDirectory(#PB_Directory_Public)
Debug GetUserDirectory(#PB_Directory_ProgramData)
Debug GetUserDirectory(#PB_Directory_AllUserData)

или так

Код:
For i = 0 To 9
	Debug GetUserDirectory(i)
Next

Отредактировано AZJIO (15.02.2023 13:32:28)

0

20

у Серёги экзамены на работе, сказал что где то в марте продолжит, уж больно объект ответственный
предложил Серёге айпишные примеры добавить, он согласился
а чё народ скажет?
или таки их отдельно?
пингвиноводов в расчёт не беру
например Len() и lstrlen(), здесь встроенная просто оболочка

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

Да и причём тут "устаревшая", на форуме события WinCallback многие используют в основном цикле как события, чуть ли не каждый второй пример, в том числе есть и примеры с EventlParam(), EventwParam().

открой нерусскую справку, там это написано, в Серёгином переводе это по русски написано
я тоже эти старые функции использовал, но это не отменяет Федины рекомендации

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

Открываем калькулятор программист

ты не понял о чём я написал
я писал о том как винда пакует числа, тот же RGB(), wParam, lParam они тоже могут быть упакованы, например сразу обе координаты мыши в одном параметре

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

Некоторые страницы отсутствуют в дереве, например параметры компилятора в командной строке. Замучаешься вспоминать, чтобы найти, это есть только на странице "Справочное руководство", хорошо бы добавить эти страницы в дерево и в указатель.

тоже сталкивался, задолбишся искать

0

21

Может лучше новую тему создать "обсуждение справки"? Чтобы разделить общение от логов. Просто мы сейчас, задай я вопрос про айпишники, наговорим на 5 страниц, потом Сергей будет читать это всё ненужное обсуждение, чтобы найти в них логи для правки.

Left

Возвращает указанное число символов, считая от начала (слева) строки.

Возвращает строку заданной длины, считая от начала строки (слева).
В комментариях можно добавить, что строка не увеличивается если указано число больше длины строки.

Random
целочисленное значение.
Эта фраза не даёт понимание используемого типа переменной. Я понимаю integer, а "целочисленное" это может быть Long, Integer, Quad. Например я хочу задать значение Quad и думаю, есть ли смысл, если функция приведёт значение к Integer, тогда я задаю максимальное Integer.

Отредактировано AZJIO (04.03.2023 08:47:24)

0

22

Код:
Repeat
  ...
Until <expression> [или Forever]

У меня в справке: эта функция повторяет цикл до тех пор, пока <expression> не станет истинным...
Такое описание запутывает. Лучше упростить до примерно такого: если <expression> истинно, то происходит выход из цикла.
То же самое касается While-Wend

0

23

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

Такое описание запутывает.

Мне казалось что я это уже говорил, но нет. Вот буквально сегодня просматривая очередной Until (Until Event = #PB_Event_CloseWindow) мне показалось что идеальный бы формулировкой для меня было что-то в виде
"Until 0" и "While 1" - бесконечный цикл.
То есть эта короткая фраза показывает что подвыражение для этих двух циклов для одного и того же действия неодинаковы, точнее инвертированы. Если это откладывается в память как и одно из значений подвыражения, то для другого становится понятным что оно инвертировано. Например в AutoIt3 нет Repeat и там бесконечный цикл записывается как "While 1", поэтому у меня стойкое восприятия по поводу логики с While, но вот с Until я постоянно перечитываю логику подвыражения, с трудом выворачивая запутанную формулировку в голове.
В итоге я за то, чтобы было две формулировки:

Если <expression> истинно, то происходит выход из цикла. "Until 0" и "While 1" - бесконечный цикл.

причём последняя формулировка была бы в обоих описаниях в Until и While.
Кстати, вот из справки AutoIt3

Если <expression> равно True - выход из цикла
Если <expression> равно False - выполнить ещё раз операторы <statements>

Ещё у меня 3 кнопки на панели инструментов справки. Решил добавить кнопку "Параметры", так как она появляется справа и в меню имеет пункт "Скрыть вкладки". Так как часто код не вмещается в экран по ширине и есть возможность убрать дерево и это место будет занято окном текста описания функций, а некоторые тексты многостраничные (структуры и описания работы с IDE).

ReadUnicodeCharacter, ReadString, WriteByte, ReadWord, WriteDouble, WriteCharacter, WriteQuad, WriteLong, WriteInteger, WriteFloat, WriteWord, WriteUnicodeCharacter, WriteStringN, WriteString, ReadLong, ReadQuad, ReadInteger, ReadFloat, ReadByte, ReadCharacter, ReadAsciiCharacter

Код:
If CreateFile(0, "Test.txt") ; Открывает существующий файл или создайте новый, если он не существует

CreateFile() не открывает, он только создаёт пустой файл.  Существующий будет превращён в пустой файл.

FileSize

Код:
        Case -1
            Reponse$ = "Файл не существует"

объект (файл/каталог) не существует

Отредактировано AZJIO (18.09.2023 20:21:06)

0

24

В справочном файле нужно обязательно указать использование ReadStringFormat(), перед тем как использовать ReadString(), чтобы поставить указатель в конце метки BOM и читать данные файлы. Если этого не сделать, то при чтении UTF-8 в начало строки попадает один лишний символ из метки BOM.
Во всех примерах, где используется ReadString() нужно добавить эту функцию, чтобы ляпов не было.
Допустим если первый символ кавычка и получив строку проверяем Left(str$, 1) <> ";" то первый символ при таком расчёте оказывается вторым.

До кучи столкнулся с тем, что если InitSound() возвращает 0, то программа падает при попытке использования LoadSound(). Нужно изменить пример и как-то предупредить кодера, что если наушники вытащены из компа, то прога упадёт и требуется флаг проверки InitSound(), перед тем как вызвать любую функцию в разделе звука. Ну ладно ещё на старте сделать проверку и выход, а если звук является второстепенным и выход по звуку не критерий останавливать прогу, тогда важен флаг наличия инициализированного модуля. А как это будет работать, если звук выключен в процессе, то есть после запуска проги выдернут шнур, может тогда надо снова запросить InitSound()?.

Отредактировано AZJIO (03.11.2023 13:33:53)

0

25

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

До кучи столкнулся с тем, что если InitSound() возвращает 0, то программа падает при попытке использования LoadSound(). Нужно изменить пример и как-то предупредить кодера, что если наушники вытащены из компа, то прога упадёт и требуется флаг проверки InitSound(), перед тем как вызвать любую функцию в разделе звука. Ну ладно ещё на старте сделать проверку и выход, а если звук является второстепенным и выход по звуку не критерий останавливать прогу, тогда важен флаг наличия инициализированного модуля. А как это будет работать, если звук выключен в процессе, то есть после запуска проги выдернут шнур, может тогда надо снова запросить InitSound()?.

А почему прога упадёт,разве это не инициализация звуковой карты?допустим в ноуте если выдернуть наушники то на динамики звук перейдёт. если упадёт то получается что это типа порта инициализация?

0

26

Sergeihik

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

А почему прога упадёт,

Я же не знаю почему она упадёт, я по факту. Я записывал видосы с USB наушниками (с микрофоном), а обычно у меня наушники штекерные. И я загрузил винду без наушников совсем. Открываю свою прогу "Календарь", она падает, сначала подменил её файлом из комплекта, падает, запускаю исходник, пишет LoadSound() не может без InitSound(). И тут я понимаю что у InitSound() есть флаг, но как это отработает если я вытащу наушники в загруженной винде или после запуска проги. Если что обсуждение проблемы документации тут и тут.

Отредактировано AZJIO (03.11.2023 15:14:32)

0

27

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

Sergeihik

Я же не знаю почему она упадёт, я по факту. Я записывал видосы с USB наушниками (с микрофоном), а обычно у меня наушники штекерные. И я загрузил винду без наушников совсем. Открываю свою прогу "Календарь", она падает, сначала подменил её файлом из комплекта, падает, запускаю исходник, пишет LoadSound() не может без InitSound(). И тут я понимаю что у InitSound() есть флаг, но как это отработает если я вытащу наушники в загруженной винде или после запуска проги. Если что обсуждение проблемы документации тут и тут.

Отредактировано AZJIO (Сегодня 15:14:32)

Типа отследить внешнею звуковую карту усб если она интерфейса класса hid при этом надо знать бы ещё её имя для проверки и проверять наверное.(если не hid то наверное другим классом интерфейса?)
и что то делать тогда наверное с инициализацией InitSound().
ps:если винда старше 7 то вроде как надо функцию RegisterNotification_(.......)?

Код:
EnableExplicit
Structure _GUID
    Data1.l;
    Data2.u;
    Data3.u;
    Data4.a[8];
EndStructure
Macro Set_DEFINE_GUID_Classa(Name_Structure_GUID,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
  Name_Structure_GUID\Data1=l
  Name_Structure_GUID\Data2=w1
  Name_Structure_GUID\Data3=w2
  Name_Structure_GUID\Data4[0]=b1
  Name_Structure_GUID\Data4[1]=b2
  Name_Structure_GUID\Data4[2]=b3
  Name_Structure_GUID\Data4[3]=b4
  Name_Structure_GUID\Data4[4]=b5
  Name_Structure_GUID\Data4[5]=b6
  Name_Structure_GUID\Data4[6]=b7
  Name_Structure_GUID\Data4[7]=b8
EndMacro
Structure _DEV_BROADCAST_DEVICEINTERFACE_W
  dbcc_size.l;
  dbcc_devicetype.l;
  dbcc_reserved.l;
  dbcc_classguid._GUID;
  *dbcc_name;[1]  ;
EndStructure

  Global BROADCAST_HDR.DEV_BROADCAST_HDR 
  Global BROADCAST_DEVICEINTERFACE._DEV_BROADCAST_DEVICEINTERFACE_W
  BROADCAST_DEVICEINTERFACE\dbcc_size=SizeOf(BROADCAST_DEVICEINTERFACE)
  BROADCAST_DEVICEINTERFACE\dbcc_devicetype=#DBT_DEVTYP_DEVICEINTERFACE
  Set_DEFINE_GUID_Classa(BROADCAST_DEVICEINTERFACE\dbcc_classguid,$4d1e55b2,$f16f,$11CF,$88,$cb,$00,$11,$11,$00,$00,$30);класс интерфейсного устройства hid
; BROADCAST_DEVICEINTERFACE\dbcc_name=@"hid



; Маска содержит флаги подключенных и отключенных дисков, так как это может быть не один диск, а диск с несколькими разделами.
Procedure.s MaskToLetter(Mask.l)
	Protected i, discs$
	For i = 0 To 25
    If ((Mask >> i) & 1) ; проверить каждый флаг
    	discs$ + Chr(i + 65) + ", " ; получить букву и добавить
    EndIf
	Next
	ProcedureReturn Left(discs$, Len(discs$) - 2)
EndProcedure

Procedure MyWindowCallback(hWnd, Msg, wParam, lParam)
	Protected Result = #PB_ProcessPureBasicEvents, Mask.l, *pDBHDR.DEV_BROADCAST_HDR, *pDBV.DEV_BROADCAST_VOLUME,*pDBi._DEV_BROADCAST_DEVICEINTERFACE_W
	Protected *ptr.MINMAXINFO
	Static result2.a=0
	;Debug 5
	Select Msg
    Case #WM_DEVICECHANGE ; Изменение в подключении устройств.
     ; Result = #True
      Debug "==="
      Debug wParam
      Select wParam
        Case #DBT_DEVNODES_CHANGED;Устройство добавлено в систему или удалено из нее(типа внешней звуковой карты)
          Debug 4
         ; Debug lParam
        Case #DBT_QUERYCHANGECONFIG;Запрашивается разрешение на изменение текущей конфигурации (закрепление или отстыковка).
          Debug 5
        Case #DBT_CONFIGCHANGED;Текущая конфигурация изменилась из-за док-станции или отстыковки.
          Debug 6
        Case #DBT_CONFIGCHANGECANCELED;Запрос на изменение текущей конфигурации (закрепления или отстыковки) был отменен.
          Debug 7
        ;  Debug lParam
        Case #DBT_DEVICEARRIVAL;Устройство или носитель были вставлены и теперь доступны.(флешка вставлена)
          Debug 8
         ; Debug lParam
          *pDBHDR.DEV_BROADCAST_HDR=lParam
          If  *pDBHDR\dbch_devicetype=#DBT_DEVTYP_DEVICEINTERFACE
            Debug "#DBT_DEVTYP_DEVICEINTERFACE"
            *pDBi=lParam
            Debug Hex(*pDBi\dbcc_classguid\Data1,#PB_Long);здесь проверку надо на класс hid
            Debug PeekS(@*pDBi\dbcc_name,-1,#PB_Unicode)
          EndIf
        Case #DBT_DEVICEQUERYREMOVE;Запрашивается разрешение на удаление устройства или носителя. Любое приложение может отклонить этот запрос и отменить удаление.
          Debug 9
        Case #DBT_DEVICEQUERYREMOVEFAILED;Запрос на удаление устройства или носителя был отменен.
          Debug 10
        Case #DBT_DEVICEREMOVEPENDING;Устройство или часть носителя будет удалена. Не может быть отказано.
          Debug 11
        Case #DBT_DEVICEREMOVECOMPLETE;Устройство или носитель были удалены(флешка удалена)
          Debug 12
          *pDBHDR.DEV_BROADCAST_HDR=lParam
          If  *pDBHDR\dbch_devicetype=#DBT_DEVTYP_DEVICEINTERFACE
            Debug "#DBT_DEVTYP_DEVICEINTERFACE"
            *pDBi=lParam
            Debug Hex(*pDBi\dbcc_classguid\Data1,#PB_Long);здесь проверку надо на класс hid
            Debug PeekS(@*pDBi\dbcc_name,-1,#PB_Unicode)
          EndIf
        Case #DBT_DEVICETYPESPECIFIC;Произошло событие для конкретного устройства
          Debug 13
        Case $8006;#DBT_CUSTOMEVENT;Произошло пользовательское событие
          Debug 14
        Case #DBT_USERDEFINED;Значение этого сообщения определяется пользователем.
          Debug 15
        ;;===============  
        Case #DBT_DEVICEARRIVAL, #DBT_DEVICEREMOVECOMPLETE
          Debug 16
          *pDBHDR.DEV_BROADCAST_HDR=lParam

            If *pDBHDR\dbch_devicetype = #DBT_DEVTYP_VOLUME
            *pDBV.DEV_BROADCAST_VOLUME=lParam
            Mask = *pDBV\dbcv_unitmask
            
            Select wParam
            	Case #DBT_DEVICEARRIVAL
                SetWindowTitle(0 , "Подключен(ы) " + MaskToLetter(Mask))
            	Case #DBT_DEVICEREMOVECOMPLETE
                SetWindowTitle(0 , "Отключен(ы) " + MaskToLetter(Mask))
            EndSelect
            
            
        	EndIf
    	EndSelect
	EndSelect
	ProcedureReturn  Result
EndProcedure

If OpenWindow(0, 0, 0, 450, 100, "Вставте флешку", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@MyWindowCallback())

  ;#DEVICE_NOTIFY_WINDOW_HANDLE=0
  RegisterDeviceNotification_(WindowID(0),@BROADCAST_DEVICEINTERFACE,0)

 ;BROADCAST_HDR\dbch_devicetype=#DBT_DEVTYP_DEVICEINTERFACE
 ;BROADCAST_HDR\dbch_size=SizeOf(BROADCAST_HDR)+BROADCAST_DEVICEINTERFACE\dbcc_size+2
 
  

	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Отредактировано Sergeihik (03.11.2023 19:54:16)

0

28

Как это упадёт.
Я когда фильмы в браузере или плеере смотрю, то могу спокойно переключать звук через наушники, через компьютер или вообще по Bluetooth.
И браузер не падает. И никаких выскакивающих окон и всплывающих предупреждений не выдаёт.
Чините вашу программу, чтобы она нормально работала.

0

29

Замабувараев
Вот зачем тут флудить, в теме для справки, я два раза ссылку дал на обсуждения в другой теме. Что чинить? Отвечать не надо, риторический вопрос, напиши сначала код InitSound(), чтобы я знал что чинить, мне лень проводить тесты, чтобы выяснить для чего нужен  InitSound() и как он себя будет вести в разных логических конструкциях, в разных виндовых/линуксовых ситуациях. Угадывать это не наш стиль, может ваш.

Особенно эти советы смешны, когда я выкладываю исправленную программу, отписываю о проблеме функции и мне те кто не знал об ошибке, которым я об этом сказал начинают советовать что делать. Хотя я при этом советую исправить справку, чтобы люди не попадались на это.

SetFrameRate

количество раз в секунду, которое может вызываться функция

*функцией... а лучше всё предложение перевести с гугл перевода на русский.

Отредактировано AZJIO (04.12.2023 04:40:07)

0

30

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

Вставил новые примеры в справку, и кроме них добавил ещё ButtonImageGadget, OpenWindow

Скачать

Если есть идеи по примерам, то добавлю/обновлю.

Перезалил архив со справкой. Все указанные здесь опечатки и улучшения исправлены.
Перезалил. Удалил все упоминания Карты как Хеш-карты, теперь просто Карта. Сделал ссылки по тексту типа OpenWindow() подсвеченными в стиле функций, скобки другим цветом.

Отредактировано AZJIO (01.03.2024 07:02:41)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Улучшение справки