Afrow UK
8th July 2003 18:47 UTC
Can System do this?
It would be handy if I could DetailPrint 4 lines of text for current status, and then if something fails, then I want to be able to remove just those 4 lines, but not the rest of the text from the log window, and print the status once again (4 lines).
Is this possible?
-Stu
ramon18
8th July 2003 23:42 UTC
Hi,
You can use this two functions to accomplish this task;
Ofcourse this functions only have effect while inside sections.
######################################
>!define LVM_GETITEMCOUNT 0x1004
>!define LVM_DELETEITEM 0x1008
>######################################
>; This function delete one element from the details view
>; Push the index of the elemnet to delete before call
>Function DeleteDetailViewItem
exch$0
push$1
FindWindow$1 "#32770" "" $HWNDPARENT
GetDlgItem$1 $1 0x3F8 ; This is the Control ID of the details view
SendMessage$1 ${LVM_DELETEITEM} $0 0
pop$1
pop$0
FunctionEnd
>; This function get the count of entries from the details view
>; You must Pop the result value after call
>Function GetDetailViewItemCount
push$1
FindWindow$1 "#32770" "" $HWNDPARENT
GetDlgItem$1 $1 0x3F8 ; This is the Control ID of the details view
SendMessage$1 ${LVM_GETITEMCOUNT} 0 0 $1
exch$1
FunctionEnd
>
Usage example:
Section Dummy
DetailPrint "Copying file A..."
StrCpy $0 "success!"
MessageBox MB_YESNO "Generate copy errors?" IDNO +2
StrCpy$0 "failure!"
push $0 ; save
call GetDetailViewItemCount
pop$0
intop$0 $0 - 1 ; decrement to delete last entry
push$0
call DeleteDetailViewItem
pop$0 ; restore
DetailPrint "Copying file A...$0"
>SectionEnd
>
As you can see, you can use this functions to delete any entry(ies) you want :)
Hope this help,good luck
Ramon
Afrow UK
9th July 2003 18:59 UTC
If this is not already on the archive, may I add it?
-Stu
Afrow UK
9th July 2003 19:02 UTC
This is what I want to do
Will this work?
Section Dummy
DetailPrint "This line stays!"
DetailPrint "line 1"
DetailPrint "line 2"
DetailPrint "line 3"
DetailPrint "line 4"
Call GetDetailViewItemCount
Pop $0
Push $0
Call DeleteDetailViewItem
IntOp $0 $0 - 1
Push $0
Call DeleteDetailViewItem
IntOp $0 $0 - 1
Push $0
Call DeleteDetailViewItem
IntOp $0 $0 - 1
Push $0
Call DeleteDetailViewItem
SectionEnd
ramon18
10th July 2003 09:57 UTC
No it won't work, because you don't decrement the value returned by GetDetailViewItemCount, ie:
Suppose you have 3 items on details view:
"Line 1" -> Index is 0
"Line 2" -> Index is 1
"Line 3" -> Index is 2
But GetDetailViewItemCount returns 3, if you want to delete last entry you must decrement the returned value to get 2, witch is the correct index to "Line 3", you see?
I can change the function "DeleteDetailViewItem" so the input param is not ZERO based, if you want?
btw, use this macros to accomplish what you need:
!macro DELETE_LAST_ENTRY
push $0
Call GetDetailViewItemCount
Pop $0
IntOp $0 $0 - 1 ; decrement to get the right index of last entry
Push $0
Call DeleteDetailViewItem
pop $0
!macroend
then in your dummy section:
DetailPrint "This line stays!"
DetailPrint "line 1"
DetailPrint "line 2"
DetailPrint "line 3"
DetailPrint "line 4"
!insertmacro DELETE_LAST_ENTRY ;delete "line 4"
!insertmacro DELETE_LAST_ENTRY ;delete "line 3"
!insertmacro DELETE_LAST_ENTRY ;delete "line 2"
!insertmacro DELETE_LAST_ENTRY ;delete "line 1"
PS: if you want to add it to the archive, feel free to add it, sorry I have no time now
good luck,
Ramon
Afrow UK
10th July 2003 20:23 UTC
I put up this page with 2 new functions on it.
One deletes lines from the end of the log window, and the other deletes lines from the top.
http://nsis.sourceforge.net/archive/...50&instances=0
Works great too!
-Stu