FTP-Programm

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

FTP-Programm

Beitrag von bluejoke »

Hallo!

Ich suche ein möglichst kleines FTP-Programm, das auch gar nicht soviel können muss (z.B. reicht eine Verbindung zu 1 Sever gleichzeitig aus).
Sollte stabil sein, Freeware und eben klein. Drag&Drop würde mich auch sehr freuen.

Wichtig: Es sollte unbedingt direkt vom USB-Stick/Diskette/CD-Laufwerk funktionieren.

LeechFTP und SmartFTP hab ich schon probiert.

Dongeschön!
Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

hast du schon ftpcommander probiert? (keine ahnung ob das vom usb stick läuft)
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Probier mal Filezilla, ist echt Super und Kostenlos :allright:
http://filezilla.sourceforge.net/

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Hallo!

Dein (DD) Client gefällt mir schon rcht gut, du möchtest nicht zufällig den SourceCode freigeben? Hab nämlich ein paar Anregungen (vielleicht magst auch du die einbauen)

Grüße,
Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

bluejoke hat geschrieben:Hallo!

Dein (DD) Client gefällt mir schon rcht gut, du möchtest nicht zufällig den SourceCode freigeben? Hab nämlich ein paar Anregungen (vielleicht magst auch du die einbauen)

Grüße,
Simon
Jo, kann ich machen, allerdings wärs nett wenn ich den source wieder bekomm, damit ich eine neue version online stellen kann.

Source:

Code: Alles auswählen

Enumeration
  #STARTGADGET
  #MAIN
  #FILES
  #DOWN
  #UP
  #DELE
  #LOGOUT
  #ABOUT
  #REFRESH
  #RENAME
  #CHMOD
  
  #LOG
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #SERVER
  #PORT
  #USER
  #PASS
  #LOGIN
  
  #PROGRESS_INFO
  #PROGRESS
  
  #CMD
  
  #STOPGADGET
  
  #Text_00
  #Text_10
  #Text_20
  #Text_30
  #Text_40
  #Text_50
  #USER_READ
  #GROUP_READ
  #WORLD_READ
  #USER_WRITE
  #GROUP_WRITE
  #WORLD_WRITE
  #USER_RUN
  #GROUP_RUN
  #WORLD_RUN
  #NUMERIC
  #WORDS
  #OK
EndEnumeration

LoadImage(1, "BIN\file.ico")
LoadImage(2, "BIN\folder.ico")

InitNetwork()

Global EOL.s
EOL.s = Chr(13)+Chr(10)

Procedure.s Open_Chmod(chmod.s)
  If OpenWindow(1, 0, 0, 320, 240,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "CHMOD")
    If CreateGadgetList(WindowID())
      TextGadget(#Text_00, 10, 40, 80, 20, "Owner:")
      TextGadget(#Text_10, 10, 70, 80, 20, "Group:")
      TextGadget(#Text_20, 10, 100, 80, 20, "World:")
      TextGadget(#Text_30, 120, 10, 50, 20, "Read", #PB_Text_Center)
      TextGadget(#Text_40, 190, 10, 50, 20, "Write", #PB_Text_Center)
      TextGadget(#Text_50, 260, 10, 50, 20, "Run", #PB_Text_Center)
      
      CheckBoxGadget(#USER_READ, 140, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_READ, 140, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_READ, 140, 100, 20, 20, "")
      CheckBoxGadget(#USER_WRITE, 210, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_WRITE, 210, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_WRITE, 210, 100, 20, 20, "")
      CheckBoxGadget(#USER_RUN, 280, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_RUN, 280, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_RUN, 280, 100, 20, 20, "")
      
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      StringGadget(#NUMERIC, 10, 150, 300, 20, "000", #ESB_DISABLE_RIGHT)
      If chmod = ""
      StringGadget(#WORDS, 10, 180, 300, 20, "----------", #ESB_DISABLE_RIGHT)
      Else
      StringGadget(#WORDS, 10, 180, 300, 20, chmod, #ESB_DISABLE_RIGHT)
      EndIf
    CompilerElse
      StringGadget(#NUMERIC, 10, 150, 300, 20, "000")
      If chmod = ""
      StringGadget(#WORDS, 10, 180, 300, 20, "----------")
      Else
      StringGadget(#WORDS, 10, 180, 300, 20, chmod)
      EndIf
    CompilerEndIf
      
      ButtonGadget(#OK, 10, 210, 300, 20, "OK")
      
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
       FlatGadgetAll(#Text_00, #OK)
      CompilerEndIf
      
      Repeat
      Event = WaitWindowEvent()
      If EventWindowID() = 1
      Select Event
      Case #PB_Event_CloseWindow
        Q = 1
      Case #PB_Event_Gadget
        GID = EventGadgetID()
        If GID = #OK
          chmod = GetGadgetText(#NUMERIC)
          Q = 1
        ElseIf GID >= #USER_READ And GID <= #WORLD_RUN
          User1.s = Str(GetGadgetState(#USER_READ)*4+GetGadgetState(#USER_WRITE)*2+GetGadgetState(#USER_RUN)*1)
          Group1.s = Str(GetGadgetState(#GROUP_READ)*4+GetGadgetState(#GROUP_WRITE)*2+GetGadgetState(#GROUP_RUN)*1)
          World1.s = Str(GetGadgetState(#WORLD_READ)*4+GetGadgetState(#WORLD_WRITE)*2+GetGadgetState(#WORLD_RUN)*1)
          
          SetGadgetText(#NUMERIC, User1+Group1+World1)
          
          Num.s = GetGadgetText(#NUMERIC)
          
          User2.l = Val(Mid(Num, 1, 1))
          Group2.l = Val(Mid(Num, 2, 1))
          World2.l = Val(Mid(Num, 3, 1))
          
          Txt.s = GetGadgetText(#WORDS)
          
          If User2 & 4
          PokeB(@Txt+1, 'r')
          Else
          PokeB(@Txt+1, '-')
          EndIf
          If User2 & 2
          PokeB(@Txt+2, 'w')
          Else
          PokeB(@Txt+2, '-')
          EndIf
          If User2 & 1
          PokeB(@Txt+3, 'x')
          Else
          PokeB(@Txt+3, '-')
          EndIf
          
          If Group2 & 4
          PokeB(@Txt+4, 'r')
          Else
          PokeB(@Txt+4, '-')
          EndIf
          If Group2 & 2
          PokeB(@Txt+5, 'w')
          Else
          PokeB(@Txt+5, '-')
          EndIf
          If Group2 & 1
          PokeB(@Txt+6, 'x')
          Else
          PokeB(@Txt+6, '-')
          EndIf
          
          If World2 & 4
          PokeB(@Txt+7, 'r')
          Else
          PokeB(@Txt+7, '-')
          EndIf
          If World2 & 2
          PokeB(@Txt+8, 'w')
          Else
          PokeB(@Txt+8, '-')
          EndIf
          If World2 & 1
          PokeB(@Txt+9, 'x')
          Else
          PokeB(@Txt+9, '-')
          EndIf
          
          SetGadgetText(#WORDS, Txt)
        ElseIf GID = #NUMERIC
          Num.s = GetGadgetText(#NUMERIC)
          
          User2.l = Val(Mid(Num, 1, 1))
          Group2.l = Val(Mid(Num, 2, 1))
          World2.l = Val(Mid(Num, 3, 1))
          
          SetGadgetState(#USER_READ  , User2 & 4)
          SetGadgetState(#USER_WRITE , User2 & 2)
          SetGadgetState(#USER_RUN   , User2 & 1)
          
          SetGadgetState(#GROUP_READ , Group2 & 4)
          SetGadgetState(#GROUP_WRITE, Group2 & 2)
          SetGadgetState(#GROUP_RUN  , Group2 & 1)
          
          SetGadgetState(#WORLD_READ , World2 & 4)
          SetGadgetState(#WORLD_WRITE, World2 & 2)
          SetGadgetState(#WORLD_RUN  , World2 & 1)
          
          Txt.s = GetGadgetText(#WORDS)
          
          If User2 & 4
          PokeB(@Txt+1, 'r')
          Else
          PokeB(@Txt+1, '-')
          EndIf
          If User2 & 2
          PokeB(@Txt+2, 'w')
          Else
          PokeB(@Txt+2, '-')
          EndIf
          If User2 & 1
          PokeB(@Txt+3, 'x')
          Else
          PokeB(@Txt+3, '-')
          EndIf
          
          If Group2 & 4
          PokeB(@Txt+4, 'r')
          Else
          PokeB(@Txt+4, '-')
          EndIf
          If Group2 & 2
          PokeB(@Txt+5, 'w')
          Else
          PokeB(@Txt+5, '-')
          EndIf
          If Group2 & 1
          PokeB(@Txt+6, 'x')
          Else
          PokeB(@Txt+6, '-')
          EndIf
          
          If World2 & 4
          PokeB(@Txt+7, 'r')
          Else
          PokeB(@Txt+7, '-')
          EndIf
          If World2 & 2
          PokeB(@Txt+8, 'w')
          Else
          PokeB(@Txt+8, '-')
          EndIf
          If World2 & 1
          PokeB(@Txt+9, 'x')
          Else
          PokeB(@Txt+9, '-')
          EndIf
          
          SetGadgetText(#WORDS, Txt)
        Else
          Word.s = GetGadgetText(#WORDS)
          
          User1.s = Mid(Word, 2, 3)
          Group1.s = Mid(Word, 5, 3)
          World1.s = Mid(Word, 8, 3)
          
          If Mid(User1, 1, 1)  = "r"                             : SetGadgetState(#USER_READ  , 1)  : Else : SetGadgetState(#USER_READ  , 0)  : EndIf
          If Mid(User1, 2, 1)  = "w"                             : SetGadgetState(#USER_WRITE , 1)  : Else : SetGadgetState(#USER_WRITE , 0)  : EndIf
          If Mid(User1, 3, 1)  = "x" Or Mid(User1, 3, 1)  = "s"  : SetGadgetState(#USER_RUN   , 1)  : Else : SetGadgetState(#USER_RUN   , 0)  : EndIf
          
          If Mid(Group1, 1, 1) = "r"                             : SetGadgetState(#GROUP_READ  , 1) : Else : SetGadgetState(#GROUP_READ  , 0) : EndIf
          If Mid(Group1, 2, 1) = "w"                             : SetGadgetState(#GROUP_WRITE , 1) : Else : SetGadgetState(#GROUP_WRITE , 0) : EndIf
          If Mid(Group1, 3, 1) = "x" Or Mid(Group1, 3, 1)  = "s" : SetGadgetState(#GROUP_RUN   , 1) : Else : SetGadgetState(#GROUP_RUN   , 0) : EndIf
          
          If Mid(World1, 1, 1) = "r"                             : SetGadgetState(#WORLD_READ  , 1) : Else : SetGadgetState(#WORLD_READ  , 0) : EndIf
          If Mid(World1, 2, 1) = "w"                             : SetGadgetState(#WORLD_WRITE , 1) : Else : SetGadgetState(#WORLD_WRITE , 0) : EndIf
          If Mid(World1, 3, 1) = "x" Or Mid(World1, 3, 1)  = "s" : SetGadgetState(#WORLD_RUN   , 1) : Else : SetGadgetState(#WORLD_RUN   , 0) : EndIf
        EndIf
      EndSelect
      Else
      UseWindow(1)
      ActivateWindow()
      EndIf
      Until Q = 1
      CloseWindow(1)
      UseWindow(0)
      
    EndIf
  EndIf
  ProcedureReturn chmod
EndProcedure

Procedure.s PassiveIP(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
  ProcedureReturn IP.s
EndProcedure

Procedure.l PassivePort(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
  ProcedureReturn Port
EndProcedure

Procedure.s Wait(ConnectionID, Timeout)
  Delay(10)
  *Buffer = AllocateMemory(60000)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
  If ElapsedMilliseconds()-t < Timeout
  Size = ReceiveNetworkData(ConnectionID, *Buffer, 60000)
  Text.s = PeekS(*Buffer)
  FreeMemory(*Buffer)
  SetGadgetText(#PROGRESS_INFO, Text)
  ProcedureReturn Text
  EndIf
EndProcedure

Procedure Wait2(ConnectionID, *Buffer, Size, Timeout)
  Delay(50)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) = 0 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
  If ElapsedMilliseconds()-t < Timeout
  CurSize = ReceiveNetworkData(ConnectionID, *Buffer, Size)
  While CurSize < Size
    If NetworkClientEvent(ConnectionID) = 2
    CurSize + ReceiveNetworkData(ConnectionID, *Buffer+CurSize, Size-CurSize)
    EndIf
  Wend
  ProcedureReturn CurSize-1
  EndIf
EndProcedure

Procedure SendNetworkString2(ConnectionID, String.s)
  SetGadgetText(#PROGRESS_INFO, String.s)
  SendNetworkString(ConnectionID, String.s)
EndProcedure

Procedure FTP_Connect(Server.s, Port, Name.s, Pass.s)
  ConnectionID = OpenNetworkConnection(Server, Port)
  If ConnectionID
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "220"
      SendNetworkString2(ConnectionID, "USER "+Name.s+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "331"
        SendNetworkString2(ConnectionID, "PASS "+Pass.s+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "230"
          SendNetworkString2(ConnectionID, "TYPE A"+EOL)
          Wait(ConnectionID, 5000)
          ProcedureReturn ConnectionID
        EndIf
      EndIf
    EndIf
    CloseNetworkConnection(ConnectionID)
  EndIf
EndProcedure

Procedure FTP_SetCurrentDirectory(ConnectionID, Path.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CWD "+Path.s+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      SendNetworkString2(ConnectionID, "PWD"+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "257"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_List(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "LIST"+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 5000)
          Delay(10)
          Result.s = Wait(Passive, 5000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      Else
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_NameList(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "NLST"+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 5000)
          Delay(100)
          Result.s = Wait(Passive, 5000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_DownloadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "RETR "+SFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        s = FindString(Text, "(", 1)+1
        l = FindString(Text, " ", s)-s
        Size = Val(Mid(Text, s, l))
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(1024)
          Text = ""
          s = 0
          If CreateFile(0, DFile)
            While s < Size
              Size2 = ReceiveNetworkData(Passive, *Buffer, 1024)
              If Size2 > 0
                s + Size2
                WriteData(*Buffer, Size2)
                SetGadgetState(#PROGRESS, Int((100/Size)*s))
                WindowEvent()
              EndIf
            Wend
            CloseFile(0)
          EndIf
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          WindowEvent()
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_UploadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "STOR "+DFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(FileSize(SFile))
          SetGadgetState(#PROGRESS, 25)
          WindowEvent()
          If ReadFile(0, SFile)
            ReadData(*Buffer, FileSize(SFile))
            CloseFile(0)
            SetGadgetState(#PROGRESS, 50)
            WindowEvent()
          EndIf
          SendNetworkData(Passive, *Buffer, FileSize(SFile))
          SetGadgetState(#PROGRESS, 75)
          WindowEvent()
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          SetGadgetState(#PROGRESS, 100)
          WindowEvent()
          Text.s = Wait(ConnectionID, 5000)
          WindowEvent()
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_DeleteDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RMD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_CHMOD(ConnectionID, File.s, Rights.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "SITE chmod "+Rights+" "+File+EOL)
    Text.s = Wait(ConnectionID, 5000)
  EndIf
EndProcedure

Procedure FTP_CMD(ConnectionID, CMD.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, CMD.s+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "500"
      SendNetworkString2(ConnectionID, "SITE "+CMD.s+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "500"
        ProcedureReturn 1
      EndIf
    Else
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_RenameFile(ConnectionID, FromName.s, ToName.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RNFR "+FromName+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "350"
      SendNetworkString2(ConnectionID, "RNTO "+ToName+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "250"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_DeleteFile(ConnectionID, File.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "DELE "+File+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_CreateDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "MKD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "257"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_DirectoryUp(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CDUP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_NoEvent(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "NOOP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
  EndIf
EndProcedure

Procedure FTP_Quit(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "221"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

;-Program
NewList CurrentDirectory.s()
Global Username.s, Password.s, Server.s, Port.l

Procedure UpdateFiles(ConnectionID)
  ClearGadgetItemList(#FILES)
  Files.s = RemoveString(FTP_List(ConnectionID), Chr(13))
  While FindString(Files, "  ", 0) : Files = ReplaceString(Files, "  ", " ") : Wend
  For k=1 To CountString(Files, Chr(10))
    Line.s = StringField(Files, k, Chr(10))
    If Trim(Line) <> ""
      If Left(StringField(Line, 1, " "), 1) = "d"
      AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), UseImage(2))
      Else
      AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), UseImage(1))
      EndIf
    EndIf
  Next
EndProcedure

Procedure SetDirectory(ConnectionID, Dir.s)
  Select Trim(Dir)
    Case "."
      ClearList(CurrentDirectory())
      FTP_SetCurrentDirectory(ConnectionID, "/")
    Case ".."
      LastElement(CurrentDirectory())
      DeleteElement(CurrentDirectory())
      ForEach CurrentDirectory()
        CurDir.s + "/" + CurrentDirectory()
      Next
      If CurDir = "" : CurDir = "/" : EndIf
      FTP_SetCurrentDirectory(ConnectionID, CurDir)
    Default
      LastElement(CurrentDirectory())
      AddElement(CurrentDirectory())
      CurrentDirectory() = Dir
      ForEach CurrentDirectory()
        CurDir.s + "/" + CurrentDirectory()
      Next
      FTP_SetCurrentDirectory(ConnectionID, CurDir)
  EndSelect
  UpdateFiles(ConnectionID)
EndProcedure

Procedure Decode(*Text, Size)
  For k=0 To Size-1
    PokeB(*Text+k, PeekB(*Text+k)+k)
  Next
EndProcedure

Procedure Encode(*Text, Size)
  For k=0 To Size-1
    PokeB(*Text+k, PeekB(*Text+k)-k)
  Next
EndProcedure

Procedure LoadPreferences()
  If OpenPreferences("pref.ini")
  
  PreferenceGroup("CONNECTION")
  Username = ReadPreferenceString("USER", "Guest")
  Password = ReadPreferenceString("PASS", "Gtcpp")
  Server   = ReadPreferenceString("SERVER", "ftp.host.com")
  Port     = ReadPreferenceLong("PORT", 21)
  Decode(@Password, Len(Password))
  
  ClosePreferences()
  EndIf
EndProcedure

Procedure SavePreferences()
  CreatePreferences("pref.ini")
  
  PreferenceGroup("CONNECTION")
  Encode(@Password, Len(Password))
  WritePreferenceString("USER", Username)
  WritePreferenceString("PASS", Password)
  WritePreferenceString("SERVER", Server)
  WritePreferenceLong("PORT", Port)
  Decode(@Password, Len(Password))
  
  ClosePreferences()
EndProcedure

LoadPreferences()

#WindowWidth = 640
#WindowHeight = 480

LoadImage(0, "BIN\Logo.bmp")
OpenWindow(0, 0, 0, 640, 480, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Bradan FTP Client")

CreateGadgetList(WindowID())
ImageGadget(0, 0, 0, 640, 480, ImageID())

t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : Until ElapsedMilliseconds()-t > 1500
FreeImage(0)
CloseWindow(0)


If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight+20, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar , "Bradan FTP")
  
  If CreateGadgetList(WindowID())
      
      ProgressBarGadget(#PROGRESS, #WindowWidth/2, #WindowHeight, #WindowWidth/2, 20, 0, 100)
      TextGadget(#PROGRESS_INFO, 0, #WindowHeight, #WindowWidth/2, 20, "Progressinformation")
      ;CloseGadgetList()
      
      ContainerGadget(#LOG, 0, 0, 640, 480, #PB_Container_Flat)
      TextGadget(#Text_0, (#WindowWidth/2)-200, (#WindowHeight/2)-60, 100, 20, "FTP-Server:")
      TextGadget(#Text_1, (#WindowWidth/2)-200, (#WindowHeight/2)-30, 100, 20, "Port:")
      TextGadget(#Text_2, (#WindowWidth/2)-200, (#WindowHeight/2)   , 100, 20, "Username:")
      TextGadget(#Text_3, (#WindowWidth/2)-200, (#WindowHeight/2)+30, 100, 20, "Password:")
      StringGadget(#SERVER, (#WindowWidth/2)-100, (#WindowHeight/2)-60, 300, 20, Server, #PB_String_BorderLess)
      StringGadget(#PORT, (#WindowWidth/2)-100, (#WindowHeight/2)-30, 300, 20, Str(Port), #PB_String_BorderLess)
      StringGadget(#USER, (#WindowWidth/2)-100, (#WindowHeight/2)   , 300, 20, Username, #PB_String_BorderLess)
      StringGadget(#PASS, (#WindowWidth/2)-100, (#WindowHeight/2)+30, 300, 20, Password, #PB_String_Password | #PB_String_BorderLess)
      ButtonGadget(#LOGIN, (#WindowWidth/2)-200, (#WindowHeight/2)+70, 400, 30, "Login", #PB_Button_Default)
      CloseGadgetList()
      
      ContainerGadget(#MAIN, 0, 0, 640, 480, #PB_Container_Flat)
      
      ListIconGadget(#FILES, 9, 9, 460, 460, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      AddGadgetColumn(#FILES, 2, "Size (kilobytes)", 100)
      AddGadgetColumn(#FILES, 3, "Rights", 100)
      ButtonGadget(#DOWN, 479, 9, 150, 28, "Download")
      ButtonGadget(#UP, 479, 39, 150, 28, "Upload")
      ButtonGadget(#DELE, 479, 69, 150, 28, "Delete")
      ButtonGadget(#LOGOUT, 479, 439, 150, 28, "Logout")
      ButtonGadget(#ABOUT, 479, 409, 150, 28, "About...")
      ButtonGadget(#REFRESH, 479, 99, 150, 28, "Refresh")
      ButtonGadget(#RENAME, 479, 129, 150, 28, "Rename")
      ButtonGadget(#CHMOD, 479, 159, 150, 28, "Change rights")
      ButtonGadget(#CMD, 479, 189, 150, 28, "Command")
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
       FlatGadgetAll(#STARTGADGET+1, #STOPGADGET-1)
      CompilerEndIf
      CloseGadgetList()
      HideGadget(#MAIN, 1)
      
      Repeat
        Event = WindowEvent()
        If ConnectionID <> 0
          HideGadget(#LOG, 1)
          HideGadget(#MAIN, 0)
          If ElapsedMilliseconds()-NoEventTime >= 10000
            SetGadgetState(#PROGRESS, 0)
            FTP_NoEvent(ConnectionID)
            NoEventTime = ElapsedMilliseconds()
          EndIf
        Else
          HideGadget(#LOG, 0)
          HideGadget(#MAIN, 1)
        EndIf
        Select Event
          Case #PB_Event_CloseWindow
            Quit = 1
          Case #PB_Event_Gadget
            Select EventGadgetID()
              Case #CMD
                command.s = InputRequester("Command", "Run this command:", "")
                If command
                  If FTP_CMD(ConnectionID, command)
                    UpdateFiles(ConnectionID)
                  EndIf
                EndIf
              Case #CHMOD
                chmod.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                chmod = Open_Chmod(chmod.s)
                FTP_CHMOD(ConnectionID, File, chmod)
                UpdateFiles(ConnectionID)
              Case #LOGIN
                ConnectionID = FTP_Connect(Server, Port, Username.s, Password.s)
                If ConnectionID
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
                EndIf
              Case #FILES
                If EventType() = #PB_EventType_LeftDoubleClick
                  File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                  Rights.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
                  If Left(Rights, 1) = "d"
                    SetDirectory(ConnectionID, File)
                  EndIf
                EndIf
              Case #DOWN
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                If File <> ""
                FTP_DownloadFile(ConnectionID, File, SaveFileRequester("Download as...", "", "All Files|*.*", 1))
                UpdateFiles(ConnectionID)
                EndIf
                NoEventTime = ElapsedMilliseconds()
              Case #UP
                File.s = OpenFileRequester("Upload ...", "", "All Files|*.*", 1)
                If File <> ""
                FTP_UploadFile(ConnectionID, File, GetFilePart(File))
                UpdateFiles(ConnectionID)
                EndIf
                NoEventTime = ElapsedMilliseconds()
              Case #DELE
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                FTP_DeleteFile(ConnectionID, GetFilePart(File))
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
              Case #REFRESH
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
              Case #ABOUT
                MessageRequester("About...", "Created by Daniel B."+Chr(10)+"http://www.bradan.net/")
              Case #LOGOUT
                If ConnectionID : FTP_Quit(ConnectionID) : ConnectionID = 0 : EndIf
              Case #RENAME
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                ToName.s = InputRequester("Rename to...", "Newer filename:", ToName.s)
                If File And ToName.s <> File And ToName.s <> ""
                FTP_RenameFile(ConnectionID, File.s, ToName.s)
                UpdateFiles(ConnectionID)
                EndIf
              Default
                Server = GetGadgetText(#SERVER)
                Port = Val(GetGadgetText(#PORT))
                Username = GetGadgetText(#USER)
                Password = GetGadgetText(#PASS)
            EndSelect
          Case #PB_Event_Repaint
          Default
            Delay(10)
        EndSelect
      Until Quit = 1
      
  EndIf
EndIf

FreeImage(1)
FreeImage(2)

If ConnectionID
  FTP_Quit(ConnectionID)
EndIf

SavePreferences()
; IDE Options = PureBasic 3.93 Beta 1 (Linux)
; CursorPosition = 625
; FirstLine = 611
; Folding = ----H
; Executable = /root/Linux/purebasic/Eigene_Programme/Bradan FTP/Bradan FTP
Oder sag mir was ich einbauen soll.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Also den SplashScreen werde ich entfernen, da die Grafik allein 700kB verbraucht. Dann möchte ich zum Beispiel beim Dialog zur Attributänderung einen Test einbauen, ob überhaupt etwas geändert wurde und solche Sachen.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

bluejoke hat geschrieben:Also den SplashScreen werde ich entfernen, da die Grafik allein 700kB verbraucht. Dann möchte ich zum Beispiel beim Dialog zur Attributänderung einen Test einbauen, ob überhaupt etwas geändert wurde und solche Sachen.
Ja, den werde ich zu jpeg oder png konvertieren und wieder einbauen, aber den source brauche ich dann halt noch ^^.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: FTP-Programm

Beitrag von schleicher »

wenn jeman mal die Zeil finden würde den Code an PB 5 anzupassen fände ich das Klasse.
Wenn ich es könnte würde ich es selber tun.
Purebasic 5.51
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: FTP-Programm

Beitrag von schleicher »

Ich habe mich doch selber drüber hergemachtund mein möglichstes versucht, das Ding wieder zum laufen zu bekommen. Habe den Code für PB 5.21 angepasst. Hier ist er

Code: Alles auswählen

Enumeration
  #STARTGADGET
  #MAIN
  #FILES
  #DOWN
  #UP
  #DELE
  #LOGOUT
  #ABOUT
  #REFRESH
  #RENAME
  #CHMOD
  #LOG
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #SERVER
  #PORT
  #USER
  #PASS
  #LOGIN
  #PROGRESS_INFO
  #PROGRESS
  #CMD
  #STOPGADGET
  #Text_00
  #Text_10
  #Text_20
  #Text_30
  #Text_40
  #Text_50
  #USER_READ
  #GROUP_READ
  #WORLD_READ
  #USER_WRITE
  #GROUP_WRITE
  #WORLD_WRITE
  #USER_RUN
  #GROUP_RUN
  #WORLD_RUN
  #NUMERIC
  #WORDS
  #OK
EndEnumeration

LoadImage(1, "BIN\file.ico")
LoadImage(2, "BIN\folder.ico")

InitNetwork()

Global EOL.s
EOL.s = Chr(13)+Chr(10)

Procedure.s Open_Chmod(chmod.s)
  If OpenWindow(1, 0, 0, 320, 240,"CHMOD",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered  )
    
      TextGadget(#Text_00, 10, 40, 80, 20, "Owner:")
      TextGadget(#Text_10, 10, 70, 80, 20, "Group:")
      TextGadget(#Text_20, 10, 100, 80, 20, "World:")
      TextGadget(#Text_30, 120, 10, 50, 20, "Read", #PB_Text_Center)
      TextGadget(#Text_40, 190, 10, 50, 20, "Write", #PB_Text_Center)
      TextGadget(#Text_50, 260, 10, 50, 20, "Run", #PB_Text_Center)
      
      CheckBoxGadget(#USER_READ, 140, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_READ, 140, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_READ, 140, 100, 20, 20, "")
      CheckBoxGadget(#USER_WRITE, 210, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_WRITE, 210, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_WRITE, 210, 100, 20, 20, "")
      CheckBoxGadget(#USER_RUN, 280, 40, 20, 20, "")
      CheckBoxGadget(#GROUP_RUN, 280, 70, 20, 20, "")
      CheckBoxGadget(#WORLD_RUN, 280, 100, 20, 20, "")
      
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      StringGadget(#NUMERIC, 10, 150, 300, 20, "000", #ESB_DISABLE_RIGHT)
      If chmod = ""
      StringGadget(#WORDS, 10, 180, 300, 20, "----------", #ESB_DISABLE_RIGHT)
      Else
      StringGadget(#WORDS, 10, 180, 300, 20, chmod, #ESB_DISABLE_RIGHT)
      EndIf
    CompilerElse
      StringGadget(#NUMERIC, 10, 150, 300, 20, "000")
      If chmod = ""
      StringGadget(#WORDS, 10, 180, 300, 20, "----------")
      Else
      StringGadget(#WORDS, 10, 180, 300, 20, chmod)
      EndIf
    CompilerEndIf
      
      ButtonGadget(#OK, 10, 210, 300, 20, "OK")
      
      
      
      Repeat
     
      If WindowID(0)
      Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Q = 1
      Case #PB_Event_Gadget
        Case #OK
        
          chmod = GetGadgetText(#NUMERIC)
          Q = 1
        If GID >= #USER_READ And GID <= #WORLD_RUN
          User1.s = Str(GetGadgetState(#USER_READ)*4+GetGadgetState(#USER_WRITE)*2+GetGadgetState(#USER_RUN)*1)
          Group1.s = Str(GetGadgetState(#GROUP_READ)*4+GetGadgetState(#GROUP_WRITE)*2+GetGadgetState(#GROUP_RUN)*1)
          World1.s = Str(GetGadgetState(#WORLD_READ)*4+GetGadgetState(#WORLD_WRITE)*2+GetGadgetState(#WORLD_RUN)*1)
          
          SetGadgetText(#NUMERIC, User1+Group1+World1)
          
          Num.s = GetGadgetText(#NUMERIC)
          
          User2.l = Val(Mid(Num, 1, 1))
          Group2.l = Val(Mid(Num, 2, 1))
          World2.l = Val(Mid(Num, 3, 1))
          
          Txt.s = GetGadgetText(#WORDS)
          
          If User2 & 4
          PokeB(@Txt+1, 'r')
          Else
          PokeB(@Txt+1, '-')
          EndIf
          If User2 & 2
          PokeB(@Txt+2, 'w')
          Else
          PokeB(@Txt+2, '-')
          EndIf
          If User2 & 1
          PokeB(@Txt+3, 'x')
          Else
          PokeB(@Txt+3, '-')
          EndIf
          
          If Group2 & 4
          PokeB(@Txt+4, 'r')
          Else
          PokeB(@Txt+4, '-')
          EndIf
          If Group2 & 2
          PokeB(@Txt+5, 'w')
          Else
          PokeB(@Txt+5, '-')
          EndIf
          If Group2 & 1
          PokeB(@Txt+6, 'x')
          Else
          PokeB(@Txt+6, '-')
          EndIf
          
          If World2 & 4
          PokeB(@Txt+7, 'r')
          Else
          PokeB(@Txt+7, '-')
          EndIf
          If World2 & 2
          PokeB(@Txt+8, 'w')
          Else
          PokeB(@Txt+8, '-')
          EndIf
          If World2 & 1
          PokeB(@Txt+9, 'x')
          Else
          PokeB(@Txt+9, '-')
          EndIf
          
          SetGadgetText(#WORDS, Txt)
        ElseIf GID = #NUMERIC
          Num.s = GetGadgetText(#NUMERIC)
          
          User2.l = Val(Mid(Num, 1, 1))
          Group2.l = Val(Mid(Num, 2, 1))
          World2.l = Val(Mid(Num, 3, 1))
          
          SetGadgetState(#USER_READ  , User2 & 4)
          SetGadgetState(#USER_WRITE , User2 & 2)
          SetGadgetState(#USER_RUN   , User2 & 1)
          
          SetGadgetState(#GROUP_READ , Group2 & 4)
          SetGadgetState(#GROUP_WRITE, Group2 & 2)
          SetGadgetState(#GROUP_RUN  , Group2 & 1)
          
          SetGadgetState(#WORLD_READ , World2 & 4)
          SetGadgetState(#WORLD_WRITE, World2 & 2)
          SetGadgetState(#WORLD_RUN  , World2 & 1)
          
          Txt.s = GetGadgetText(#WORDS)
          
          If User2 & 4
          PokeB(@Txt+1, 'r')
          Else
          PokeB(@Txt+1, '-')
          EndIf
          If User2 & 2
          PokeB(@Txt+2, 'w')
          Else
          PokeB(@Txt+2, '-')
          EndIf
          If User2 & 1
          PokeB(@Txt+3, 'x')
          Else
          PokeB(@Txt+3, '-')
          EndIf
          
          If Group2 & 4
          PokeB(@Txt+4, 'r')
          Else
          PokeB(@Txt+4, '-')
          EndIf
          If Group2 & 2
          PokeB(@Txt+5, 'w')
          Else
          PokeB(@Txt+5, '-')
          EndIf
          If Group2 & 1
          PokeB(@Txt+6, 'x')
          Else
          PokeB(@Txt+6, '-')
          EndIf
          
          If World2 & 4
          PokeB(@Txt+7, 'r')
          Else
          PokeB(@Txt+7, '-')
          EndIf
          If World2 & 2
          PokeB(@Txt+8, 'w')
          Else
          PokeB(@Txt+8, '-')
          EndIf
          If World2 & 1
          PokeB(@Txt+9, 'x')
          Else
          PokeB(@Txt+9, '-')
          EndIf
          
          SetGadgetText(#WORDS, Txt)
        Else
          Word.s = GetGadgetText(#WORDS)
          
          User1.s = Mid(Word, 2, 3)
          Group1.s = Mid(Word, 5, 3)
          World1.s = Mid(Word, 8, 3)
          
          If Mid(User1, 1, 1)  = "r"                             : SetGadgetState(#USER_READ  , 1)  : Else : SetGadgetState(#USER_READ  , 0)  : EndIf
          If Mid(User1, 2, 1)  = "w"                             : SetGadgetState(#USER_WRITE , 1)  : Else : SetGadgetState(#USER_WRITE , 0)  : EndIf
          If Mid(User1, 3, 1)  = "x" Or Mid(User1, 3, 1)  = "s"  : SetGadgetState(#USER_RUN   , 1)  : Else : SetGadgetState(#USER_RUN   , 0)  : EndIf
          
          If Mid(Group1, 1, 1) = "r"                             : SetGadgetState(#GROUP_READ  , 1) : Else : SetGadgetState(#GROUP_READ  , 0) : EndIf
          If Mid(Group1, 2, 1) = "w"                             : SetGadgetState(#GROUP_WRITE , 1) : Else : SetGadgetState(#GROUP_WRITE , 0) : EndIf
          If Mid(Group1, 3, 1) = "x" Or Mid(Group1, 3, 1)  = "s" : SetGadgetState(#GROUP_RUN   , 1) : Else : SetGadgetState(#GROUP_RUN   , 0) : EndIf
          
          If Mid(World1, 1, 1) = "r"                             : SetGadgetState(#WORLD_READ  , 1) : Else : SetGadgetState(#WORLD_READ  , 0) : EndIf
          If Mid(World1, 2, 1) = "w"                             : SetGadgetState(#WORLD_WRITE , 1) : Else : SetGadgetState(#WORLD_WRITE , 0) : EndIf
          If Mid(World1, 3, 1) = "x" Or Mid(World1, 3, 1)  = "s" : SetGadgetState(#WORLD_RUN   , 1) : Else : SetGadgetState(#WORLD_RUN   , 0) : EndIf
        EndIf
      EndSelect
      Else
      SetActiveWindow(1)
      HideWindow(0,1)
      EndIf
      Until Q = 1
      CloseWindow(1)
      HideWindow(0,0)
      
   
  EndIf
  ProcedureReturn chmod
EndProcedure

Procedure.s PassiveIP(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
  ProcedureReturn IP.s
EndProcedure

Procedure.l PassivePort(Text.s)
  s = FindString(Text, "(", 1)+1
  l = FindString(Text, ")", s)-s
  Host.s = Mid(Text, s, l)
  Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
  ProcedureReturn Port
EndProcedure

Procedure.s Wait(ConnectionID, Timeout)
  Delay(50)
  *Buffer = AllocateMemory(16000)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(10): Wend
  If ElapsedMilliseconds()-t < Timeout
  Size = ReceiveNetworkData(ConnectionID, *Buffer, 16000)
  Text.s = PeekS(*Buffer)
  FreeMemory(*Buffer)
  SetGadgetText(#PROGRESS_INFO, Text)
  ProcedureReturn Text
  EndIf
EndProcedure

Procedure Wait2(ConnectionID, *Buffer, Size, Timeout)
  Delay(50)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) = 0 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
  If ElapsedMilliseconds()-t < Timeout
  CurSize = ReceiveNetworkData(ConnectionID, *Buffer, Size)
  While CurSize < Size
    If NetworkClientEvent(ConnectionID) = 2
    CurSize + ReceiveNetworkData(ConnectionID, *Buffer+CurSize, Size-CurSize)
    EndIf
  Wend
  ProcedureReturn CurSize-1
  EndIf
EndProcedure

Procedure SendNetworkString2(ConnectionID, String.s)
  SetGadgetText(#PROGRESS_INFO, String.s)
  SendNetworkString(ConnectionID, String.s)
EndProcedure

Procedure FTP_Connect(Server.s, Port, Name.s, Pass.s)
  ConnectionID = OpenNetworkConnection(Server, Port)
  If ConnectionID
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "220"
      SendNetworkString2(ConnectionID, "USER "+Name.s+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "331"
        SendNetworkString2(ConnectionID, "PASS "+Pass.s+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "230"
          SendNetworkString2(ConnectionID, "TYPE A"+EOL)
          Wait(ConnectionID, 5000)
          ProcedureReturn ConnectionID
        EndIf
      EndIf
    EndIf
    CloseNetworkConnection(ConnectionID)
  EndIf
EndProcedure

Procedure FTP_SetCurrentDirectory(ConnectionID, Path.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CWD "+Path.s+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      SendNetworkString2(ConnectionID, "PWD"+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "257"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_List(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "LIST"+EOL)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 5000)
          Delay(10)
          Result.s = Wait(Passive, 5000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      Else
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s FTP_NameList(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE A"+EOL)
    Text.s = Wait(ConnectionID, 8000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 8000)
   If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "NLST"+EOL)
        Delay(300)
        Text.s = Wait(ConnectionID, 8000)
        If Left(Text, 3) = "150"
          Text.s = Wait(ConnectionID, 8000)
          Delay(100)
          Result.s = Wait(Passive, 8000)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 8000)
          ProcedureReturn Result
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_DownloadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "RETR "+SFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        s = FindString(Text, "(", 1)+1
        l = FindString(Text, " ", s)-s
        Size = Val(Mid(Text, s, l))
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(1024)
          Text = ""
          s = 0
          If CreateFile(0, DFile)
            While s < Size
              Size2 = ReceiveNetworkData(Passive, *Buffer, 1024)
              If Size2 > 0
                s + Size2
                WriteData(0,*Buffer, Size2)
                SetGadgetState(#PROGRESS, Int((100/Size)*s))
                WindowEvent()
              EndIf
            Wend
            CloseFile(0)
          EndIf
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          Text.s = Wait(ConnectionID, 5000)
          WindowEvent()
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure.l FTP_UploadFile(ConnectionID, SFile.s, DFile.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "TYPE I"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "200"
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "227"
      Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
      If Passive
        SendNetworkString2(ConnectionID, "STOR "+DFile+EOL)
        Delay(100)
        Text.s = Wait(ConnectionID, 5000)
        If Left(Text, 3) = "150"
          *Buffer = AllocateMemory(FileSize(SFile))
          SetGadgetState(#PROGRESS, 25)
          WindowEvent()
          If ReadFile(0, SFile)
            ReadData(0,*Buffer, FileSize(SFile))
            CloseFile(0)
            SetGadgetState(#PROGRESS, 50)
            WindowEvent()
          EndIf
          SendNetworkData(Passive, *Buffer, FileSize(SFile))
          SetGadgetState(#PROGRESS, 75)
          WindowEvent()
          FreeMemory(*Buffer)
          CloseNetworkConnection(Passive)
          SetGadgetState(#PROGRESS, 100)
          WindowEvent()
          Text.s = Wait(ConnectionID, 5000)
          WindowEvent()
          ProcedureReturn 1
        EndIf
        CloseNetworkConnection(Passive)
      EndIf
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_DeleteDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RMD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_CHMOD(ConnectionID, File.s, Rights.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "SITE chmod "+Rights+" "+File+EOL)
    Text.s = Wait(ConnectionID, 5000)
  EndIf
EndProcedure

Procedure FTP_CMD(ConnectionID, CMD.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, CMD.s+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "500"
      SendNetworkString2(ConnectionID, "SITE "+CMD.s+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "500"
        ProcedureReturn 1
      EndIf
    Else
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_Rename(ConnectionID, FromName.s, ToName.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "RNFR "+FromName+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "350"
      SendNetworkString2(ConnectionID, "RNTO "+ToName+EOL)
      Text.s = Wait(ConnectionID, 5000)
      If Left(Text, 3) = "250"
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure FTP_Delete_File(ConnectionID, File.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "DELE "+File+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_CreateDirectory(ConnectionID, Dir.s)
  If ConnectionID
    SendNetworkString2(ConnectionID, "MKD "+Dir+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "257"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_DirectoryUp(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "CDUP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "250"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FTP_NoEvent(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "NOOP"+EOL)
    Text.s = Wait(ConnectionID, 5000)
  EndIf
EndProcedure

Procedure FTP_Quit(ConnectionID)
  If ConnectionID
    SendNetworkString2(ConnectionID, "PASV"+EOL)
    Text.s = Wait(ConnectionID, 5000)
    If Left(Text, 3) = "221"
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

;-Program
NewList CurrentDirectory.s()
Global Username.s, Password.s, Server.s, Port.l

Procedure UpdateFiles(ConnectionID)
  ClearGadgetItems(#FILES)
  Files.s = RemoveString(FTP_List(ConnectionID), Chr(13))
  Debug Files.s
  
  While FindString(Files, "  ", 0) : Files = ReplaceString(Files, "  ", " ") : Wend
  For k=1 To CountString(Files, Chr(10))
    Line.s = StringField(Files, k, Chr(10))
    If Trim(Line) <> ""
      If Left(StringField(Line, 1, " "), 1) = "d"
      AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), ImageID(2))
      Else
      AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), ImageID(1))
      EndIf
    EndIf
  Next
EndProcedure

Procedure SetDirectory(ConnectionID, Dir.s)
  NewList CurrentDirectory.s()
  
  Select Trim(Dir)
    Case "."
      ClearList(CurrentDirectory())
      FTP_SetCurrentDirectory(ConnectionID, "/")
    Case ".."
      LastElement(CurrentDirectory())
      DeleteElement(CurrentDirectory())
      ForEach CurrentDirectory()
        CurDir.s + "/" + CurrentDirectory()
      Next
      If CurDir = "" : CurDir = "/" : EndIf
      FTP_SetCurrentDirectory(ConnectionID, CurDir)
    Default
      LastElement(CurrentDirectory())
      AddElement(CurrentDirectory())
      CurrentDirectory() = Dir
      ForEach CurrentDirectory()
        CurDir.s + "/" + CurrentDirectory()
      Next
      FTP_SetCurrentDirectory(ConnectionID, CurDir)
  EndSelect
  UpdateFiles(ConnectionID)
EndProcedure

Procedure Decode(*Text, Size)
  For k=0 To Size-1
    PokeB(*Text+k, PeekB(*Text+k)+k)
  Next
EndProcedure

Procedure Encode(*Text, Size)
  For k=0 To Size-1
    PokeB(*Text+k, PeekB(*Text+k)-k)
  Next
EndProcedure

Procedure LoadPreferences()
  If OpenPreferences("pref.ini")
  
  PreferenceGroup("CONNECTION")
  Username = ReadPreferenceString("USER", "Guest")
  Password = ReadPreferenceString("PASS", "Gtcpp")
  Server   = ReadPreferenceString("SERVER", "ftp.host.com")
  Port     = ReadPreferenceLong("PORT", 21)
  Decode(@Password, Len(Password))
  
  ClosePreferences()
  EndIf
EndProcedure

Procedure SavePreferences()
  CreatePreferences("pref.ini")
  
  PreferenceGroup("CONNECTION")
  Encode(@Password, Len(Password))
  WritePreferenceString("USER", Username)
  WritePreferenceString("PASS", Password)
  WritePreferenceString("SERVER", Server)
  WritePreferenceLong("PORT", Port)
  Decode(@Password, Len(Password))
  
  ClosePreferences()
EndProcedure

LoadPreferences()

#WindowWidth = 640
#WindowHeight = 480

UseJPEGImageDecoder()

LoadImage(0, "BIN\Logo.jpg")
OpenWindow(0, 0, 0, 640, 480, "Bradan FTP Client",#PB_Window_BorderLess | #PB_Window_ScreenCentered )


ImageGadget(0, 0, 0, 640, 480, ImageID(0))

t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : Until ElapsedMilliseconds()-t > 1500
FreeImage(0)
CloseWindow(0)


If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight+40,"Bradan FTP", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar  )
  

      
      ProgressBarGadget(#PROGRESS, #WindowWidth/2, #WindowHeight, #WindowWidth/2, 20, 0, 100)
      TextGadget(#PROGRESS_INFO, 0, #WindowHeight, #WindowWidth/2, 40, "Progressinformation")
      ;CloseGadgetList()
      
      ContainerGadget(#LOG, 0, 0, 640, 480, #PB_Container_Flat)
      TextGadget(#Text_0, (#WindowWidth/2)-200, (#WindowHeight/2)-60, 100, 20, "FTP-Server:")
      TextGadget(#Text_1, (#WindowWidth/2)-200, (#WindowHeight/2)-30, 100, 20, "Port:")
      TextGadget(#Text_2, (#WindowWidth/2)-200, (#WindowHeight/2)   , 100, 20, "Username:")
      TextGadget(#Text_3, (#WindowWidth/2)-200, (#WindowHeight/2)+30, 100, 20, "Password:")
      StringGadget(#SERVER, (#WindowWidth/2)-100, (#WindowHeight/2)-60, 300, 20, Server, #PB_String_BorderLess)
      StringGadget(#PORT, (#WindowWidth/2)-100, (#WindowHeight/2)-30, 300, 20, Str(Port), #PB_String_BorderLess)
      StringGadget(#USER, (#WindowWidth/2)-100, (#WindowHeight/2)   , 300, 20, Username, #PB_String_BorderLess)
      StringGadget(#PASS, (#WindowWidth/2)-100, (#WindowHeight/2)+30, 300, 20, Password, #PB_String_Password | #PB_String_BorderLess)
      ButtonGadget(#LOGIN, (#WindowWidth/2)-200, (#WindowHeight/2)+70, 400, 30, "Login", #PB_Button_Default)
      CloseGadgetList()
      
      ContainerGadget(#MAIN, 0, 0, 640, 480, #PB_Container_Flat)
      
      ListIconGadget(#FILES, 9, 9, 460, 460, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      AddGadgetColumn(#FILES, 2, "Size (kilobytes)", 100)
      AddGadgetColumn(#FILES, 3, "Rights", 100)
      ButtonGadget(#DOWN, 479, 9, 150, 28, "Download")
      ButtonGadget(#UP, 479, 39, 150, 28, "Upload")
      ButtonGadget(#DELE, 479, 69, 150, 28, "Delete")
      ButtonGadget(#LOGOUT, 479, 439, 150, 28, "Logout")
      ButtonGadget(#ABOUT, 479, 409, 150, 28, "About...")
      ButtonGadget(#REFRESH, 479, 99, 150, 28, "Refresh")
      ButtonGadget(#RENAME, 479, 129, 150, 28, "Rename")
      ButtonGadget(#CHMOD, 479, 159, 150, 28, "Change rights")
      ButtonGadget(#CMD, 479, 189, 150, 28, "Command")
      CloseGadgetList()
      HideGadget(#MAIN, 1)
      
      Repeat
        Event = WindowEvent()
        If ConnectionID <> 0
          HideGadget(#LOG, 1)
          HideGadget(#MAIN, 0)
          
          If ElapsedMilliseconds()-NoEventTime >= 8000
            SetGadgetState(#PROGRESS, 0)
            FTP_NoEvent(ConnectionID)
            NoEventTime = ElapsedMilliseconds()
          EndIf
        Else
          HideGadget(#LOG, 0)
          HideGadget(#MAIN, 1)
        EndIf
        Select Event
          Case #PB_Event_CloseWindow
            Quit = 1
          Case #PB_Event_Gadget
            Select EventGadget()
              Case #CMD
                command.s = InputRequester("Command", "Run this command:", "")
                If command
                  If FTP_CMD(ConnectionID, command)
                    UpdateFiles(ConnectionID)
                  EndIf
                EndIf
              Case #CHMOD
                chmod.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                chmod = Open_Chmod(chmod.s)
                FTP_CHMOD(ConnectionID, File, chmod)
                UpdateFiles(ConnectionID)
              Case #LOGIN
                ConnectionID = FTP_Connect(Server, Port, Username.s, Password.s)
                If ConnectionID
                 Debug  ConnectionID
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
                EndIf
              Case #FILES
                If EventType() = #PB_EventType_LeftDoubleClick
                  File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                  Rights.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
                  If Left(Rights, 1) = "d"
                    SetDirectory(ConnectionID, File)
                  EndIf
                EndIf
              Case #DOWN
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                If File <> ""
                FTP_DownloadFile(ConnectionID, File, SaveFileRequester("Download as...", "", "All Files|*.*", 1))
                UpdateFiles(ConnectionID)
                EndIf
                NoEventTime = ElapsedMilliseconds()
              Case #UP
                File.s = OpenFileRequester("Upload ...", "", "All Files|*.*", 1)
                If File <> ""
                FTP_UploadFile(ConnectionID, File, GetFilePart(File))
                UpdateFiles(ConnectionID)
                EndIf
                NoEventTime = ElapsedMilliseconds()
              Case #DELE
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                FTP_Delete_File(ConnectionID, GetFilePart(File))
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
              Case #REFRESH
                UpdateFiles(ConnectionID)
                NoEventTime = ElapsedMilliseconds()
              Case #ABOUT
                MessageRequester("About...", "Created by Daniel B."+Chr(10)+"http://www.bradan.net/")
              Case #LOGOUT
                If ConnectionID : FTP_Quit(ConnectionID) : ConnectionID = 0 : EndIf
              Case #RENAME
                File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
                ToName.s = InputRequester("Rename to...", "New filename:", ToName.s)
                If File And ToName.s <> File And ToName.s <> ""
                FTP_Rename(ConnectionID, File.s, ToName.s)
                UpdateFiles(ConnectionID)
                EndIf
              Default
                Server = GetGadgetText(#SERVER)
                Port = Val(GetGadgetText(#PORT))
                Username = GetGadgetText(#USER)
                Password = GetGadgetText(#PASS)
            EndSelect
          Case #PB_Event_Repaint
          Default
            Delay(10)
        EndSelect
      Until Quit = 1
      
  
EndIf

FreeImage(1)
FreeImage(2)

If ConnectionID
  FTP_Quit(ConnectionID)
EndIf

SavePreferences()
; IDE Options = PureBasic 3.93 Beta 1 (Linux)
; CursorPosition = 625
; FirstLine = 611
; Folding = ----H
; Executable = /root/Linux/purebasic/Eigene_Programme/Bradan FTP/Bradan FTP

Schön wäre, wenn er denn auch vollständig funktionieren würde und da brauche ich euer Hilfe. Die Verbindung zu Server passiv funktioniert schonmal, nur listet er nichts auf im Gadget.
Ich habe die Proceduren vefolgt nach dem Login und stellte folgendes fest :
Nach aufruf des Loginbutton ruft er die Procedur Updatefiles auf, geht dann zu Procedur FTP_List und
von da aus zu Procedur wait wo er dann bei der Zeile 293 "

Code: Alles auswählen

While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(10): Wend
hängen bleibt.
Habe schon das Timeout verlängert und mit größeren Buffer versucht, jedoch ohne Erfolg.

Was kann ich noch tun ?

Zum Code gehören noch 2 Ico´s und eine Grafik , falls einer sie braucht zum testen, dann lade ich sie irgendwo rauf.
Purebasic 5.51
Antworten