![]() |
Source (mit Formen) zu einer Konsolenanwendung (IndyFTPDemo)
Hallo Jungs,
Ich frage mich wie ich den Code von der Indy Demo vom FTPServer in eine Konsolenanwendung bekomme. Wie ich es anstelle den Objectinspektor zu verwenden. So fällt es mir sehr Schwer die Ereignisse zu verwenden wo IdFTPServer hat, wenn ich nichteinmal weis wie sie heissen. Für mich als Anfänger ist es sehr schwer. Und "Copy&Paste" Code will ich nun auch nicht haben :/ Wie stelle ich es Geschickt an dies "umzuprogrammieren"? Es handelt sich um folgenden Code:
Delphi-Quellcode:
Ich hoffe ihr versteht mein Problem und habt evtl. Tipps.
unit uFTPServer;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCmdTCPServer, IdFTPList, IdExplicitTLSClientServerBase, IdFTPServer, StdCtrls, IdFTPListOutput; type TForm1 = class(TForm) IdFTPServer1: TIdFTPServer; btnClose: TButton; moNotes: TMemo; procedure IdFTPServer1UserLogin(ASender: TIdFTPServerContext; const AUsername, APassword: string; var AAuthenticated: Boolean); procedure IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext; var VDirectory: string); procedure IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext; var VDirectory: string); procedure IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext; const AFileName: string; var VStream: TStream); procedure IdFTPServer1GetFileSize(ASender: TIdFTPServerContext; const AFilename: string; var VFileSize: Int64); procedure IdFTPServer1StoreFile(ASender: TIdFTPServerContext; const AFileName: string; AAppend: Boolean; var VStream: TStream); procedure IdFTPServer1ListDirectory(ASender: TIdFTPServerContext; const APath: string; ADirectoryListing: TIdFTPListOutput; const ACmd, ASwitches: string); procedure FormCreate(Sender: TObject); procedure IdFTPServer1DeleteFile(ASender: TIdFTPServerContext; const APathName: string); procedure IdFTPServer1ChangeDirectory(ASender: TIdFTPServerContext; var VDirectory: string); procedure btnCloseClick(Sender: TObject); private function ReplaceChars(APath: String): String; function GetSizeOfFile(AFile : String) : Integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; AppDir : String; implementation {$R *.DFM} procedure TForm1.btnCloseClick(Sender: TObject); begin IdFTPServer1.Active := false; close; end; function TForm1.ReplaceChars(APath:String):String; var s:string; begin s := StringReplace(APath, '/', '\', [rfReplaceAll]); s := StringReplace(s, '\\', '\', [rfReplaceAll]); Result := s; end; function TForm1.GetSizeOfFile(AFile : String) : Integer; var FStream : TFileStream; begin Try FStream := TFileStream.Create(AFile, fmOpenRead); Try Result := FStream.Size; Finally FreeAndNil(FStream); End; Except Result := 0; End; end; procedure TForm1.IdFTPServer1ChangeDirectory( ASender: TIdFTPServerContext; var VDirectory: string); begin ASender.CurrentDir := VDirectory; end; procedure TForm1.IdFTPServer1DeleteFile(ASender: TIdFTPServerContext; const APathName: string); begin DeleteFile(ReplaceChars(AppDir+ASender.CurrentDir+'\'+APathname)); end; procedure TForm1.FormCreate(Sender: TObject); begin AppDir := ExtractFilePath(Application.Exename); end; procedure TForm1.IdFTPServer1ListDirectory(ASender: TIdFTPServerContext; const APath: string; ADirectoryListing: TIdFTPListOutput; const ACmd, ASwitches: string); var LFTPItem :TIdFTPListItem; SR : TSearchRec; SRI : Integer; begin ADirectoryListing.DirFormat := doUnix; SRI := FindFirst(AppDir + APath + '\*.*', faAnyFile - faHidden - faSysFile, SR); While SRI = 0 do begin LFTPItem := ADirectoryListing.Add; LFTPItem.FileName := SR.Name; LFTPItem.Size := SR.Size; LFTPItem.ModifiedDate := FileDateToDateTime(SR.Time); if SR.Attr = faDirectory then LFTPItem.ItemType := ditDirectory else LFTPItem.ItemType := ditFile; SRI := FindNext(SR); end; FindClose(SR); SetCurrentDir(AppDir + APath + '\..'); end; procedure TForm1.IdFTPServer1StoreFile(ASender: TIdFTPServerContext; const AFileName: string; AAppend: Boolean; var VStream: TStream); begin if not Aappend then VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate) else VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmOpenWrite) end; procedure TForm1.IdFTPServer1GetFileSize(ASender: TIdFTPServerContext; const AFilename: string; var VFileSize: Int64); Var LFile : String; begin LFile := ReplaceChars( AppDir + AFilename ); try If FileExists(LFile) then VFileSize := GetSizeOfFile(LFile) else VFileSize := 0; except VFileSize := 0; end; end; procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext; const AFileName: string; var VStream: TStream); begin VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmOpenRead); end; procedure TForm1.IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext; var VDirectory: string); begin if not ForceDirectories(ReplaceChars(AppDir + VDirectory)) then begin Raise Exception.Create('Unable to create directory'); end; end; procedure TForm1.IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext; var VDirectory: string); Var LFile : String; begin LFile := ReplaceChars(AppDir + VDirectory); // You should delete the directory here. // TODO end; procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext; const AUsername, APassword: string; var AAuthenticated: Boolean); begin // We just set AAuthenticated to true so any username / password is accepted // You should check them here - AUsername and APassword AAuthenticated := True; end; end. MFG, Real-TTX |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Es handelt sich ja um keine Konsolenanwendung
|
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Er will ja eine draus machen.
|
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
HI,
Zitat:
Lange rede, kurzer Sinn: Du wirst eine Klasse brauchen, die die Ereignissprozeduren kapselt und den FTPServer. Diese verbindest du schön per Hand (im Code) -> fertig Bernhard |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Ja, danke. Der Aufbau ist mir klar, aber trotzdem : Vielen Dank. Ich will ja nur mein alten Code (Perl) nach Delphi Porten. Ich denke ihr habt mir schon ein Stück geholfen. Ich versuchs mal weiter.
Gruß, Real-TTX |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Sorry, ich checks irgendwie nicht :( Kann mir mal jemand mit einem Anfang auf die schnell Helfen? In der Programmhilfe ? Kann ich nicht irgendwie den OI nutzen? Wenn ja? Bekomm ichs nicht auf die Reihe :/
Gruß, Real-TTX |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Hallo,
für den Anfang würde es eventuell genügen, wenn du einfach eine Konsolenanwendung erzeugst und die Unit aus Beitrag #1 dem Projekt hinzufügst. Du musst dann die Form selbst instanzieren, sichtbar wird sie aber nie. Wenn das nicht funktionieren sollte, dann ist immer noch Zeit für Plan B. Die bei den Indy-Komponenten mitgelieferte Online-Hilfe kannst du auch über einen Doppelklick in der Shell öffnen - du bist nicht auf eine funktionierende Delphi Hilfefunktion angewiesen, wenn du auf kontextsensitive Hilfe verzichten kannst. Freundliche Grüße |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Hey Real-TTX!
Ist es Dir wichtig, dass Deine Anwendung als Konsolenanwendung läuft, oder ist Dir nur die Konsole wichtig? Weil wenn Dir nur wichtig ist, dass eine Konsole angezeigt wird, dann kann ich Dir weiterhelfen. Es ist möglich aus einer ganz normalen GUI-Anwendung heraus ein Konsolenfenster zu öffnen. Mittels der Windows API-Befehle AllocConsole und FreeConsole aus der kernel32.dll. Schau mal in die Delphi hilfe; die berät Dich da unter Umständen auch sehr gut weiter (naja versionsabhängig). Ich weis, dies Dir als Anfänger zu empfehlen ist vlt. nich besonders klug, aber wer weis, vlt. willst du Dir ja auch irgendwann einmal noch eine GUI zusätzlich dazuschreiben und möchtest nur eine einzige Datei erzeugen. Du kannst Dir den Beitrag ja einmal für später vormerken. Ich weis ja gar nicht ob Du danach suchst. Ich hoffe Dir geholfen und nicht allzu verwirrt zu haben. Gruß, Brighty edit: @marabu: wäre dies ein Plan B nach deinem Geschmack? ^^ Man kann alle Vorzüge einer GUI mit denen einer Console paaren^^ /edit |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Ja, das wäre kein Problem gewesen aber danke :) Nein mir geht es darum dass ich sie als Konsolen Anwendung starten kann. Sie soll auch als eine Art Service laufen können. (Wenn ich den Compiler Befehl APPTYPE CONSOLE oder wie der heisst weglasse müsste ja nichts erscheinen? So denke ich zumindest. Dann noch die Ausgabe in eine Log schreiben und fertig :D So war das gedacht. Aber wie gesagt ohne den OI bin ich aufgeschmissen :( Wie wäre denn Plan B ? Leider bin ich echt Ratlos, ist warscheinlich ein großes Anfängerproblem aber irgendwie ist es einfach nur CopyPaste wenn ich ohne den OI arbeite - Das ist nicht Sinn der Sache.
Danke für die ganzen Antworten! :) Gruß, Real-TTX |
Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD
Moin,
ich fürchte der Hinweis auf Konsole im Titel und in den Beiträgen ist irreführend. Was du wirklich willst ist ein FTP-Server, der im bedienerlosen Modus arbeitet - und das ist tatsächlich ein Service. Ich empfehle dir ein paar Gänge zurück zu schalten. Vielleicht möchtest du dich mit dem ![]() Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz