Einzelnen Beitrag anzeigen

H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#35

AW: Delphi 10.4 - Indy und SFTP

  Alt 27. Apr 2023, 17:11
Soo .. und trotzdem verwirrt mich alles - es passiert folgendes: Ich habe jetzt ein Programm das sich kompilieren lässt und dann den Connect sauber hinbekommt.

Delphi-Quellcode:
unit SFTPUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, tgputtylib, tgputtysftp,
  Vcl.Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    InfoLB: TListBox;
    RemoteFilesSG: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    TestSFTP :TTGPuttySFTP;
    function onVerifyHostKey(const host:PAnsiChar;const port:Integer; const fingerprint:PAnsiChar; const verificationstatus:Integer; var storehostkey:Boolean): Boolean;
    procedure Verbinden;
    procedure Trennen;
    procedure DatenAbruf;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  Username = 'name';
  Passwort = 'passwort';
  Host = 'ssh.strato.de';
  Port = 22;

function TForm1.onVerifyHostKey(const host: PAnsiChar; const port: Integer; const fingerprint: PAnsiChar; const verificationstatus: Integer; var storehostkey: Boolean): Boolean;
(* Verhindert einen Abbruch bei Connect *)
begin
  storeHostKey := true;
end;

procedure TForm1.Verbinden;
begin
  TestSFTP.HostName := Host;
  TestSFTP.UserName := UserName;
  TestSFTP.Password := Passwort;
  TestSFTP.Port := Port;
  TestSFTP.OnVerifyHostKey := onVerifyHostkey;
  try
    TestSFTP.Connect;
  except
    on E:Exception do WriteLn('EXCEPTION: ',E.Message);
  end;
  if TestSFTP.Connected then Form1.InfoLB.Items.Insert(0, 'Angeblich verbunden :-)');
end;

procedure TForm1.Trennen;
begin
  TestSFTP.Disconnect;
end;

procedure TForm1.DatenAbruf;
begin
  RemoteFilesSG.RowCount:=1;
  RemoteFilesSG.ColCount:=3;
  RemoteFilesSG.ColWidths[0]:=480;
  RemoteFilesSG.ColWidths[1]:=300;
  RemoteFilesSG.ColWidths[2]:=150;
  RemoteFilesSG.Cells[0,0]:='Name';
  RemoteFilesSG.Cells[1,0]:='Timestamp';
  RemoteFilesSG.Cells[2,0]:='Size';
  TestSFTP.ListDir('');
  if RemoteFilesSG.RowCount>1 then RemoteFilesSG.FixedRows:=1;
  RemoteFilesSG.FixedCols:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TestSFTP := TTGPuttySFTP.Create(true);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Button1.Caption = 'Startthen
  begin
    Verbinden;
    Button1.Caption := 'Ende';
  end else
  begin
    Trennen;
    Application.Terminate;
  end;
end;

end.
Und dann passiert was ganz komisches:

Ich füge im Interface unter
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    InfoLB: TListBox;
    RemoteFilesSG: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
[B] function TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;[/B]
  private
die Funktion für das Listing ein - da wird dann im Compiler nur die Function unterschrieben - klar, ungenügende Forward-Deklaration - aber dann.


Dann füge ich im implementations-Teil die Funktion selber ein:

Delphi-Quellcode:
function TForm1.TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
var StartRow,i:Integer;
begin
  StartRow:=RemoteFilesSG.RowCount;
  RemoteFilesSG.RowCount:=StartRow+Length(Items);
  for i:=0 to Length(Items)-1 do begin
    RemoteFilesSG.Cells[0,StartRow+i]:=Items[i].filename;
    RemoteFilesSG.Cells[1,StartRow+i]:=DateTimeToStr(TTimeZone.Local.ToLocalTime(UnixToDateTime(Items[i].attrs.mtime)));
    if Items[i].attrs.permissions and $F000 = $4000 then
       sgRemoteFiles.Cells[2,StartRow+i]:='<dir>'
    else
       sgRemoteFiles.Cells[2,StartRow+i]:=IntToStr(Items[i].attrs.size);
    end;
  Result:=true;
end;
Da werden dann aber - neben Fehlern in der procedure selber - plötzlich auch im Interface Button1Click und FormCreate unterstrichen. Und auch die Proceduren Verbinden, Trennen und DatenAbruf werden als unbekannt markiert !

Und nun stehe ich da mit meiner Weißheit und verzweifle nur noch.

Vielleicht mag sich das jemand mal ansehen der mehr davon versteht - ich weiß nicht wieso das passiert. Ich hab mal den ganzen Ordner als ZIP angehängt.

Gruss
Hans
Angehängte Dateien
Dateityp: zip SFTPTest.zip (1,36 MB, 2x aufgerufen)
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat