Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Это обычный текстовый файл. »
Понятно, читай тогда справку в части:
[Примеры кодов] → [Работа со строками] » Замена строки в текстовом файле.
либо:
» Замена фразы в текстовом файле
Здесь можно подсмотреть пример по поиску строки по её номеру...
Kopejkin
12-02-2015, 23:42
..пример по поиску строки по её номеру. »
Что-то не нашел именно этого примера. Номер текущей строки, насколько я понял, используется для последовательного перебора строк в диапазоне всего их количества.
Если я правильно читаю, то в примере "Замена фразы в текстовом файле" можно заменить все вхождения или только первое. А мне нужно заменить, например, только 5-е вхождение (текст, число), находящееся в 28-й строке.
А может я ничего и не понял...
Что-то не нашел именно этого примера. Номер текущей строки, насколько я понял, используется для последовательного перебора строк в диапазоне всего их количества. »
Можно такой еще вариант попробовать, из описание справки оригинала:
E.2 Text Functions Header
E.2.1 Introduction
Include header:
!include "TextFunc.nsh"
Call functions:
Section Install
${LineRead} "C:\a.log" "-1" $R0
; $R0="Last line$\r$\n"
SectionEnd
Section un.Install
${TrimNewLines} "Last line$\r$\n" $R0
; $R0="Last line"
SectionEnd
E.2.2 LineFind
Find specified lines in text file, and edit or view these lines in callback function.
Syntax:
${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"
"[File1]" ; Input text file
;
"[File2|/NUL]" ; [File2]
; Output text file
; If empty then File2=File1
; [/NUL]
; No output text file (only read File1)
;
"[LineNumbers]" ; [No|-No|No:No|{No}|{-No}|{No:No}]
; 1:-1 all lines to change (default)
; 2 second line from start
; -3 third line from end
; 5:9 range of lines from 5 to 9
; {2} only second line from start to output
; {-3} only third line from end to output
; {5:9} only range of lines from 5 to 9 to output
;
"Function" ; Callback function for specified lines
Function "Function"
; $R9 current line
; $R8 current line number
; $R7 current line negative number
; $R6 current range of lines
; $R5 handle of a file opened to read
; $R4 handle of a file opened to write ($R4="" if "/NUL")
; you can use any string functions
; $R0-$R3 are not used (save data in them).
; ...
Push $var ; If $var="StopLineFind" Then exit from function
; If $var="SkipWrite" Then skip current line (ignored if "/NUL")
FunctionEnd
Note:
- Error flag if input file doesn't exist
- Error flag if output file path doesn't exist
- Ranges must be specified on growth (2 4:5 9:-8 -5:-4 -2:-1)
- Output file will not be updated if no changes made.
Example1 (delete first two symbols):
Section
${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Example1"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example1
${TrimNewLines} '$R9' $R9
StrCpy $R9 $R9 '' 2
StrCpy $R9 '$R9$\r$\n'
;start from 3 line and delete first two symbols
Push $0
FunctionEnd
Example2 (show changed lines):
Section
${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Example2"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example2
${TrimNewLines} '$R9' $R9
StrCpy $R9 "$R9 ~Changed line ($R8)~$\r$\n"
Push $0
FunctionEnd
Example3 (delete lines):
Section
${LineFind} "C:\a.log" "\logs\a.log" "2:3 10:-5 -3:-2" "Example3"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example3
StrCpy $0 SkipWrite
Push $0
FunctionEnd
Example4 (insert lines):
Section
${LineFind} "C:\a.log" "" "10" "Example4
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example4
FileWrite $R4 "---First Line---$\r$\n"
FileWrite $R4 "---Second Line ...---$\r$\n"
Push $0
FunctionEnd
Example5 (replace in file with count of changes - "WordFunc.nsh" required):
!include "WordFunc.nsh"
Section
StrCpy $R0 0
${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Example5"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
MessageBox MB_OK "Changed lines=$R0"
SectionEnd
Function Example5
StrCpy $1 $R9
${WordReplace} '$R9' ' ' '_' '+*' $R9
StrCmp $1 $R9 +2
IntOp $R0 $R0 + 1
;$R0 count of changed lines
Push $0
FunctionEnd
Example6 (line string to cut or delete):
Section
${LineFind} "\a.log" "C:\logs\a.log" "" "Example6"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
MessageBox MB_OK "Processed lines=$R1:$R2"
SectionEnd
Function Example6
;(Cut lines from a line to another line (also including that line))
StrCmp $R0 finish stop
StrCmp $R0 start finish
StrCmp $R9 'Start Line$\r$\n' 0 skip
StrCpy $R0 start
StrCpy $R1 $R8
goto code
finish:
StrCmp $R9 'Finish Line$\r$\n' 0 code
StrCpy $R0 finish
StrCpy $R2 $R8
goto code
skip:
StrCpy $0 SkipWrite
goto output
stop:
StrCpy $0 StopLineFind
goto output
;;(Delete lines from a line to another line (also including that line))
; StrCmp $R0 finish code
; StrCmp $R0 start finish
; StrCmp $R9 'Start Line$\r$\n' 0 code
; StrCpy $R0 start
; StrCpy $R1 $R8
; goto skip
; finish:
; StrCmp $R9 'Finish Line$\r$\n' 0 skip
; StrCpy $R0 finish
; StrCpy $R2 $R8
; skip:
; StrCpy $0 SkipWrite
; goto output
code:
;...
output:
Push $0
FunctionEnd
Example7 (read lines):
Section
${LineFind} "C:\a.log" "/NUL" "1:-1" "Example7"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example7
MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#" =[$R8]' IDOK +2
StrCpy $0 StopLineFind
Push $0
FunctionEnd
E.2.3 LineRead
Get line in file specified with number.
Syntax:
${LineRead} "[File]" "[LineNumber]" $var
"[File]" ; Input text file
;
"[LineNumber]" ; [No|-No]
; 3 line number from start
; -5 line number from end
;
$var ; Result: Line
Note:
- Error flag if input file doesn't exist
- Error flag if line number not found
Example:
Section
${LineRead} "C:\a.log" "-1" $R0
; $R0="Last line$\r$\n"
SectionEnd
E.2.4 FileReadFromEnd
Read text file from end line by line.
Syntax:
${FileReadFromEnd} "[File]" "Function"
"[File]" ; Input text file
"Function" ; Callback function
Function "Function"
; $9 current line
; $8 current line number
; $7 current line negative number
; $R0-$R9 are not used (save data in them).
; ...
Push $var ; If $var="StopFileReadFromEnd" Then exit from function
FunctionEnd
Note:
- Error flag if input file doesn't exist
Example1:
Section
${FileReadFromEnd} "C:\a.log" "Example1"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example1
MessageBox MB_OKCANCEL '"Line"=[$9]$\n "#"=[$8]$\n "-#"=[$7]' IDOK +2
StrCpy $0 StopFileReadFromEnd
Push $0
FunctionEnd
Example2 (Reverse text file):
Section
GetTempFileName $R0
FileOpen $R1 $R0 w
${FileReadFromEnd} "C:\a.log" "Example2"
FileClose $R1
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
Exec '"notepad.exe" "$R0"'
SectionEnd
Function Example2
StrCmp $7 -1 0 +5
StrCpy $1 $9 1 -1
StrCmp $1 '$\n' +3
StrCmp $1 '$\r' +2
StrCpy $9 '$9$\r$\n'
FileWrite $R1 "$9"
Push $0
FunctionEnd
E.2.5 LineSum
Get sum of lines in text file.
Syntax:
${LineSum} "[File]" $var
"[File]" ; Input file
$var ; Result: Sum of lines
Note:
- Error flag if input file doesn't exist
Example:
Section
${LineSum} "C:\a.log" $R0
; $R0="54"
SectionEnd
E.2.6 FileJoin
Join two files in one (File1 + File2 = File3).
Syntax:
${FileJoin} "[File1]" "[File2]" "[File3]"
"[File1]" ; Input File1
"[File2]" ; Input File2
"[File3]" ; Output File3
; If [File3]="" Then add [File2] to [File1]
Note:
- Error flag if input files don't exist
- Error flag if output file path doesn't exist
Example1 (Join: a.log + b.log = Z.log):
Section
${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log"
SectionEnd
Example2 (Add: a.log + b.log = a.log):
Section
${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log"
SectionEnd
E.2.7 TextCompare
Compare two text files.
Syntax:
${TextCompare} "[File1]" "[File2]" "[Option]" "Function"
"[File1]" ; File1 Compare these lines
"[File2]" ; File2 Compare with these lines
"[Options]" ; (line-by-line):
; FastDiff Compare line N (File1) with line N (File2)
; Call function if Different lines found
; FastEqual Compare line N (File1) with line N (File2)
; Call function if Equal lines found
; (line number independent):
; SlowDiff Compare line N (File1) with all lines (File2)
; Call function if line N (File1) Different
; SlowEqual Compare line N (File1) with all lines (File2)
; Call function if line N (File1) Equal
"Function" ; Callback function
Function "Function"
; $9 "Line File1"
; $8 "Line number"
; $7 "Line File2" (empty if SlowDiff)
; $6 "Line number" (empty if SlowDiff)
; $R0-$R9 are not used (save data in them).
; ...
Push $var ; If $var="StopTextCompare" Then exit from function
FunctionEnd
Note:
- Error flag if File1 or File2 doesn't exist
- Error flag if syntax error
Example (Different or Equal):
Section
StrCpy $R0 ''
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +4
StrCmp $R0 NotEqual 0 +2
MessageBox MB_OK "Files differ" IDOK +2
MessageBox MB_OK "Files identical"
SectionEnd
Function Example1
StrCpy $R0 NotEqual
StrCpy $0 StopTextCompare
Push $0
FunctionEnd
Example (Compare line-by-line - Different):
Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'
GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "FastDiff" "Example2"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
Exec "notepad.exe $R2"
FunctionEnd
Function Example2
FileWrite $R3 '$8=$9'
FileWrite $R3 '$6=$7$\r$\n'
Push $0
FunctionEnd
Example (Compare line-by-line - Equal):
Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'
GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "FastEqual" "Example3"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
Exec "notepad.exe $R2"
FunctionEnd
Function Example3
FileWrite $R3 '$8|$6=$9'
Push $0
FunctionEnd
Example (Compare all lines - Different):
Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'
GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "SlowDiff" "Example4"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK end
FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n"
${TextCompare} "$R1" "$R0" "SlowDiff" "Example4"
FileClose $R3
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK end
Exec "notepad.exe $R2"
end:
FunctionEnd
Function Example4
FileWrite $R3 '$8=$9'
Push $0
FunctionEnd
Example (Compare all lines - Equal):
Section
StrCpy $R0 'Text1.txt'
StrCpy $R1 'Text2.txt'
GetTempFileName $R2
FileOpen $R3 $R2 w
FileWrite $R3 "$R0 | $R1$\r$\n"
${TextCompare} "$R0" "$R1" "SlowEqual" "Example5"
IfErrors 0 +2
MessageBox MB_OK "Error" IDOK +2
Exec "notepad.exe $R2"
FunctionEnd
Function Example5
FileWrite $R3 '$8|$6=$9'
Push $0
FunctionEnd
Example (Show variables):
Section
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd
Function Example6
MessageBox MB_OKCANCEL '$$9 "Line File1" =[$9]$\n$$8 "Line #" =[$8]$\n$$7 "Line File2" =[$7]$\n$$6 "Line #" =[$6]' IDOK +2
StrCpy $0 StopTextCompare
Push $0
FunctionEnd
E.2.8 TextCompareS
Same as TextCompare, but case sensitive.
E.2.9 ConfigRead
Read value from entry name in config file.
Syntax:
${ConfigRead} "[File]" "[Entry]" $var
"[File]" ; config file
;
"[Entry]" ; entry name
;
$var ; Result: Value
Note:
- Error flag if entry not found
- Error flag if file doesn't exist
Example1:
Section
${ConfigRead} "C:\AUTOEXEC.BAT" "SET winbootdir=" $R0
;$R0=C:\WINDOWS
SectionEnd
Example2:
Section
${ConfigRead} "C:\apache\conf\httpd.conf" "Timeout " $R0
;$R0=30
SectionEnd
E.2.10 ConfigReadS
Same as ConfigRead, but case sensitive.
E.2.11 ConfigWrite
Write value from entry name in config file.
Syntax:
${ConfigWrite} "[File]" "[Entry]" "[Value]" $var
"[File]" ; config file
;
"[Entry]" ; entry name
;
"[Value]" ; value name
; if "" then delete Entry
;
$var ; Result:
; $var=CHANGED Value is written
; $var=DELETED Entry is deleted
; $var=ADDED Entry and Value are added
; $var=SAME Entry and Value already exist
Note:
- Error flag if file doesn't exist
- Error flag if file can't be opened
Example1:
Section
${ConfigWrite} "C:\AUTOEXEC.BAT" "SET winbootdir=" "D:\WINDOWS" $R0
;$R0=CHANGED
SectionEnd
Example2:
Section
${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "30" $R0
;$R0=SAME
SectionEnd
Example3:
Section
${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "" $R0
;$R0=DELETED
SectionEnd
E.2.12 ConfigWriteS
Same as ConfigWrite, but case sensitive.
E.2.13 FileRecode
Recode text file from DOS to Windows format and vice-versa.
Syntax:
${FileRecode} "[File]" "[Format]"
"[File]" ;
;
"[Format]" ; OemToChar -from DOS to Windows
; CharToOem -from Windows to DOS
Note:
- Error flag if file doesn't exist
- Error flag if syntax error
Example:
Section
${FileRecode} "C:\SCANDISK.LOG" "CharToOem"
SectionEnd
E.2.14 TrimNewLines
Trim newlines in a string.
Syntax:
${TrimNewLines} "[string]" $var
"[string]" ; Input string
$var ; Result: String without '$\r' and '$\n' at the end
Example:
Section
${TrimNewLines} "Text line$\r$\n" $R0
; $R0="Text line"
SectionEnd
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT]. »
Накидал небольшой по замене строки, синтакс:
${LineFind} "файл1" "файл2" "строка" "функция"
Добавь к своему проекту:
!include "TextFunc.nsh"
А далее как в примере:
XPstyle on
!include MUI2.nsh
Name "TestTXT"
OutFile TEST_Txt.exe
RequestExecutionLevel user
InstallDir "$EXEDIR\Test7z"
!insertmacro MUI_LANGUAGE English
!include "TextFunc.nsh"
Section "Test"
${LineFind} "$EXEDIR\MyText.txt" "" "9" "delines"
;IfErrors 0 +2
;MessageBox MB_OK "Error"
${LineFind} "$EXEDIR\MyText.txt" "" "9" "inlines"
;IfErrors 0 +2
;MessageBox MB_OK "Error"
SectionEnd
Function delines
StrCpy $0 SkipWrite
Push $0
FunctionEnd
Function inlines
FileWrite $R4 "Привет Kopejkin, это я, твоя изменённая строка.. :)$\n"
Push $0
FunctionEnd
Зы, Путь к файлу названия и прочее поменяешь сам на требуемое..
Kopejkin
13-02-2015, 03:34
...Накидал »
Спасибо, но это не то.
Как заменить уникальный (встречающийся 1 раз) текст я знаю - из примера в справочнике.
В моем же примере текст повторяется, т.е. уникален не текст, а номер строки.
Буду разбираться с примерами из ориг. справки
Спасибо, но это не то.
Как заменить уникальный (встречающийся 1 раз) текст я знаю - из примера в справочнике.
В моем же примере текст повторяется, т.е. уникален не текст, а номер строки.
Буду разбираться с примерами из ориг. справки »
Или я ничего не понял, или ты, одно из двух..
В своем вопросе ты писал:
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT]. »
Так вот, то что я написал в примере, как раз-таки цепляется к номеру строки, а само содержимое строки в данном случае не имеет значения..
Ну и вопросы до кучи, номер требуемой строки динамический что-ли?
Если да, то тут я хз, надо думать..
Или их несколько и везде надо менять? Если строки(а) статичны и неизменны в позициях, то смотри пример выше..
Зы, и скинь свой изменяемый текстовый файл, гляну что это такое...
Kopejkin
13-02-2015, 09:30
...или ты »
Да, это я тупанул. Спасибо еще раз!
Привет народ, :)
Пара вопросов специфичных имеется.
У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников?
И есть у кого желание поковыряться в нем и подлатать чуток, до нужной кондиции?
У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников? »
Есть у программистов такая негласная защита от дурака: в опубликованных исходниках делать несколько ошибок. Опытные сразу поймут что-к-чему (по сообщениям компилятора) и исправят. А начинающие, или неопытные будут говорить, что у них ничего не получается.
MaGoth, желающих разбираться в чужих исходниках вы вряд ли найдете. Если вам интересно, а тем более назрела такая необходимость, попробуйте сделать это сами, а потом результат своей плодотворной работы предложить нам. Поверьте, вам скажут спасибо. :up
У кого нибудь получилось скомпилить плагин Nsis7z_921 из представленных исходников? »
Сомневаюсь, что это вообще кому-то нужно было, а у вас не получилось скомпилировать? Там же вроде всё есть, и проект даже от Visual Studio...
Никого не хочу обидеть, но ещё я сомневаюсь, что хотя бы половина кодеров на NSIS из этой темы писали плагины для NSIS
И есть у кого желание поковыряться в нем и подлатать чуток, до нужной кондиции? »
А у вас, значит, нет желания поковыряться, чтобы реализовать нужный именно вам, функционал?))
Есть у программистов такая негласная защита от дурака: в опубликованных исходниках делать несколько ошибок. Опытные сразу поймут что-к-чему (по сообщениям компилятора) и исправят. А начинающие, или неопытные будут говорить, что у них ничего не получается. »
Нужно взять на заметку и потом примеры здесь такие выкладывать :biggrin: заодно будем учить NSIS-кодеров самостоятельно исправлять ошибки в коде. :up
Поверьте, вам скажут спасибо. »
У меня первая мысль, которая промелькнула - "Зачем?"
Есть у программистов такая негласная защита от дурака: в опубликованных исходниках делать несколько ошибок. Опытные сразу поймут что-к-чему (по сообщениям компилятора) и исправят. А начинающие, или неопытные будут говорить, что у них ничего не получается.»
Ух ты как интересно..
Может вы прокомментируете эту защиту от дурака ?!
1>------ Построение начато: проект: Nsis7z, Конфигурация: Debug Win32 ------
1> StdAfx.cpp
1> UserInputUtils.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\userinpututils.cpp(5): fatal error C1083: Не удается открыть файл включение: Common/StdInStream.h: No such file or directory
1> OpenCallbackConsole.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\opencallbackconsole.h(devil): fatal error C1083: Не удается открыть файл включение: Common/StdOutStream.h: No such file or directory
1> NSISBreak.cpp
1> MainAr.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\mainar.cpp(7): fatal error C1083: Не удается открыть файл включение: Windows/Error.h: No such file or directory
1> Main.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\main.cpp(5): fatal error C1083: Не удается открыть файл включение: Common/MyInitGuid.h: No such file or directory
1> ExtractCallbackConsole.cpp
1>c:\users\александр\desktop\7zip\ui\nsis\extractcallbackconsole.h(devil): fatal error C1083: Не удается открыть файл включение: Common/MyString.h: No such file or directory
1> WorkDir.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\WorkDir.cpp: No such file or directory
1> UpdateProduce.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateProduce.cpp: No such file or directory
1> UpdatePair.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdatePair.cpp: No such file or directory
1> UpdateCallback.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateCallback.cpp: No such file or directory
1> UpdateAction.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\UpdateAction.cpp: No such file or directory
1> Update.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\Update.cpp: No such file or directory
1> TempFiles.cpp
1>c1xx : fatal error C1083: Не удается открыть файл источник: ..\..\UI\Common\TempFiles.cpp: No such file or directory
...
Мы на-пару с одним человечком перелопатили все исходники плагинов для этой версии 7з, до которых смогли дотянуться, и везде болт. Эти идиоты, выложили сырцы, а на пол проекта компиляции файлов не положили... :angry2:
Вообще не понимаю, какой дебил так делает ?! Или выкладывай полностью, или не выкладывай вообще. И всё всем понятно будет..
MaGoth, желающих разбираться в чужих исходниках вы вряд ли найдете. Если вам интересно, а тем более назрела такая необходимость, попробуйте сделать это сами, а потом результат своей плодотворной работы предложить нам. Поверьте, вам скажут спасибо.
Да вот было желание поправить кое-чего, но видать теперь с этим мимо кассы..
K.A.V.
Пост ради поста ?!
Ибо ни грамму не понял из того что ты написал..
Может вы прокомментируете эту защиту от дурака ?! »
Эти идиоты, выложили сырцы, а на пол проекта компиляции файлов не положили...
Вообще не понимаю, какой дебил так делает ?! Или выкладывай полностью, или не выкладывай вообще. И всё всем понятно будет.. »
"дебил" в наше время тот, кто не читает инструкцию. Не буду переходить на личности, думаю намёк все поймут.
Вот вы взяли тут и оскорбили людей (я, конечно, понимаю, что этого они не узнают, но смотрится то со стороны как минимум не красиво и низко с вашей стороны), которые сделали плагин и выложили его для вас и, оскорбили вы их просто потому, что не умеете читать.
Мягко говоря странно вы себя ведёте, вам не кажется?
Пост ради поста ?! »
Я постоянно тут пишу просто так, ради количества сообщений, люблю это дело, видите, какое у меня несоответствие "полезняшек" с общим числом сообщений?
И смотрите, это моё очередное сообщение, которое вроде бы и с одной стороны указывает на причину вашей проблемы, но и с другой...
Пост ради поста ?! »
Может вы прокомментируете эту защиту от дурака ?! »
А что здесь может быть непонятно? Компилятор вам на русском языке пишет:
Не удается открыть файл источник
и далее указывает конкретный файл, который ему не удалось найти. Ну и... дальше что?
Если вы выполните все рекомендации автора плагина, которые он старательно изложил в сопровождающем документе (nsis7z.txt), то файл компилируется без проблем.
K.A.V.,
Подскажи пожалуйста, как в твоём примере, вывести строки в ListBox - с 1ой по 4ую включительно ? (как вывести только 4ую- понятно, как вывести с 4 ой и далее- понятно. с выводом с 1ой по 4 ую - что то не заладилось...)
OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave
Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 20 100% 100u ""
Pop $ListBox
SendMessage $ListBox ${LB_SETHORIZONTALEXTENT} 2000 0 ; 2000 - количество пикселей, на которое список может прокручиваться.
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
; вывести только 4ую строку
;IntOp $R0 $R0 + 1
;StrCmp $R0 4 0 noAddString
; вывести всё , начиная с 4ой строки
IntOp $R0 $R0 + 1
StrCmp $R0 4 0 noAddString
StrCpy $R0 3
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
noAddString:
FunctionEnd
Section
SectionEnd
ps HSCROLL можно сделать гораздо проще, не заморачиваясь с учётом размера шрифта, как в вышеприводимой громозде из кода...
вывести строки в ListBox - с 1ой по 4ую включительно ? »
Ну диапазон же...IntCmp...
OutFile ListBoxHSCROLL_ExecDosTOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave
Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 20 100% 100u ""
Pop $ListBox
SendMessage $ListBox ${LB_SETHORIZONTALEXTENT} 2000 0 ; 2000 - количество пикселей, на которое список может прокручиваться.
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 $R0 $R0 + 1
IntCmp $R0 4 0 0 noAddString
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
noAddString:
FunctionEnd
Section
SectionEnd
IntCmp »
Напрочь из головы вылетело... :search:
Когда то kotkovets, предлагал код, как убрать заголовок окна :
!include MUI2.nsh
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "Example.exe"
!define WS_CAPTION 0x00C00000
!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
Push `${CONTROL}`
Push `${EXSTYLE}`
System::Store SR1R0
IntOp $R1 $R1 ~
System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
IntOp $R2 $R1 & $R2
System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
System::Store L
!macroend
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
FunctionEnd
Section
SectionEnd
А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта )
пробовал добавлять "рамочные" стили WS_BORDER »
без эффекта »
А как пробовал то?
Если делать так, то всё прекрасно работает:
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.s"
System::Int64Op "0x00400000L" |
System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},is)"
FunctionEnd
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.s"
System::Int64Op "0x00800000L" |
System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},is)"
FunctionEnd
"рамочные" стили »
WS_THICKFRAME »
WS_THICKFRAME - не рамочный стиль, да, он создаёт рамку окна при удаленном WS_CAPTION, но при этом ещё и добавляет возможность изменять границы окна, это не то, что тебе нужно
Если делать так, то всё прекрасно работает: »
Не работает. Заголовок окна - остаётся (но таскать за себя не позволяет). Задача ведь сделать обрамление рамкой обезглавленного окна .
Да и исходный код странно работает... Компилишь-запускаешь - нет заголовка. Вроде то , что надо... Пооткрывал окна других приложений (я открываю-сворачиваю окно тотала) - вдруг у обезглавленного окна, появляется заголовок (хотя таскать за себя не позволяет)... Ерунда какая то... Проверяю на W7x32
Так тоже не работает?
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.r0"
System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},i$0|0x00400000)"
FunctionEnd
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
System::Call "user32::GetWindowLong(i$HWNDPARENT,i${GWL_STYLE})i.r0"
System::Call "user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},i$0|0x00800000)"
FunctionEnd
На W7x64 и W8x32 работает, а вот на WinXP нет
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC