Seite 2 von 3

Verfasst: 23.05.2006 12:55
von funk.munich
Hi,

danke für die Info. Ich habe es dann mit PB 4.0 mal ausprobiert.

Wenn ich eine Datei erstellen lasse, z.B. 10 MB möchte ich die TrackBarList
in dem Fenster anzeigen, damit man sieht, dass das Programm noch arbeitet.
Im Moment erreicht die TrackBar jedoch das Ende viel zu schnell, obwohl
der Vorgang des Erstellens noch nicht abgeschlossen wurde.

Hat da jemand noch eine Idee, was ich da machen kann?

Ich habe mal den Code (PB 4.0) mit beigehängt.

Code: Alles auswählen

; -- DECLARATION ---
Declare initInfo()
Declare setInfos()
Declare disableInfos(flag)
Declare crtFile()

; -- GLOBAL ---
Global Free.q
Global Total.q

; -- ENUMERATION ---
Enumeration
  #MAIN
  #LIST
  #FULL
  #SPECIFIC
  #TRACKBAR
  #HIGH
  #SAVEFILE
  #FSIZE
  #BTN_CRT
  #BTN_QUIT
  #PROGBAR
  #SIZELIST
EndEnumeration

dName.s
VName.s
FSName.s
*Buffer = AllocateMemory(255)
VName = Space(255)
FSName = Space(255)

; -- STRUCTURE FOR DISC SIZE ---
Structure int64
  Long1.l
  Long2.l
EndStructure

Procedure.s getDriveType(parameter.s)

  result.s
  
  Select GetDriveType_(parameter)
    Case 2 : result = "Removable Drive"
    Case 3 : result = "Fixed Drive"
    Case 4 : result = "Remote (Network)"
    Case 5 : result = "CDRom Drive"
    Case 6 : result = "RAM Drive"
    Default : result = "Unknown"
  EndSelect

  ProcedureReturn result

EndProcedure

Procedure initInfo()

  frmID = Frame3DGadget(#PB_Any, 10, GadgetHeight(#LIST) + 20, GadgetWidth(#LIST), 180, "Partition Information") 
    
    OptionGadget(#FULL, 20, 195, 140, 20, "Use Full Free Size") 
    OptionGadget(#SPECIFIC, 20, 220, 140, 20, "Use Size") 
      TrackBarGadget(#TRACKBAR, 160, 225, 500, 18, 0, 100) 
        TextGadget(#PB_Any, 165, 250, 10, 20, "0")
        TextGadget(#HIGH, 650, 250, 100, 20, "100")
        
    TextGadget(#PB_Any, 20, 280, 120, 20, "File Size (MB):")
    StringGadget(#FSIZE, 165, 280, 120, 20, "")
        
    TextGadget(#PB_Any, 20, 310, 120, 20, "File Path/Name:")
    StringGadget(#SAVEFILE, 165, 310, 490, 20, "", #PB_String_ReadOnly)
    
    ButtonGadget(#BTN_CRT, 10, 360, 60, 20, "Create") 
    ButtonGadget(#BTN_QUIT, 80, 360, 60, 20, "Quit") 

    ProgressBarGadget(#PROGBAR, 10, 390, GadgetWidth(#LIST), 30, 0, 100) 
    
    disableInfos(0)

EndProcedure

Procedure setInfos()

  SetGadgetAttribute(#TRACKBAR, #PB_TrackBar_Maximum, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
    SetGadgetText(#HIGH, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5))
    SetGadgetText(#FSIZE, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5))
    
  SetGadgetText(#SAVEFILE, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 0) + "MEMORYTEST.DAT")


EndProcedure

Procedure disableInfos(flag)

  Select flag
    Case 0
      DisableGadget(#BTN_CRT, 1) : DisableGadget(#FULL, 1) : DisableGadget(#SPECIFIC, 1)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#SAVEFILE, 1) : DisableGadget(#FSIZE, 1)
    Case 1
      DisableGadget(#BTN_CRT, 0) : DisableGadget(#FULL, 0) : DisableGadget(#SPECIFIC, 0)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#SAVEFILE, 0)
      SetGadgetState(#FULL, 1)
    Case 2
      DisableGadget(#TRACKBAR, 0) : DisableGadget(#FSIZE, 0)
      SetGadgetState(#TRACKBAR, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
    Case 3
      DisableGadget(#TRACKBAR, 0) : DisableGadget(#FSIZE, 1)
      SetGadgetState(#TRACKBAR, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
      SetGadgetText(#FSIZE, GetGadgetText(#HIGH))
    Case 9
      DisableGadget(#BTN_CRT, 1) : DisableGadget(#FULL, 1) : DisableGadget(#SPECIFIC, 1)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#FSIZE, 1) : DisableGadget(#LIST, 1) : DisableGadget(#BTN_QUIT, 1)
    Case 10
      DisableGadget(#BTN_QUIT, 0) : DisableGadget(#LIST, 0)
  EndSelect

EndProcedure

Procedure crtFile()
    
    CreateFile(1, GetGadgetText(#SAVEFILE))
    k.q = Val(GetGadgetText(#FSIZE)) * 1024 * 1024

    For a = 0 To k
       SetGadgetState(#PROGBAR, a)
       WriteByte(1,0)
    Next
    CloseFile(1)

EndProcedure

; ---- START MAIN PROGRAM ----

hWnd = OpenWindow(#MAIN, 0, 0, 820, 390, "Memory Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If hWnd <> 0
  CreateGadgetList(WindowID(#MAIN))
  ListIconGadget(#LIST,  10, 10, 800, 150, "#", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
    AddGadgetColumn(#LIST, 2, "Volume Name", 170)
    AddGadgetColumn(#LIST, 3, "File System", 80)
    AddGadgetColumn(#LIST, 4, "Drive Type", 150)
    AddGadgetColumn(#LIST, 5, "Total Size (MB)", 110)
    AddGadgetColumn(#LIST, 6, "Free Size (MB)", 110)

    For i = 0 To GetLogicalDriveStrings_(255, *Buffer)
      C = PeekB(*Buffer + i)
      If C > 64 And C < 91
        dName = Chr(C) + ":\"
        If GetVolumeInformation_(dName, VName, 255, Serial, 0, 0, FSName, 255)
        
        GetDiskFreeSpaceEx_(@dName, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64)
        Total = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12)
        Free = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12)
        
        AddGadgetItem(#LIST, -1, dName + Chr(10) + VName + Chr(10) + FSName + Chr(10) + getDriveType(dName) + Chr(10) + Str(Total) + Chr(10) + Str(Free))
        
        EndIf
      EndIf  
  
    Next

    initInfo()

EndIf

Repeat
  EventID = WaitWindowEvent()

  Select EventID
    Case #PB_Event_CloseWindow
      Quit = 1
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #LIST
          disableInfos(1)
          setInfos()
        Case #SPECIFIC
          disableInfos(2)          
        Case #FULL
          disableInfos(3)
        Case #TRACKBAR
          SetGadgetText(#FSIZE, Str(GetGadgetState(#TRACKBAR)))
        Case #FSIZE
          If EventType() = #PB_EventType_LostFocus
            SetGadgetState(#TRACKBAR, Val(GetGadgetText(#FSIZE)))
          EndIf
        Case #BTN_QUIT
          Quit = 1
        Case #BTN_CRT
          disableInfos(9)
          ResizeWindow(#MAIN, #PB_Ignore , #PB_Ignore , #PB_Ignore , 430) 
          Delay(500)
          crtFile()
          Delay(500)
          disableInfos(10)
          ResizeWindow(#MAIN, #PB_Ignore , #PB_Ignore , #PB_Ignore , 390) 
      EndSelect
  EndSelect

Until Quit = 1
Zur Zeit setze ich den Status der TrackBar in der Prozedur "crtFile()".

Danke + Gruß,
Daniel

Verfasst: 23.05.2006 13:32
von Jilocasin
Ääh, will nicht stören,
trotzdem kurze Frage:

Bei 3.3 gibbts nix höheres als LONG (2^32) oder? :(

Verfasst: 23.05.2006 14:03
von Rings

Code: Alles auswählen

Procedure      ResizeFile (Filename.s, NewLength.l )
  ; Set new FileSize. Attention only for Size of 2^32 Bytes!!
  ; by Rings
  Filehandle = CreateFile_(Filename, #GENERIC_READ|#GENERIC_WRITE,#FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #OPEN_ALWAYS, #FILE_ATTRIBUTE_NORMAL, #Null)
  If Filehandle
    SetFilePointer_(Filehandle, NewLength, #Null, #FILE_BEGIN )
    SetEndOfFile_(Filehandle)
    CloseHandle_(Filehandle)
  EndIf
EndProcedure 

KB=1024;bytes
MB=1024*KB
GB=1024*MB
L=1 *GB
ResizeFile ("c:\test.NOP",L)

Verfasst: 24.05.2006 14:35
von funk.munich
Hi zusammen,

ich hätte da doch noch eine Sache.

Wie schaffe ich es denn beide Informationen:

- Size
- Size on Disk

synchron zu halten.
Also, wenn Size z.B. 5 MB ausgibt, dass auch Size on Disk auch 5 MB
nutzt.

Size: 5,00 MB (5.242.881 bytes)
Size on Disk: 64,0 KB (65.536 bytes)

Das ist mir noch nicht wirklich verständlich.

Danke + Gruß,
Daniel

Verfasst: 24.05.2006 14:57
von Exabot
Grösse = 5MB
Grösse auf Datenträger = 64KB

Datei mit Leerzeichen, und Datenträgercompression eingeschaltet?

mfg

Spider

Verfasst: 24.05.2006 15:49
von vonTurnundTaxis
Ist der Umrechnungsfaktor Kilobyte==>Megabyte==>Gigabyte nicht 1000?

Verfasst: 24.05.2006 16:00
von Jilocasin
vonTurnundTaxis hat geschrieben:Ist der Umrechnungsfaktor Kilobyte==>Megabyte==>Gigabyte nicht 1000?
Neee: 1024 !

Verfasst: 24.05.2006 17:02
von MVXA
Eigentlich schon aber das ist ne total bekloppte reglung... Die Werte
standen schon immer für 1024. Wenn, dann müsste ein Kibi 1000 sein.
Die Regelung der Namen war echt bescheuert. Welcher Idiot hat das
bitte ausgearbeitet?

Verfasst: 24.05.2006 17:12
von Kaeru Gaman
in den anfangszeiten war der faktor ganz einfach 1024.
in jüngerer zeit wurde das insofern geändert,
weil in der physik der faktor 1000 ist,
unabhängig welche grundeinheit dahintersteckt:

1 Kilometer = 1000 Meter
1 Kilogramm = 1000 Gramm
1 Kilopascal = 1000 Pascal
etc.

das wurde halt für Byte auch angepasst, egal wie sinnvol das in der praxis ist.
jemand kam dann wohl auf die idee, KiBi und sowas einzuführen,
um die alten einheiten mit 1024 behalten zu können.
die sind in der praxis sinnvoller, weil damit ganzzahlige adressräume entstehen:
16bit = 64KB
24bit = 16MB
32bit = 4GB
usw..

... ich für meinen teil schei$e auf die physikalische konvention, wenn ich gigabyte sage, meine ich 2^30 byte, und basta.

Verfasst: 24.05.2006 23:46
von manunidi
Ihr habt 2 methoden gepostet um dateien mit bestimmtr größe anzulegen!!!

Die mehtode mit byteweise schreiben ist langsamer, da sie ja byte für byte schreibt!!!