Orion9

|
Posted: Thu Dec 04, 2025 19:37 Post subject: |
|
|
Loopback
Пока не забыл, лучше сразу напишу. В будущих версиях хотелось бы видеть следущее:
- ShowHint
- ShowPopupMenu
У подсказки хотелось бы фиксировать ширину окна (об этом я уже писал), а также хотелось бы, чтобы окно могло висеть и изменять текст без закрытия (об этом я тоже писал). А вот о чем я не писал, так это об отступе. Не лишним было бы иметь такую возможность. Пока я выхожу из положения заданием пустых строк сверху и снизу и пробелами по краям, но идеальной пропорции добиться не получается | Code: | ShowHint(auCRLF & " " & HintText & " " & auCRLF, 0, 0, 1000, 1) |
В ShowPopupMenu с параметром /F хочется передовать дополнительный параметр, а не только имя функции. И хотелось бы, чтобы ShowPopupMenu могла возвращать индекс выбранного элемента.
Теперь об упомянутых примерах. Еще один вариант советчика может получиться из файла Russian.cedf. Работать с локальным файлом удобно: он редко изменяется. Единственная сложность, в нем содержится информация не только о ключах, но и секциях, это немного нарушает структуру, как и слишком большой текст некоторых статей. Но при желании все можно учесть. Ниже представлен очень сырой, я бы сказал, "топорный" вариант выборки статей из этого файла:
 Hidden text
 Hidden text | Code: | RegisterCommand 71130 "CedfRandomKey"
Global gCedfDesc, gCedfHistory, gCedfData = COMMANDER_PATH & "\Ini\Backup\Russian.cedf"
Func CedfRandomKey()
Static hIco, WM_GETICON = 0x7f, bIcon = false
Local file = gCedfData
Local obj = BinaryFile(file)
If ERROR Then
MsgBox("Error reading file " & file, "Autorun", 16)
Return
EndIf
If bIcon Then
hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)
Else
hIco = 1
EndIf
Local block = 1024*20, blocks = Ceil(obj.Size/1024), rand = Random(1, blocks - 20, 1)
obj.Pos = rand*1024
txt = obj.ReadStr(block, "ANSI")
rex = RegExpGet(txt, _
'<key name="(.*?)" file="(.*?)" section="(.*?)" default="(.*?)" version="(.*?)".*?' & _
'<description>(.*?)</description>', '[$3\]\n$1=$4\n$6')
If ERROR Then
rex = RegExpGet(txt, '<section title="(.*?)" name="(.*?)" file="(.*?)" version="(.*?)".*?' & _
'<description>(.*?)</description>', '[$2\]\n$1\nVersion=$4\n$5')
EndIf
Local lst = List(), dbg = ""
dbg &= 'MENUITEM "Block = ' & rand & '/' & blocks & '", em_aucmd /D' & auCRLF
dbg &= 'MENUITEM "Position = ' & obj.Pos & '", em_aucmd /D' & auCRLF
dbg &= 'MENUITEM "Filesize = ' & obj.Size & '", em_aucmd /D' & auCRLF
dbg &= 'MENUITEM SEPARATOR' & auCRLF
dbg &= 'MENUITEM "History", em_aucmd -1 CedfRandHistory' & auCRLF
gCedfHistory &= "Block:" & rand & '/' & blocks & ", Pos: " & obj.Pos & auCRLF
lst.Text = rex
If lst.Count < 2 Then
lst.Count = 3
lst[0] = "Error:"
lst[1] = "Block: " & rand & "/" & blocks
lst[2] = "Position: " & obj.Pos
EndIf
txt = lst[0] & auCRLF & lst[1] & auCRLF
txt = StrReplace(txt, "[[", "[")
txt = StrReplace(txt, "]]", "]")
If StrLen(lst[2]) > 640 - StrLen(txt) Then
txt &= StrLeft(lst[2], 640 - StrLen(txt)) & "..."
Else
txt &= lst[2]
EndIf
gCedfDesc = lst.Text
Free(obj, lst)
txt &= auCRLF & '<a href="CedfReadDesc()">Читать дальше</a>'
tip(txt, hIco, "Wincmd.ini", 0, dbg)
EndFunc
Func CedfReadDesc()
MsgBox(gCedfDesc, "Description", 64+65536+262144)
EndFunc
Func CedfRandHistory()
MsgBox(gCedfHistory, "History", 64+65536+262144)
EndFunc |
Для обработки клика в тэге <a ref> используется не ссылка, а имя функции, которая вызывает MsgBox.
| Code: | <a href="CedfReadDesc()">Читать дальше</a>
Func CedfReadDesc()
MsgBox(gCedfDesc, "Description", 64+65536+262144)
EndFunc |
Еще одно отличие от предыдущего примера: в функцию tip() передаются дополнительные пункты меню, которые используются здесь для отладки, но которые в принципе могут использоваться и для других целей.
 Hidden text
А еще вместо стандартных значков по номеру от 0 до 6 в функцию можно передать дескриптор иконки. Самый простой способ его получить через WM_GETICON от самого окна ТС, но смотрится так себе, нужна другая иконка
 Hidden text
В общем, пример далек от совершенства. Для выборки используется объект BinaryFile с изменением позиции в файле, что чревато большим количеством повторений одних статей и пропуском других. Но это только пример. Если делать серьезно, нужно использовать другие алгоритмы. В следующем примере будет использован объект List с последовательны удалением и перемешиванием элементов. |
|