Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Не забудьте, что nsisUnRar2 будет работать только при использовании граф. интерфейса (при исполнении из секции), может, запустите и из под .onInit, копайтесь, если хотите, мне разбираться не особо интересно в этой теме »
Ога, ща посчупаем... :)
Давеча понадобилось вывести содержимое операций из консоли - в окошко NSIS...
ExecDos, как говорится, мне в помощь, вроде как всё хорошо, но оказалось всё же совсем не хорошо... А именно :
Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку...
Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... )
И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ?
!include MUI2.nsh
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
OutFile TOWINDOW_test.exe
Var Dlg
Var Log
Page custom myPage wait
Function myPage
nsDialogs::Create 1044
Pop $Dlg
${NSD_CreateListBox} 0 10 330u 100u $Log
Pop $Log
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $Log
Pop $9
nsDialogs::Show
FunctionEnd
Function wait
ExecDos::wait $9
FunctionEnd
Section
SectionEnd
о галочке "Запуск от имени администратора" в свойствах ярлыка. »
Хорошо, что реализовал для NSIS этот известный полезный трюк. Когда то здесь уже обсуждался, но тогда без результата.
Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку... »
Я помню, как я настрадался с этим элементом в своём SFX Creator, у меня был такой же вопрос, но лично у меня не получилось получить текст в строке, поэтому...
Я нашел выход только в создании ListView элемента, после изучения которого переписал практически все диалоги в SFX Creator :biggrin:
Поэтому, могу тебе посоветовать плюнуть на ListBox и создать ListView элемент.
Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... ) »
А вот полезно было бы читать все странички в справке, а не только те, которые тебе нужны, в справочнике, как ни странно, есть решение этой проблемы :)
В разделе Обучение IO: собственные странички, есть раздел Примеры диалогов, в котором есть один пример Считываем данные из консольного приложения в ListView
Посмотришь ради собственного развития)
А конкретно тебе нужна WinAPI команда OemToChar, пример использования тоже есть в справке в разделе Примеры кодов на страничке Русские символы в DOS кодировке
По поводу работы с элементом ListView - читай следующее:
1. Обучение IO: собственные странички => Элементы в диалоге => ListView: список => ListView: обычный список
2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента
И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ? »
Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка, возможно, это то, о чем ты спросил...
Если что-то не поймёшь или будут вопросы - пиши, мне просто лень код накидывать, в последнее время вообще всё лень...
Хорошо, что реализовал для NSIS этот известный полезный трюк. Когда то здесь уже обсуждался, но тогда без результата. »
не помню уже причину, по которой тогда это не реализовал, видимо, не было настроения, а потом и забыл про этот вопрос... :)
Обучение IO: собственные странички »
Очень не хотелось бы связываться с IO, который забраковали даже сами разрабы, как явно устаревший и во всём уступающий nsDialogs...
пример Считываем данные из консольного приложения в ListView »
Даже если пересилить себя :) и связаться допотопным IO, то этот способ оч громоздский по сравнению с одной строкой
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW
Но оказалось есть интересный способ получить данные из ListBox_а (конечно не в полной мере, какой хотелось бы...), но всё же выход :
OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave
Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox
;System::Call "user32::OemToChar(t$ListBox, t.$ListBox)" #ни хрена не работает, местоположение менял...
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $ListBox
Pop $hcli
nsDialogs::Show
FunctionEnd
Function leave
SendMessage $ListBox ${LB_GETCURSEL} 0 0 $1
IntOp $1 $1 + 1
;MessageBox MB_OK $1
System::Call user32::SendMessage(i$ListBox,i${LB_GETTEXT},ir1,t.r1)
;System::Call "user32::OemToChar(tr1, t.r1)" # здесь работает, но здесь не надо...
MessageBox MB_OK $1
ExecDos::wait $hcli
FunctionEnd
Section
SectionEnd
в справочнике, как ни странно, есть решение этой проблемы »
Точно так. Знал ведь , да забыл... Но почему то не работает там, где надо (см. пример в коде, комбинировал по разному - без результата... ). Может я чего опять упустил...
Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка »
Я имел ввиду, что из консоли мне насыпится куча строк, а надо использовать только конкретные номера строк, а остальные ессно игнорировать...
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал...
ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView :
Edit, RichEdit, ListView and ListBox supported
А как бы это сделать на практике ? Например, отправить инфу в окно Edit (с помощью nsDialogs :) ) ...
Очень не хотелось бы связываться с IO »
Даже если пересилить себя и связаться допотопным IO »
Ты вообще читал моё сообщение или глазами по нему пробежался? Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз.
Но оказалось есть интересный способ получить данные из ListBox_а»
Ты смотрел пример моего диалога в файле справки? Видимо, нет
В том примере показано, как нужно использовать ExecDos, когда тебе нужно сделать что-то с данными из консольного приложения, а не просто запихнуть весь текст в какой-то элемент
И там показано, что команду OemToChar использовать можно только для преобразования строки, но никак не для смены кодировки элемента управления, как ты пытался сделать...
ЗАМЕЧАНИЕ ДЛЯ ВСЕХ
Возьмите на заметку, если вы пользуетесь плагином ExecDos просто для вывода данных консольного приложения в элемент управления - используйте ключ /TOWINDOW или /DETAILED в зависимости от сиуации, НО, если же вам необходимо произвести какую-то манипуляция с теми данными, которые консольное приложение вам выдаёт - используйте ключ /TOSTACK или /TOFUNC, опять же, в зависимости от ситуации
Я имел ввиду, что из консоли мне насыпится куча строк, а надо использовать только конкретные номера строк, а остальные ессно игнорировать... »
Мой пример в моём примере :)
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал... »
Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый?
Ладно, дам тебе задание: после того, как ты свой код напишешь, всё сделаешь так, как нужно, попробуй добавить в свой любимый ListBox горизонтальную прокрутку
Хочу потом написать здесь "я же говорил" после того, как ты возьмёшься переписывать код под элемент ListView :biggrin:
OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave
Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox
GetFunctionAddress $0 MyFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC `cmd /?` "" $0
Pop $hcli
nsDialogs::Show
FunctionEnd
Function leave
ExecDos::wait $hcli
FunctionEnd
Function MyFunction
Pop $2
; в эту переменную кидается по-отдельности каждая строка, которую конс. приложение выдаёт
; можешь пропустить и не добавлять данные в элемент (как ты хотел, можно заюзать IntOp+StrCmp, например обнуляя переменную IntOp через каждые 3 прохода)
; что-то типа такого...
;IntOp $R0 $R0 + 1
;StrCmp $R0 4 0 noAddString
;StrCpy $R0 0
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
#MessageBox MB_OK|MB_ICONINFORMATION "Добавляется строка:$\n$2"
; noAddString:
FunctionEnd
Section
SectionEnd
ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView : »
Да лааадно? Кто-то наконец-то открыл документацию к плагину? :o :up
А как бы это сделать на практике ? Например, отправить инфу в окно Edit »
Может, заглянешь там ещё в папку Examples? Ходят слухи, что там что-то интересное и ты будешь рад это увидеть :)
Я могу понять некоторых личностей, но чтобы ты ленился, MKN, стыдно должно быть :(
Там же в примерах всё есть, ну не сложно же открыть этот чертов ToWindow.nsi, который лежит в архиве с плагином и посмотреть, как там всё устроено, ты же не первый день с NSIS работаешь...
В этих примерах я взял стандартный блокнот (закройте копии блокнота перед запуском скомпилированного скрипта, чтобы не записало куда попало), после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit)
!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"
OutFile "!TEST.exe"
Function .onInit
exec "notepad"
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0
ExecDos::exec /TOWINDOW "cmd /?" "" $1
quit
FunctionEnd
Section -post
SetAutoClose false
SectionEnd
!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"
OutFile "!TEST.exe"
Function .onInit
exec "notepad"
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0
GetFunctionAddress $0 MyFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC `cmd /?` "" $0
pop $0
ExecDos::wait $0
quit
FunctionEnd
Function MyFunction
Pop $2
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $1 ${EM_REPLACESEL} 0 "STR:$\r$\n$2"
FunctionEnd
Section -post
SetAutoClose false
SectionEnd
Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз. »
Хмм... А как же тогда понимать :
В разделе Обучение IO: »
и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO :)
Понятное дело, что
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions
Но этот вопрос надо сначала ещё тщательно изучить и переварить... Я с этими глистбоксами и виевирами вообще никогда не сталкивался...
Может, заглянешь там ещё в папку Examples? »
в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO ( ну не дело это, использовать дополнительные ini файлы)
В этих примерах я взял стандартный блокнот, после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit) »
Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS...
Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый? »
Почему упёртый... Пока не вижу в ListView достойной альтернативы (во всяком случае в данный момент для своей задачи. Может потом, когда припрёт, и оценю :) ) ... И код в примере из справочника велик, и опять - c IO...
А вот пример с /TOFUNC - интересный. Спасибо.
попробуй добавить в свой любимый ListBox горизонтальную прокрутку »
Это, как раз, давно придумано :
OutFile ListBox_H-Scroll.exe
!include nsDialogs.nsh
Var Dialog
Var ReleaseNotesText
Page custom MyPage
Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 13u 262u -13u ""
Pop $ReleaseNotesText
${NSD_LB_AddString} $ReleaseNotesText "A pretty loooooooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiing"
${NSD_LB_AddString} $ReleaseNotesText "A really long string that should be longer than the listbox that contains this message, so I can enable the horizontal scrollbar!"
SendMessage $ReleaseNotesText ${WM_GETFONT} 0 0 $R0
System::Call user32::GetDC(i$ReleaseNotesText)i.R1
System::Call gdi32::SelectObject(i$R1,i$R0)i.R0
System::Call *(i,i)i.r0
StrCpy $2 0
${NSD_LB_GetCount} $ReleaseNotesText $1
loop:
IntOp $1 $1 - 1
System::Call 'user32::SendMessage(i $ReleaseNotesText,i ${LB_GETTEXT},i $1,t.r3)'
StrLen $4 $3
System::Call 'gdi32::GetTextExtentPoint32(i $R1,t "$3",i $4,i $0)'
System::Call *$0(i.r4,i)
IntOp $4 $4 + 10 ;add a little padding
${IfThen} $4 > $2 ${|} StrCpy $2 $4 ${|}
IntCmp $1 0 "" "" loop
System::Free $0
System::Call gdi32::SelectObject(i$R1,i$R0)i
System::Call user32::ReleaseDC(i$ReleaseNotesText,i$R1)
SendMessage $ReleaseNotesText ${LB_SETHORIZONTALEXTENT} $2 0
nsDialogs::Show
FunctionEnd
Section
SectionEnd
Да. Громозда... Но зато без IO ! :)
Хмм... А как же тогда понимать : »
и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO »
Я же тебе ясно написал:
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента »
Если ты читаешь мои сообщения, пропуская строки - то уж извини, какой тогда смысл мне так подробно всё расписывать и тратить своё время, если ваши глаза только готовый код видят и не читают того, что я здесь пишу?
в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO »
Да какая разница, на чем пример построен, IO или nsDialogs? У плагина команда не меняется в зависимости от того, что мы используем, тебе нужно смотреть синтаксис команды и какие данные в неё подставляются:
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $R8 $0 1016
ExecDos::exec /TOWINDOW /TIMEOUT=6000 "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" $R8
Pop $R6 ; return value - process exit code or error or STILL_ACTIVE (0x103).
Здесь же прекрасно видно, что получают HWND элемента поиском окна и командой GetDlgItem, помещая результат в $R8 и далее эта переменная используется в команде с плагином...
Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS... »
Ты серьёзно? Ты посмотри на мой код внимательней и ещё скажи, из чего в принципе состоит графический интерфейс каждого приложения? Из множества элементов, не?
Для тебя будет открытием, если я скажу тебе, что та самая область в блокноте, в которой ты набираешь текст - это элемент Edit?
Возьми любой похожий софт типа программки "InqSoft Window Scanner", которая тебе на интерфейсе программы/инсталлятора покажет, какие в интерфейсе типы элементов и каковы их стили
А по какому принципу, ты думаешь, работает мой код? Именно по тому, что сначала ищет окно конкретной программы (в моём случае блокнот), а затем уже ищет элемент Edit в этом самом родительском окне...Я же не мог тебе предоставить код, который бы искал не понятно где в системе элемент Edit и запихивал туда данные, ну а писать специально для этого пример на nsDialogs или IO с интерфейсом NSIS мне лень, честно говоря...кода меньше и наглядно всё видно, без лишних строк
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0
и опять - c IO... »
промолчу...всё выше написал
Это, как раз, давно придумано : »
какая жесть, не удивительно, что я не додумался до этого в то время... :lol:
K.A.V., Если ты читаешь мои сообщения, пропуская строки - то уж извини, какой тогда смысл мне так подробно всё расписывать »
Я внимательно читаю твои сообщения, откуда черпаю много полезного. Но ListBox и ListView, для меня совершенно новы и не знакомы... Ну не приходилось с ними ещё работать, потому и много вопросов и недоумений. :) И конечно понятное дело, что всё связанное с IO можно использовать и с nsDialogs. Только это надо сначала изучить и осознать, что требует времени, терпения и усидчивости... Со всем этим , как оказалось - проблемы... :) Но, не без твоей помощи, проблемы эти преодолеваются. А роль наставника и учителя требует терпения и снисходительности к ученикам. :) Этих качеств , как мне кажется, многие пользователи NSIS темы и тебе желают. :)
PS После адаптации примера с консолью из справочника под nsDialogs, получаю при компиляции :
!verbose: Invalid verbose level
Error in macro __NSD_LV_InsertColumn_Call on macroline 2
т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1"
Такую же ошибку получаю и при компиляции примера из http://nsis.sourceforge.net/Header_file_for_Listview
Может CommCtrl.nsh не дружит с NSIS3 ? (2.46 нет под рукой)
ps2 Да, не дружит... Проверил на 2.46 - всё нормально компилится с примером из http://nsis.sourceforge.net/Header_file_for_Listview
Адаптированный пример из справочника, рисует только пустой Listview... Видать что то не доадаптировал... Ну да то ладно... Что делать с CommCtrl.nsh в NSIS3 ?
Может можно вообще отказаться от CommCtrl.nsh ? Там всего то не большой кусок кода используется. Состряпать макрос из него...
Что делать с CommCtrl.nsh в NSIS3 ? »
Всё отлично там работает, не надо тут панику разводить)
т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1" »
Заставить тебя ещё раз мои сообщения прочитать? :)
Вот ты говоришь о терпении учителя, да какой тут, когда ты пишешь, как нужно сделать, а человек делает по-своему...
2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение »
CommCtrl.nsh ессно у меня есть и находится где положено : \NSIS\Include\CommCtrl.nsh
ps Да, у меня оказалась другая версия CommCtrl.nsh, которой всегда пользовался и всё всегда работало... Заменил на ту , что в справочнике, ошибка пропала.
Откуда интересно этот файл взят ? Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawiki/images/6/6a/ListView.zip
как на многих ресурсах и рекомендуется , то с NSIS 3 получит ошибку... Кто бы мог подумать...
Откуда интересно этот файл взят ? »
Мне его kotkovets подарил... :biggrin: с этого события и началась разработка нового интерфейса SFX Creator...
Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawik...a/ListView.zip »
А какое нам дело до тех пользователей, которые не читают наш справочник?))
как на многих ресурсах и рекомендуется »
Ну...Мы же - не многие :tongue:
K.A.V.,
Глянул ваш пример по прогрессу, работает, хотя до конца не все оттестировал еще, но есть один мелкий графический баг, см. ,вложение.
Как его побороть без ковыряния в ресурсах Нсис?! http://worldofplayers.ru/images/smilies/bw.gif
И дополнительно хотелось бы:
- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках..
- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар?
- при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера.
Спасибо..
но есть один мелкий графический баг, см. ,вложение. »
У вас есть, у меня нет :)
Как его побороть без ковыряния в ресурсах Нсис?! »
Зачем в ресурсы то лезть, просто команду подкорректируйте, размеры прогресса...
- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках.. »
Есть такая штука, как MSDN, например, там есть подробное описание всех WinAPI функций, какие параметры передаются, какой тип данных должен быть, какие вообще могут применяться команды к интересующему вас элементу управления.
Для создания элемента мы используем команду CreateWindowEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx), описание на русском, например, можно посмотреть здесь (http://www.firststeps.ru/mfc/winapi/win/r.php?58), гуглится всё достаточно легко
Из описания команды, думаю, вам всё станет более-менее ясно, какие параметры за что отвечают
System::Call 'user32::CreateWindowEx(i0,t"msctls_progress32",t"",i${WS_CHILD}|${WS_VISIBLE},i5,i120,i520,i20,i$R0,i6666,i0,i0) i.R2'
HWND WINAPI CreateWindowEx(
_In_ DWORD dwExStyle,
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int x,
_In_ int y,
_In_ int nWidth,
_In_ int nHeight,
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam
);
5 - позиция по горизонтали
120 - позиция по вертикали
520 - ширина
20 - высота
- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар ? »
С этим я вряд ли что-то подскажу, если у dll есть возможность отрабатывать с callback функцией, то сможете такое сделать, если нет - увы, маловероятно
Следует учесть тот факт, что у нас нет ни доков к этой dll, ни исходника...Так что в таком случае, можете только сидеть и методом тыка что-то пробовать, может чего и получится :)
Вы же видите, что при начале распаковки файла из архива - dll показывает инфу в основном прогрессе + отображает текстовую информацию над прогрессом, эта dll была специально запилена под NSIS, сомневаюсь, что разрабы писали её как универсальное средство, как пишут плагины для NSIS...
при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера. »
Команда ShowWindow вам в помощь, описание есть в справочнике
K.A.V.,
Вчера я говорил, что "адаптированный" под nsDialogs пример "Считываем данные из консольного приложения в ListView" из справочника - не работает : получаю чистый ListView.
( чтобы никого не злить - у меня не работает... :) )
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" .
Но достаточно добавить ${NSD_LV_InsertColumn} $ListView 0 450 "column 0" - и сразу всё работает. ( Не понятно, почему так получается, что обязательно нужно определить конкретный столбец и почему LVS_NOCOLUMNHEADER у меня игнорируется... )
Вот упрощённый код для этой ситуации :
!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"
Page custom MyDialog ""
!insertmacro MUI_LANGUAGE "Russian"
Caption "Получение информации из консольного приложения"
OutFile "NOCOLUMNHEADER-Test.exe"
Var dlg
Var /global ListView
Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" # не работает
${NSD_LV_InsertColumn} $ListView 0 450 "column 0" # работает
call getSystemInfo
nsDialogs::Show
FunctionEnd
Function getSystemInfo
${NSD_LV_InsertItem} $ListView "0" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbb"
SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
FunctionEnd
Section
SectionEnd
Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... :) Почему вдруг ?
ps Действительно можно обойтись и без CommCtrl.nsh, закинув из него в скрипт только нужные макросы... ( Но это, наверное, не тот случай, когда нужно экономить... )
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" »
Конечно буду, т.к. этот стиль не влияет на функционал, этот стиль всего-лишь убирает отображение колонок
Здесь проблема в другом, как я выяснил только что, всё дело в том, что в nsDialogs создание ListView происходит не так, как в IO, такое ощущение, что nsDialogs создаёт совсем голый элемент, и для того, чтобы "всё заработало", необходимо вручную дописать команду на вставку колонки, пусть даже и "невидимой"
Т.е. после создания элемента тебе нужно дописывать команду на вставку колонки:
${NSD_LV_InsertColumn} $ListView 0 450 ""
В IO таких телодвижений не требуется, там элемент создаётся сразу в "рабочем состоянии"
!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"
Page custom MyDialog
!insertmacro MUI_LANGUAGE "Russian"
OutFile "NOCOLUMNHEADER-Test.exe"
Var dlg
Var /global ListView
Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}"
${NSD_LV_InsertColumn} $ListView 0 450 ""
call getSystemInfo
nsDialogs::Show
FunctionEnd
Section
SectionEnd
Function getSystemInfo
Push "ExecDos::End" # Add a marker for the loop to test for.
ExecDos::exec /NOUNLOAD /TOSTACK "systeminfo" "" ""
Pop $0 # return value
StrCmp $0 0 0 Failed
## Loop through stack.
Loop:
Pop $1
StrCmp $1 "ExecDos::End" ExitLoop
System::Call "user32::OemToChar(tr1, t.r1)"
# SendMessage $R2 ${WM_SETTEXT} "0" "STR:$1"
SendMessage $ListView ${LVM_GETITEMCOUNT} "" "" $R1
${NSD_LV_InsertItem} $ListView "0" "$1"
SendMessage $ListView ${LVM_ENSUREVISIBLE} $R1 1
SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
Goto Loop
ExitLoop:
Return # Exit Function / Section
Failed:
MessageBox MB_OK "Exit code $0"
Return # Exit Function / Section
FunctionEnd
Section -post
SetAutoClose false
SectionEnd
опять панику разводишь, не работает у него ничего :biggrin:
Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... Почему вдруг ?
Без понятия, что у тебя там с кодировками :) Я вот недавно пересел с 32 бита на 64, теперь тоже мучаюсь с кодировками, из NIS Edit всё в иероглифах, нужно открывать через другой текстовик, чтобы скопировать текст с родным языком...
опять панику разводишь, не работает у него ничего »
Но ведь действительно - не работает, ты ведь сам убедился :) , пока не добавишь ${NSD_LV_InsertColumn}, что я сразу и сделал.
И никакой паники - просто информирую пользователей, ( чтобы у них не было паники, когда пример не заработает, т.е. у тех, кто не захочет связываться с допотопным IO :) )
Без понятия, что у тебя там с кодировками »
Вот и я без понятия. Все рекомендации для такого случая вроде как выполнил...
ps И к слову сказать, ты напрасно называешь, якобы вытянутый из тебя, :) код - "всё готовенькое" :) Это самый что ни на есть настоящий и наглядный - пример, логически вытекающий из имеющегося описания в справочнике и вопросов-обсуждений на форуме. Это ведь - общепринятая форма обучения и закрепления любого материала. Именно по конкретному коду легче всего понимать предмет изучения. ( Жаль, что в справочнике таких примеров, мало или они вообще отсутствуют (может тогда и не было бы лишних вопросов))...
Kopejkin
12-02-2015, 18:38
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT].
http://savepic.su/4989876.png
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: число 1 в строке, следующей за [SearchPOT] »
А это что файл или чего такое ?!
Kopejkin
12-02-2015, 19:19
А это что »
Это обычный текстовый файл.
Так содержимое выглядит в Notepad+, если включить отображение всех символов.
http://savepic.su/5000129.png
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC