AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Source (mit Formen) zu einer Konsolenanwendung (IndyFTPDemo)
Thema durchsuchen
Ansicht
Themen-Optionen

Source (mit Formen) zu einer Konsolenanwendung (IndyFTPDemo)

Ein Thema von Real-TTX · begonnen am 15. Jun 2008 · letzter Beitrag vom 20. Jun 2008
Antwort Antwort
Seite 1 von 2  1 2      
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Source (mit Formen) zu einer Konsolenanwendung (IndyFTPDemo)

  Alt 15. Jun 2008, 20:25
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:
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.
Ich hoffe ihr versteht mein Problem und habt evtl. Tipps.

MFG, Real-TTX
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 15. Jun 2008, 21:10
Es handelt sich ja um keine Konsolenanwendung
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 15. Jun 2008, 21:38
Er will ja eine draus machen.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 15. Jun 2008, 21:48
HI,

Zitat von Real-TTX:
So fällt es mir sehr Schwer die Ereignisse zu verwenden wo IdFTPServer hat, wenn ich nichteinmal weis wie sie heissen.
ich denke mal, dass du die Quellcodes der Indy-Komponenten vorliegen hast. Dann kannst du mit der Programmierhilfe (die es doch bestimmt noch gibt) die Ereignisse herausfinden (On...). Diese stehen auch genauso, wie sie heißen im OI. Einfach idFTPServer1.OnXXX := TClass.XXX; Einen FTPServer als Konsolenanwendung zu machen ist dann ganz einfach. Du benötigst 2 Threads (Main und den den Indy bereitstellt). Der Hautpthread dient zur Konsolenausgabe und zum empfangen der Events (auch Ctrl+C). Ich denkte mal, dass der Hauptthread die meiste Zeit schlafen wird. Der 2. Thread dient zur Auswertung der FTP-Signale und zu deren Verarbeitung.

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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 16. Jun 2008, 01:16
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
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 19. Jun 2008, 20:15
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 19. Jun 2008, 21:58
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
  Mit Zitat antworten Zitat
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#8

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 19. Jun 2008, 23:17
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
Do you have the email of god??? --- I have to tell him that I'm happy to be born!
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 20. Jun 2008, 01:09
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 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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Source (mit Formen) zu einer Konsolenanwendung (IndyFTPD

  Alt 20. Jun 2008, 07:17
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 Service-Tutorial von MaBuSE beschäftigen?

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz