Suche einen Memory Hex Editor

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Suche einen Memory Hex Editor

Beitrag von Dristar »

Hallo Zusammen ,

Ich suche für PureBasic 4.51 32bit unter Linux einen Memory Hex Editor. Ich habe mir zwar den AdvancedHexEditor.pb V0.9 von ShadowTurtle so angepasst das er unter Ubuntu 10.04 läuft ,
aber wenn ich auf die ScrollBar gehe ist der so langsam . Vielleicht kann das jemand bestätigen.

und natürlich fehlt bei dem auch die Edit Funktion.

mfg Dristar

Code: Alles auswählen

; AdvancedHexEditor_Sample.pb V1.0
; by ShadowTurtle @ Sonntag, 01. Juli 2007
IncludeFile("AdvancedHexEditor.pb")

#Window_0 = 0

Procedure Sample()
  If OpenWindow(#Window_0, 257, 116, 667, 477, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
  
      LengthTest.l  = 5000;794
      *LoadedMemory = AllocateMemory(LengthTest.l)
  
      OpenFile(0, "AdvancedHexEditor.pb")
      ReadData(0, *LoadedMemory, LengthTest.l)
      CloseFile(0)

      CompilerIf #AdvHexEditor_UseBitmapFont = #True
        AdvHexEditor_CatchFont( ?AdvancedHex_Font_ASCII )
      CompilerElse
      CompilerEndIf
      ;*MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 300, 180);650, 460 )
      *MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 650, 460 )
     ;AdvHexEditor_SetScrollBarWidth( *MyHex, 20 )
      ;AdvHexEditor_UseFont(*MyHex, "Arial", 8)

    ;EndIf
  EndIf
 
  Repeat ; Start of the event loop
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    GadgetID = EventGadget() ; Is it a gadget event?
    EventType = EventType() ; The event type
   
    ;You can place code here, and use the result as parameters for the procedures
    If Event = #PB_Event_SizeWindow
      If WindowID = #Window_0
        AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
      EndIf
    EndIf
   
    AdvHexEditor_Update( *MyHex, Event, GadgetID, EventType )
  Until Event = #PB_Event_CloseWindow ; End of the event loop
 
  AdvHexEditor_Delete( *MyHex )
EndProcedure

Sample()

Code: Alles auswählen

; AdvancedHexEditor.pb V0.9
; by ShadowTurtle @ Sonntag, 01. Juli 2007
;
; 1. Mit AdvHexEditor_Create wird ein Hex-Editor-Gadget erstellt,
; wobei die Rückgabe ein Pointer ist. Angegeben werden müssen ein
; Pointer zu einer Mit AllocateMemory reservierten Speichers und die
; Position/Größe des Gadgets. z.B. *MyHex = AdvHexEditor_Create(
; *LoadedMemory, 5, 5, 650, 460 )
;
; 2. die Größe kann mittels AdvHexEditor_Resize eingestellt
; werden. wobei hier der Pointer zum Hex-Editor-Gadget Angegeben werden
; muss. z.B. AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore,
; WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
; Wie man sieht, man kann in dieser Funktion auch #PB_Ignore anwenden.
;
; 3. Um die Breite des Scroll-Balken einzustellen muss
; AdvHexEditor_SetScrollBarWidth benutzt werden. z.B.
; AdvHexEditor_SetScrollBarWidth( *MyHex, 40 )
;
; 4. Wenn #AdvHexEditor_UseBitmapFont deaktiviert ist, dann kann
; man Mit AdvHexEditor_UseFont die Schrift einstellen welche zur
; Darstellung der einzelne Zeichen benutzt werden soll. z.B.
; [b]AdvHexEditor_UseFont(*MyHex, "Arial", 8)
;
; 5. Damit dieses Gadget auf die Reaktionen der Benutzer reagiert, muss
; nach jeden Aufruf von z.b. WaitWindowEvent() die Funktion
; AdvHexEditor_Update aufgerufen werden. Als Parameter müssen die
; entsprechenden Ergebnisse der Funktionen Wie z.b. EventGadget()
; und EventType() Angegeben werden. z.B. AdvHexEditor_Update(
; *MyHex, Event, GadgetID, EventType )
;
; 6. dann gibt es da natürlich noch AdvHexEditor_Delete. es
; löscht einfach das HexEditor-Gadget. z.B. AdvHexEditor_Delete(
; *MyHex ).
;
; Wer keine Als DataSection eingebundenes Font zur Darstellung der ASCII
; Zeichen benutzen will, der braucht in der Library nur die Konstante
; #AdvHexEditor_UseBitmapFont in #False abzuändern. z.B.
; #AdvHexEditor_UseBitmapFont = #False
;
; Möchte nun irgendjemand Unicode-Zeichen statt ASCII im Hex-Gadget
; sehen, dann muss einfach nur ein entsprechendes Font Mit dem Font-
; Generator erstellt werden, oder es muss Mit AdvHexEditor_UseFont die
; entsprechende System-Schriftart gesetzt werden.
;
; Jetzt kommt bei dir garantiert zum 100sten mal die Frage auf: Haben wir
; nicht schon genug Hex-Betrachter in Purebasic? Ja, aber alle erledigen
; ihre Darstellungen in einen Text-Editor Gadget, Richtext-Editor-Gadget
; oder in einen MemoPad-Gadget (per WinApi), sind also nie wirklich auf
; das Bearbeiten ausgelegt worden und Haben dementsprechend auch weniger
; Features.
;
; Diese Advanced Library hingegen ist, so wie alle vorherigen dieser reihe,
; auf einfaches Weiterentwickeln ausgelegt. Ich habe also bewusst den
; Cursor + Hex-Eingabe Modus entfernt Damit man gleich loslegen kann Diese
; Library zu erweitern. aber keine bange. Als Hex-Viewer funktioniert Diese
; Library auch zu 100% einwandfrei.
;

#AdvHexEditor_UseBitmapFont = #False
;#AdvHexEditor_UseBitmapFont = #True

CompilerIf #AdvHexEditor_UseBitmapFont = #True
  DataSection
    AdvancedHex_Font_ASCII: IncludeBinary "AdvancedHexASCII.bmp"
  EndDataSection
CompilerEndIf

Structure AdvHexEditor
  HND_ScrollBarGadget.l
  HND_ImageGadGet.l
  HND_Image.l
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    HND_FontImage.l
  CompilerEndIf
  HND_Font.l

  ScrollBar_Minimal.l
  ScrollBar_Maximal.l
  ScrollBar_Position.l
  ScrollBar_Width.l

  *Memory
  offset.l
  offsetline.l
  maximallines.l

  x.l
  y.l
  width.l
  height.l

  BytesPerLine.l
  LineHeight.l
EndStructure

CompilerIf #AdvHexEditor_UseBitmapFont = #True
  Dim AdvHexEditor_FontChar.l(255*2+2)
 
  Procedure AdvHexEditor_PrepareFont( FontImage.l )
    Shared AdvHexEditor_FontChar()

    For ScanChar.l = 0 To 255*2
       AdvHexEditor_FontChar(ScanChar.l) = GrabImage( FontImage.l, #PB_Any, ScanChar.l*18, 0, 18, 18 )
    Next
  EndProcedure

  Procedure AdvHexEditor_CatchFont( *FontBitmap )
    FontImage.l = CatchImage( #PB_Any, *FontBitmap )
    AdvHexEditor_PrepareFont( FontImage.l )
    FreeImage(FontImage.l)
  EndProcedure

  Procedure AdvHexEditor_LoadFont( Filename.s = "AdvancedHexASCII.bmp" )
    FontImage.l = LoadImage( #PB_Any, Filename.s )
    AdvHexEditor_PrepareFont( FontImage.l )
    FreeImage(FontImage.l)
  EndProcedure

  Procedure AdvHexEditor_FreeFont()
    Shared AdvHexEditor_FontChar()

    For ScanChar.l = 0 To 255*2
      FreeImage( AdvHexEditor_FontChar(ScanChar.l) )
    Next
  EndProcedure

  Procedure AdvHexEditor_DrawChar( Byte.b, x.l, y.l )
    Shared AdvHexEditor_FontChar()

    DrawImage( ImageID( AdvHexEditor_FontChar(255+Byte.b) ), x.l, y.l )
  EndProcedure
 
  Procedure AdvHexEditor_DrawChars( String.s, x.l, y.l )
    StrLen.l = Len(String.s)
    For I = 1 To StrLen.l
      AdvHexEditor_DrawChar( Asc(Mid(String.s, I, 1)), x.l + (I-1) * 10, y.l )
    Next
  EndProcedure
 
  Procedure AdvHexEditor_CharsWidth( String.s )
    ProcedureReturn( Len(String.s) * 10 )
  EndProcedure

;            AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
;            DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )

CompilerEndIf


Procedure AdvHexEditor_GetScrollBarMaximal( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Maximal.l)
EndProcedure

Procedure AdvHexEditor_SetScrollBarMinimal( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Minimal.l = Value.l
EndProcedure

Procedure AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Maximal.l = Value.l
EndProcedure

Procedure AdvHexEditor_SetScrollBarPos( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Position.l = Value.l
EndProcedure

Procedure AdvHexEditor_GetScrollBarPos( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Position.l)
EndProcedure

Procedure AdvHexEditor_SetScrollBarWidth( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Width.l = Value.l
EndProcedure

Procedure AdvHexEditor_GetScrollBarWidth( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Width.l)
EndProcedure

Procedure AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
  If ( *AHE\ScrollBar_Position.l > *AHE\ScrollBar_Maximal.l )
    *AHE\ScrollBar_Position.l = *AHE\ScrollBar_Maximal.l
  EndIf
  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\ScrollBar_Maximal.l )
  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, *AHE\ScrollBar_Minimal.l )
  SetGadgetState( *AHE\HND_ScrollBarGadget, *AHE\ScrollBar_Position.l )
  If Not (*AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget))
    ResizeGadget(*AHE\HND_ScrollBarGadget, #PB_Ignore, #PB_Ignore, *AHE\ScrollBar_Width.l, #PB_Ignore)
    *AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget)
  EndIf
EndProcedure

Procedure AdvHexEditor_SetLine( *AHE.AdvHexEditor, Line.l )
  NewOffset = Line.l * *AHE\BytesPerLine
  *AHE\offset = NewOffset
  *AHE\offsetline.l = NewOffset / *AHE\BytesPerLine
  AdvHexEditor_SetScrollBarPos( *AHE, *AHE\offsetline.l )
;  SetGadgetState( *AHE\HND_ScrollBarGadget, Line.l )
;  Debug( "AdvHexEditor_SetLine:"+ Str(NewOffset) )
EndProcedure

Procedure.l AdvHexEditor_GetLineFromOffset( *AHE.AdvHexEditor, offset.l )
;  Debug( "AdvHexEditor_GetLineFromOffset:"+ Str(Offset.l / *AHE\BytesPerLine) )
  ProcedureReturn( offset.l / *AHE\BytesPerLine )
EndProcedure

Procedure.l AdvHexEditor_SetBytesPerLine( *AHE.AdvHexEditor, SetBytes.l )
  DoRun.b = 1
  While (DoRun.b = 1)
    ;OrgLine.l = *AHE\offsetline.l ;AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )
    OrgLine.l = AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )

    If ( *AHE\BytesPerLine > SetBytes.l )
      *AHE\BytesPerLine = *AHE\BytesPerLine - 1
    Else
      *AHE\BytesPerLine = *AHE\BytesPerLine + 1
    EndIf

    If ( *AHE\Memory = 0 )
      *AHE\maximallines = 0
    Else
      *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
    EndIf
    AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
    AdvHexEditor_SetLine( *AHE, OrgLine.l )
   
    If OrgLine.l > AdvHexEditor_GetScrollBarMaximal(*AHE);*AHE\maximallines
      AdvHexEditor_SetLine( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) )
    EndIf

    If ( *AHE\BytesPerLine = SetBytes.l )
      DoRun.b = 0
    EndIf
  Wend
EndProcedure


Procedure.b AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, UpdateMode.b = 0, UpdateGUI.b = 1 )
  MyDraw = StartDrawing( ImageOutput( *AHE\HND_Image ) )
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    Shared AdvHexEditor_FontChar()
  CompilerEndIf
  DrawingFont(FontID(*AHE\HND_Font))

  If ( UpdateMode.b = 0 )
;    DrawingMode(#PB_2DDrawing_XOr)
    Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
;    DrawingMode(0)
  EndIf

  DrawX.l = 3
  DrawY.l = 3

  AreaHeight.l = ImageHeight( *AHE\HND_Image )

  ManageMode.b = 0
  ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
  AbsoluteOffset.l = *AHE\offset
  If ( *AHE\Memory = 0 )
    MemSize.l = 0
  Else
    MemSize.l = MemorySize(*AHE\Memory)
  EndIf

  WorkX.l = 0
  WorkY.l = 0
  WorkAfterAdressX.l = 0
  ReadOffset.l = 0
  offset.l = 0
  DrawAdress.s = ""
  Redraw.b = 0
  Work.b = 1
  AbsoluteOffset.l = 0

  If ( *AHE\Memory = 0 )
    Work.b = 0
  EndIf

  While ( Work.b = 1 )
    Select ManageMode.b
      Case 0         ; Draw adress at left side
        If ( DrawY + WorkY > AreaHeight.l )
          Work.b = 0
        Else
          DrawAdress.s = Right("000000000"+Hex( ManageAdress + ReadOffset ),9)

          If ( UpdateMode.b = 0 )
            HexWidth.l = TextWidth( "000000000" ) + 20

            Box(0, WorkY, HexWidth.l - 10, *AHE\LineHeight, RGB(230, 230, 230))

            BackColor(RGB(230, 230, 230))
            DrawText( DrawX + WorkX, DrawY + WorkY, DrawAdress.s,RGB(0, 0, 0) )
            BackColor(RGB(255, 255, 255))
            WorkX = WorkX + HexWidth.l
          EndIf

          WorkAfterAdressX.l = WorkX

          ManageMode.b = 1
        EndIf
      Case 1         ; Draw byte as HEX at middle
        DoNext.b = 0
        ;If ( Offset.l > MemSize.l - *AHE\offset)
        If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
          DoNext.b = 1
        Else
          DrawOffset.s = Right("00"+Hex( PeekB(ManageAdress + ReadOffset) ),2)
          If ( UpdateMode.b = 0 )
            DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s ,RGB(0, 0, 0))
            HexWidth.l = TextWidth( "00" ) + 10
            WorkX = WorkX + HexWidth.l
          EndIf
        EndIf
        ReadOffset.l = ReadOffset.l + 1
        If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
          DoNext.b = 1
        EndIf
       
        If ( DoNext.b = 1)
          BPL.l = *AHE\BytesPerLine.l
          WorkX = WorkAfterAdressX + (HexWidth.l) * BPL.l + 8
          ReadOffset.l = 0
          ManageMode.b = 2
        EndIf

        offset.l = offset.l + 1
      Case 2         ; Draw original byte at right side
        DoNext.b = 0
        If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
        ;If ( Offset.l > MemSize.l - *AHE\offset)
          DoNext.b = 0
          Work.b = 0
        Else
          DrawOffset.s = Chr( PeekB(ManageAdress + ReadOffset) )
          ;Debug PeekB(ManageAdress + ReadOffset)
          If ( UpdateMode.b = 0 )
            CompilerIf #AdvHexEditor_UseBitmapFont = #True
              AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
;              DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )
              WorkX = WorkX + 12
            CompilerElse
              DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s,RGB(0, 0, 0))
              WorkX = WorkX + TextWidth( "0" ) ;+ 5
            CompilerEndIf
          EndIf
        EndIf
        ReadOffset.l = ReadOffset.l + 1
        If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
          DoNext.b = 1
        EndIf

        If ( DrawX + WorkX => *AHE\width - *AHE\ScrollBar_Width.l And *AHE\BytesPerLine > 1 )
          If ( UpdateMode.b = 0 )
            Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
          EndIf

          ;AdvHexEditor_SetBytesPerLine(*AHE, *AHE\BytesPerLine - 1)

          *AHE\BytesPerLine = *AHE\BytesPerLine - 1
          *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
          AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )

          ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
          AbsoluteOffset.l = *AHE\offset
          MemSize.l = MemorySize(*AHE\Memory)

          WorkX = 0
          WorkY = 0
         
          ReadOffset.l = 0
          ManageMode.b = 0
          AbsoluteOffset = 0
          DoNext.b = 0

          UpdateGUI.b = 0
        EndIf


        If ( DoNext.b )
          WorkX = 0
          WorkY = WorkY + *AHE\LineHeight
          ManageAdress = ManageAdress + ReadOffset
          AbsoluteOffset = AbsoluteOffset + ReadOffset

          ReadOffset.l = 0
          ManageMode.b = 0
        EndIf
    EndSelect
    ;Debug Str(ManageMode.b) + "_" + Str(WorkX)
  Wend

  StopDrawing()
  If ( UpdateMode.b = 0 )
    SetGadgetState( *AHE\HND_ImageGadGet, ImageID( *AHE\HND_Image ) )
  EndIf

  If ( UpdateMode.b = 1 )
    If ( UpdateGUI.b = 1 )
      If Event = #PB_Event_Gadget
        If ( GadgetID = *AHE\HND_ScrollBarGadget )
          ;*AHE\offsetline.l = GetGadgetState( *AHE\HND_ScrollBarGadget )
          ;*AHE\offset = *AHE\offsetline.l * *AHE\BytesPerLine
          AdvHexEditor_SetScrollBarPos( *AHE, GetGadgetState( *AHE\HND_ScrollBarGadget ) )
          AdvHexEditor_SetLine( *AHE, AdvHexEditor_GetScrollBarPos( *AHE ) )
          AdvHexEditor_UpdateScrollBar( *AHE )
          Redraw.b = 1
        EndIf
      EndIf
    EndIf
  EndIf
 
  ProcedureReturn Redraw.b
EndProcedure

Procedure AdvHexEditor_Update( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l )
  Redraw.b = AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 1)
  If ( Redraw.b = 1 )
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 0)
    Delay(10)
  EndIf
EndProcedure

Procedure AdvHexEditor_UpdateView( *AHE.AdvHexEditor )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_SetMemory( *AHE.AdvHexEditor, *Memory )
  If ( *Memory = #Null )
    *AHE\Memory = 0
    AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
    AdvHexEditor_SetScrollBarMaximal( *AHE, 0 )
    AdvHexEditor_SetScrollBarPos( *AHE, 0 )
    AdvHexEditor_UpdateScrollBar( *AHE )
  Else
    *AHE\Memory = *Memory
    *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
    AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
    AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
    AdvHexEditor_SetScrollBarPos( *AHE, 0 )
    AdvHexEditor_UpdateScrollBar( *AHE )
   
;    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
    AdvHexEditor_SetBytesPerLine( *AHE, 24 )
    AdvHexEditor_SetLine( *AHE, 0 )
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)

    ;SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
    ;SetGadgetState( *AHE\HND_ScrollBarGadget, 0 )
  EndIf

  *AHE\offset = 0
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_SetOffset( *AHE.AdvHexEditor, offset.l )
  *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
  AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
  AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
  AdvHexEditor_SetScrollBarPos( *AHE, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
  AdvHexEditor_UpdateScrollBar( *AHE )


;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0 )
;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
;  SetGadgetState( *AHE\HND_ScrollBarGadget, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
  *AHE\offset = offset.l

  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_Resize( *AHE.AdvHexEditor, x, y, width, height )
  If ( x = #PB_Ignore )
    x = *AHE\x
  EndIf

  If ( y = #PB_Ignore )
    y = *AHE\y
  EndIf

  If ( width = #PB_Ignore )
    width = *AHE\width
  EndIf

  If ( height = #PB_Ignore )
    height = *AHE\height
  EndIf

  If ( height < 3 Or width < 3 )
    ProcedureReturn
  EndIf

  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
;  *AHE\BytesPerLine = width / 16
  *AHE\x = x
  *AHE\y = y
  *AHE\width = width
  *AHE\height = height

;  ResizeImage( *AHE\HND_Image, width - *AHE\ScrollBar_Width.l, height, #PB_Image_Raw)
  FreeImage(*AHE\HND_Image)
  *AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
  ResizeGadget( *AHE\HND_ImageGadGet, x, y, width - *AHE\ScrollBar_Width.l, height )
  ResizeGadget( *AHE\HND_ScrollBarGadget, x + width - *AHE\ScrollBar_Width.l, y, 16, height )
 
;  AdvHexEditor_SetOffset(*AHE, 0 )
;  OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)

;  OldBytesPerLine.l = *AHE\BytesPerLine
;  While Not ( OldBytesPerLine.l = *AHE\BytesPerLine )
;    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0, 0)
;    OldBytesPerLine.l = *AHE\BytesPerLine

;    AdvHexEditor_SetLine(*AHE, OriginalLine.l )
;    OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)
;  Wend

;  AdvHexEditor_SetOffset(*AHE, (*AHE\BytesPerLine * OriginalLine.l) )

  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
  AdvHexEditor_SetLine( *AHE, 0 )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)


  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)

;  AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
;  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
;  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)

  AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
EndProcedure

Procedure AdvHexEditor_UseFont( *AHE.AdvHexEditor, FontName.s, FontSize.l)
  FreeFont( *AHE\HND_Font )
  *AHE\HND_Font = LoadFont(#PB_Any, FontName.s, FontSize.l)
EndProcedure

Procedure AdvHexEditor_Create( *Memory, x, y, width, height )
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    Shared AdvHexEditor_FontChar()
  CompilerEndIf

  *AHE.AdvHexEditor = AllocateMemory(SizeOf(AdvHexEditor))
  AdvHexEditor_SetScrollBarWidth( *AHE, 18 )

  *AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
  *AHE\HND_ImageGadGet = ImageGadget(#PB_Any, x, y, width - *AHE\ScrollBar_Width.l, height, ImageID( *AHE\HND_Image ), 0)
  *AHE\HND_ScrollBarGadget = ScrollBarGadget(#PB_Any, x + width - *AHE\ScrollBar_Width.l, y, *AHE\ScrollBar_Width.l, height, 0, 100, 3, #PB_ScrollBar_Vertical)

  *AHE\HND_Font = LoadFont(#PB_Any, "Courier New",8)
  ;*AHE\HND_Font = LoadFont(#PB_Any, "ASCII",8)

  *AHE\Memory = *Memory
  *AHE\offset = 0

  *AHE\x = x
  *AHE\y = y
  *AHE\width = width
  *AHE\height = height
 
  *AHE\BytesPerLine = 24;24;12
  *AHE\LineHeight = 18
  If ( *AHE\Memory = 0 )
    *AHE\maximallines = 0
  Else
    *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
  EndIf

  AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
  AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
  AdvHexEditor_SetScrollBarPos( *AHE, 0 )
  AdvHexEditor_UpdateScrollBar( *AHE )


  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
  AdvHexEditor_SetLine( *AHE, 0 )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)

;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0)
;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines);- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )

  AdvHexEditor_Update( *AHE, 0, 0, 0 )
  AdvHexEditor_UpdateView( *AHE )

  ProcedureReturn *AHE
EndProcedure

Procedure AdvHexEditor_Delete( *AHE.AdvHexEditor )
  FreeGadget( *AHE\HND_ScrollBarGadget )
  FreeGadget( *AHE\HND_ImageGadGet )
  FreeImage( *AHE\HND_Image )
  FreeFont( *AHE\HND_Font )
  FreeMemory( *AHE )
EndProcedure
PB 4.61 Beta 1 , Linux Ubuntu 11.10 ...
Ramihyn_
Beiträge: 61
Registriert: 20.06.2007 10:56

Re: Suche einen Memory Hex Editor

Beitrag von Ramihyn_ »

Dristar hat geschrieben:Ich habe mir zwar den AdvancedHexEditor.pb V0.9 von ShadowTurtle so angepasst das er unter Ubuntu 10.04 läuft ,
aber wenn ich auf die ScrollBar gehe ist der so langsam . Vielleicht kann das jemand bestätigen.
Unter Linux kommen die Events vom ScrollBarGadget gerne mal verzögert rein. Ich nehme an, dass Du das damit meintest?

Bugreport ist hier: http://www.purebasic.fr/english/viewtop ... 23&t=47856
Antworten