Voici un code de Danilo publié sur le forum anglais (j'ai gardé le code) et que je viens de modifier pour la 3.90 (AllocateMemory etc)
Code : Tout sélectionner
;>--------------------------------------------------------
;>--------------------------------------------------------
;
; Pure HexView, by Danilo, 22.01.2003
;
; Thanks go to 'PB' and 'horst' for
; ideas and hints!
;
DisableDebugger ; !!
;
;- Structures
;
; Structure BYTE
; b.b
; EndStructure
;
;
;- Global variables - arrays - linked lists
;
Dim AsciiChars.b(255)
For a = 0 To 255 : AsciiChars(a) = '.' : Next a
For a = 32 To 127 : AsciiChars(a) = a : Next a
Dim HexChars.b(16)
PokeS(HexChars(),"0123456789ABCDEF")
;
;- Procedures
;
Procedure AskForEnd()
If MessageRequester("Exit","Really exit 'Pure HexView' ?",#MB_YESNO|#MB_ICONQUESTION) = #IDYES
End
EndIf
EndProcedure
; Procedure MOD(a,b)
; ProcedureReturn a-a/b*b
; EndProcedure
Procedure FillListViewHex(*mem.BYTE,size)
;
; Fill Listview with hex values
; argument 1: memory-pointer for data
; argument 2: size of this memory area
;
;Delay(1)
StartTime = TimeGetTime_()
SendMessage_(GadgetID(1),#WM_SETREDRAW, #FALSE, 0)
A$ = Space(16*4)
PokeB(@A$+16*3,'|')
For a = 1 To size/16
*Text.Byte = @A$
*RealText.Byte = @A$+16*3+2
For b = 1 To 16
*Text\b = HexChars((*mem\b & $FF) >> 4);*offset\b ;PeekB(@HEX$ + offset)
*Text+1
*Text\b = HexChars((*mem\b & $F));*offset\b ;PeekB(@HEX$ + offset)
*Text+2
*RealText\b = AsciiChars(*mem\b & $FF)
*RealText+1
*mem + 1
Next b
AddGadgetItem(1,-1,A$)
Next a
b = MOD(size,16)
If b
A$ = Space(16*4)
PokeB(@A$+16*3,'|')
*Text.Byte = @A$
*RealText.BYTE = @A$+16*3+2
For a = 1 To b
*Text\b = HexChars((*mem\b & $FF) >> 4)
*Text+1
*Text\b = HexChars((*mem\b & $F))
*Text+2
*RealText\b = AsciiChars(*mem\b & $FF)
*RealText+1
*mem + 1
Next a
AddGadgetItem(1,-1,A$)
EndIf
SendMessage_(GadgetID(1),#WM_SETREDRAW, #True, 0)
EndTime = TimeGetTime_() - StartTime
;MessageRequester("INFO","Filled ListViewGadget with "+StrU(size,2)+" HEX values in "+StrU(EndTime,2)+" ms",0)
SetGadgetText(3,StrU(size,2)+" bytes - "+StrU(size/16+b,2)+" lines generated in "+StrU(EndTime,2)+" ms")
EndProcedure
Procedure LoadFileInListView()
File$ = OpenFileRequester("Load File","","All Files | *.*",0)
If File$
If ReadFile(1,File$)
size = Lof()
If size > 200*1024
If MessageRequester("Warning","Really load BIG file "+GetFilePart(File$)+" ("+StrU(size,2)+" bytes) ??"+Chr(13)+"This can take much time!",#MB_ICONWARNING|#MB_YESNO) = #IDNO
CloseFile(1)
ProcedureReturn
EndIf
EndIf
mem = AllocateMemory(size)
If mem = 0
MessageRequester("ERROR","Cant allocate "+StrU(size,2)+" bytes of memory!",#MB_ICONERROR)
CloseFile(1)
ProcedureReturn
EndIf
ReadData(mem,size)
CloseFile(1)
ClearGadgetItemList(1)
SetGadgetText(3,"File "+GetFilePart(File$)+" loaded ... generating HexView")
While WindowEvent():Wend
FillListViewHex(mem,size)
FreeMemory(1)
Else
MessageRequester("ERROR","Cant read file!",#MB_ICONERROR)
EndIf
EndIf
EndProcedure
;
;- App START
;
OpenWindow(1,0,0,760,520,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Pure HexView")
hFont = LoadFont(1,"Lucida Console",14)
CreateGadgetList(WindowID())
ListViewGadget(1,0,0,760,500): SendMessage_(GadgetID(1),#WM_SETFONT,hFont,1)
ButtonGadget(2,640,501,120,20,"Load File in ListView")
SetGadgetFont(2, hFont)
TextGadget(3,0,501,640,20,"",#PB_Text_Center)
While WindowEvent():Wend
; produce 32k random data memory for speed testing :)
mem_data_size = 32*1024
*mem_data.BYTE = AllocateMemory(mem_data_size)
*mem.BYTE = *mem_data
For a = 1 To mem_data_size
*mem\b = Random($FF)
*mem + 1
Next a
PokeS(*mem_data,"HexViewer for PB")
For a = 0 To 255 : PokeB(*mem_data+16+a,a) : Next a
PokeS(*mem_data+mem_data_size-12,"__The End__")
; Fill ListViewGadget with random data
FillListViewHex(*mem_data,mem_data_size)
; Free random data memory
FreeMemory(1)
;
;- App message loop
;
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : AskForEnd()
Case #PB_Event_Gadget
Select EventGadgetID()
Case 2 : LoadFileInListView()
EndSelect
EndSelect
ForEver
;
;- App END