Seite 3 von 3

Verfasst: 21.04.2008 21:24
von scholly
a14xerus hat geschrieben:
scholly hat geschrieben:Die Sig müßte doch in allen seiner Post auftauchen, oder?
nöö.. man kann einstellen ob die sig im post stehen soll ;)
Für jedes einzelne Posting? Ich dachte das gilt dann für alle :o

Verfasst: 21.04.2008 21:24
von Vermilion
Und vor allem kann man seine Signatur auch einfach leer lassen.

Verfasst: 21.04.2008 21:26
von X0r
Und vor allem kann man jetzt auch aufhören über Signatur-Funktionen in einem PHPBB Board zu labern.

Verfasst: 21.04.2008 21:27
von scholly
@Vermilion:
Dann wart mal ab, bis von Dir der 4. wissen will, was für eine PB-Version Du fährst :lol:

@X0r:
Abba nich, wenner hilfreiche Geister veräppelt.

Verfasst: 21.04.2008 21:28
von X0r
@Vermilion:

Welche PB Version hast du?

Verfasst: 21.04.2008 22:00
von NicTheQuick
Und was ist an meiner Methode jetzt so kompliziert gewesen?

Man schnappe sich eine TreeLinkedList, von denen es genügend hier im
Forum gibt und passe sie ein wenig für PB V3.3 an.

Oder man nehme zum Beispiel folgende Struktur und baue die Procedures
drumherum. Einen Parser schreiben finde ich ein bisschen überzogen, und vor allem langsam.

Code: Alles auswählen

; celements --- FS --- *files --> FS_ARRAY --- e[n] --> FS_ELEMENT
;                                                            |
;                                                            |-- type
;                                                            |
;                                                            |-- file --> FS_FILE --- name
;                                                            |
;                                                            '-- folder --> FS_FOLDER
;                                                                               |
;                                                                               |-- name
;                                                                               |-- celements
;                                                                               '-- *files --> (FS_ARRAY)

Structure FS_FILE
  *name.StringP    ;siehe meine StringPointer-Include
EndStructure

Structure FS_FOLDER
  *name.StringP
  celements.l
  *files.FS_ARRAY
EndStructure

Structure FS_ELEMENT
  type.l
  StructureUnion 
    *file.FS_FILE
    *folder.FS_FOLDER
  EndStructureUnion
EndStructure

Structure FS_ARRAY
  e[0].FS_ELEMENT
EndStructure

Structure FS
  celements.l
  *files.FS_ARRAY
EndStructure

Verfasst: 21.04.2008 23:29
von NicTheQuick
Hab jetzt eine Kleinigkeit gebastelt. Nur das in Dateien schreiben konnte ich
jetzt noch nicht testen. Da hab ich gerade zu wenig Zeit für.

Code: Alles auswählen

Enumeration
  #FS_File
  #FS_Folder
EndEnumeration

Structure FS_ELEMENT
  type.l
  *name
  *folder.FS_FOLDER
EndStructure

Structure FS_ARRAY
  e.FS_ELEMENT[0]
EndStructure

Structure FS_FOLDER
  celements.l
  *files.FS_ARRAY
  *eparent.FS_ELEMENT
  *parent.FS_FOLDER
EndStructure

Procedure FS_New()
  Protected *FS.FS_FOLDER
  
  *FS = AllocateMemory(SizeOf(FS_FOLDER))
  
  ProcedureReturn *FS
EndProcedure

Procedure.l FS_Count(*FS.FS_FOLDER)
  ProcedureReturn *FS\celements
EndProcedure

Procedure.l FS_NewFile(*FS.FS_FOLDER, name.s)
  Protected *tmp, *name
  
  *name = AllocateMemory(Len(name) + 1)
  If Not *name : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files, (*FS\celements + 1) * SizeOf(FS_ELEMENT))
  If Not *tmp : FreeMemory(*name) : ProcedureReturn #False : EndIf
  
  *FS\files = *tmp
  With *FS\files\e[*FS\celements]
    \type = #FS_File
    \name = *name
    PokeS(\name, name)
    \folder = 0
  EndWith
  
  *FS\celements + 1
  
  ProcedureReturn *FS\celements
EndProcedure

Procedure.l FS_NewFolder(*FS.FS_FOLDER, name.s)
  Protected *tmp, *name, *folder
  
  *name = AllocateMemory(Len(name) + 1)
  If Not *name : ProcedureReturn #False : EndIf
  
  *folder = AllocateMemory(SizeOf(FS_FOLDER))
  If Not *folder : FreeMemory(*name) : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files, (*FS\celements + 1) * SizeOf(FS_ELEMENT))
  If Not *tmp : FreeMemory(*name) : FreeMemory(*folder) : ProcedureReturn #False : EndIf
  
  *FS\files = *tmp
  *FS\files\e[*FS\celements]\type = #FS_Folder
  *FS\files\e[*FS\celements]\name = *name
  PokeS(*FS\files\e[*FS\celements]\name, name)
  *FS\files\e[*FS\celements]\folder = *folder
  *FS\files\e[*FS\celements]\folder\parent = *FS
  *FS\files\e[*FS\celements]\folder\eparent = *FS\files\e[*FS\celements]
  
  *FS\celements + 1
  
  ProcedureReturn *folder
EndProcedure

Procedure FS_OpenFolder(*FS.FS_FOLDER, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  If *FS\files\e[position]\type <> #FS_Folder : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\files\e[position]\folder
EndProcedure

Procedure FS_CloseFolder(*FS.FS_FOLDER)
  If Not *FS\parent : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\parent
EndProcedure

Procedure FS_Delete(*FS.FS_Folder, position.l)
  Protected i.l
  
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  FreeMemory(*FS\files\e[position]\name)
  
  If *FS\files\e[position]\type = #FS_Folder
    For i = 0 To *FS\files\e[position]\folder\celements - 1
      FS_Delete(*FS\files\e[position]\folder, i)
    Next
  EndIf
  
  *FS\celements - 1
  
  While position < *FS\celements
    *FS\files\e[position]\type = *FS\files\e[position + 1]\type
    *FS\files\e[position]\name = *FS\files\e[position + 1]\name
    *FS\files\e[position]\folder = *FS\files\e[position + 1]\folder
    position + 1
  Wend
  
  If *FS\celements
    *FS\files = ReAllocateMemory(*FS\files, *FS\celements * SizeOf(FS_ELEMENT))
  Else
    FreeMemory(*FS\files)
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure.s FS_Name(*FS.FS_Folder, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn "" : EndIf
  
  ProcedureReturn PeekS(*FS\files\e[position]\name)
EndProcedure

Procedure FS_SetName(*FS.FS_FOLDER, position.l, name.s)
  Protected *tmp
  
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files\e[position]\name, Len(name) + 1)
  If Not *tmp : ProcedureReturn #False : EndIf
  
  *FS\files\e[position]\name = *tmp
  
  PokeS(*FS\files\e[position]\name, name)
  
  ProcedureReturn #True
EndProcedure

Procedure FS_Type(*FS.FS_FOLDER, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\files\e[position]\type
EndProcedure

CompilerIf 0

Macro ReadData(a, b)
  ReadData(0, a, b)
EndMacro
Macro ReadLong()
  ReadLong(0)
EndMacro
Macro WriteLong(a)
  WriteLong(0, a)
EndMacro
Macro WriteString(a)
  WriteString(0, a)
EndMacro

Procedure FS_Write(*FS.FS_FOLDER)
  Protected i.l
  
  WriteLong(*FS\celements)
  For i = 0 To *FS\celements - 1
    WriteLong(*FS\files\e[i]\type)
    WriteLong(Len(*FS\files\e[i]\name))
    WriteString(PeekS(*FS\files\e[i]\name))
    If *FS\files\e[i]\type = #FS_Folder
      FS_Write(*FS\files\e[i]\folder)
    EndIf
  Next
EndProcedure

Procedure FS_Read(*FS.FS_FOLDER)
  Protected c.l, i.l, type.l, length.l, name.s, *tmp
  
  If Not *FS
    *FS = AllocateMemory(SizeOf(FS_FOLDER))
    If Not *FS : ProcedureReturn #False : EndIf
  EndIf
  
  c = ReadLong() - 1
  For i = 0 To c
    type = ReadLong()
    length = ReadLong()
    name = Space(length)
    ReadData(@name, length)
    Select type
      Case #FS_File
        If Not FS_NewFile(*FS, name) : ProcedureReturn #False : EndIf
      Case #FS_Folder
        *tmp = FS_NewFolder(*FS, name)
        If *tmp
          If Not FS_Read(*tmp) : ProcedureReturn #False : EndIf
        EndIf
    EndSelect
  Next
  
  ProcedureReturn #True
EndProcedure
CompilerEndIf

Procedure.s FS_Path(*FS.FS_FOLDER, position.l)
  Protected path.s = "\"
  
  If position >= 0 And position < *FS\celements
    path + PeekS(*FS\files\e[position]\name)
  EndIf
  
  While *FS\parent And *FS\eparent
    path = "\" + PeekS(*FS\eparent\name) + path
    *FS = *FS\parent
  Wend
  
  ProcedureReturn path
EndProcedure

Procedure FS_Debug(*FS.FS_FOLDER)
  Protected c.l, i.l
  
  For i = 0 To FS_Count(*FS) - 1
    Select FS_Type(*FS, i)
      Case #FS_File
        Debug FS_Path(*FS, i)
      
      Case #FS_Folder
        Debug FS_Path(*FS, i) + "\"
        FS_Debug(FS_OpenFolder(*FS, i))
    EndSelect
  Next
EndProcedure

Define *FS.FS_FOLDER

*FS = FS_New()

;1 Datei und 2 Order anlegen
FS_NewFile(*FS, "autoexec.bat")
FS_NewFolder(*FS, "Programme")
FS_NewFolder(*FS, "Windows")
  ;Ordner an Position 2 öffnen
  *FS = FS_OpenFolder(*FS, 2)
  ;2 Dateien und 1 Ordner anlegen
  FS_NewFile(*FS, "win.com")
  FS_NewFile(*FS, "win.ini")
  FS_NewFolder(*FS, "Temp")
    ;Ordner an Position 2 öffnen
    *FS = FS_OpenFolder(*FS, 2)
    ;2 Dateien anlegen
    FS_NewFile(*FS, "tempdatei.dat")
    FS_NewFile(*FS, "altes setup.exe")
    ;Ordner wieder schließen
    *FS = FS_CloseFolder(*FS)
  ;Ordner wieder schließen
  *FS = FS_CloseFolder(*FS)

FS_Debug(*FS)

Verfasst: 22.04.2008 08:19
von Vermilion
Für XOr und Scholly: Immer die neueste. Fertig. Kann man sich doch denken... wenn nichts anderes da steht, dann die default antwort.

Verfasst: 22.04.2008 15:10
von X0r
>Für XOr und Scholly: Immer die neueste. Fertig. Kann man sich doch denken... wenn nichts anderes da steht, dann die default antwort.

Aha. Das sagt der richtige. Du selber hast zur PB 4.1 Beta Zeit PB 4.00 genutzt. /:->

Verfasst: 22.04.2008 17:32
von Vermilion
Ja, weil ich Betas nicht benutze (Standardmäßig). Nur fertige Versionen. Und von diesen winzigen Änderungen von 4.00 und 4.02 habe ich halt zuerst nichts mitgekriegt.