Orion9

|
Posted: Sun Mar 09, 2025 12:20 Post subject: |
|
|
Loopback
Проверил объект Map - всё работает. У вас, случайно, нет планов добавить к нему свойство Count, чтобы можно было перечислять элементы карты? Сейчас для этого требуется создавать временный массив, т.е объект List:
Code: | Local mFiles = Map()
...
Local i, txt
Local aKeys = list()
aKeys.Text = mFiles.Keys()
For i = 0 To aKeys.Count - 1
txt &= mFiles[aKeys[i]] & auCRLF
Next
MsgBox(txt)
Free(aKeys, mFiles) |
 Полный тестовый код Code: | SetHotkeyAction /H:F11 MapObjTest
Func MapObjTest()
Local ffd = Buffer(604)
Local file, attr, ini, inst, desc, name
Local hf = DllCall("FindFirstFileW", "wstr", COMMANDER_PATH & "\Ini\" & "Color*.ini", "ptr", ffd.Ptr)
If Not (hf > 0) then
Free(ffd)
MsgBox("Файлы Color*.ini не найдены")
Return
Endif
Local mFiles = Map()
While 1
file = ffd.GetStr(44)
attr = ffd.GetNum(0, "dword")
If Not BitAND(attr, 16) Then
ini = COMMANDER_PATH & "\Ini\" & file
IniRead inst %ini% "ColorTheme" "Instance" 0
If inst <> 0 Then
IniRead desc %ini% "ColorTheme" "Description"
IniRead name %ini% "ColorTheme" "Name"
mFiles.Set (ini, name)
EndIf
Endif
If DllCall("FindNextFileW", "handle", hf, "ptr", ffd.Ptr) = 0 Then Break
Wend
DllCall("FindClose", "handle", hf)
Free(ffd)
Local i, txt
Local aKeys = list()
aKeys.Text = mFiles.Keys()
For i = 0 To aKeys.Count - 1
txt &= mFiles[aKeys[i]] & auCRLF
Next
MsgBox(txt)
Free(aKeys, mFiles)
EndFunc |
Код завязан на ini-файлы с секцией ColorTheme:
 Файлы Code: | [ColorTheme]
Name=System
Description=Система
Instance=4 |
Code: | [ColorTheme]
Name=Dark
Description=Тёмные тона
Instance=1 |
Code: | [ColorTheme]
Name=Roman Silver
Description=Светлые тона
Instance=2
|
Делал, основываясь на примере из справки, но мне кажется, в нём есть небольшая неточность:
FindFirstFileW может вернуть -1, а значит условие пропустит код, что может привести к интересным результатам ) И ещё одно уточнение: после последнего вызова FindNextFileW необязательно использовать FindClose?
Был ещё один давний вопрос, который забывал спросить. Некоторые wdx-плагины перестают работать после того, как их загружаешь в объект Plugin и потом освобождаешь через Free. Проверить можно на обычной подсказке:
Code: | 1exts=*.aucfg;autorun.cfg;*.ahk;*.au3; *.vbs
1fields=Число строк: [=linebreakinfo.CRLF Count]\nБайт прочитано: [=linebreakinfo.Bytes Read] |
Если в коде добавить две строки:
Code: | objLineB = Plugin("LineBreakInfo.wdx")
Free(objLineB) |
То после запуска ТС, подсказка на панелях не будет работать, т.е. поля плагина в подсказке будут пустыми. Но если убрать Free, то всё нормально.
Можно, конечно, использовать объект без освобождения в некоторых случаях, если он больше не нужен, но будет ли это правильным и не приведёт ли ещё к каким-то проблемам в будущем? |
|