Synapse

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Synapse

Beitrag von Cool-Tuc »

Hallo,
ich habe nun ein neues Problem mit Synapse. Und zwar möchte ich beim FTP-Download den Fortschritt anzeigen lassen. Nach intensiver Suche bin ich auf folgenden Linkt gestoßen:

Das ist zwar alles gut dargestellt, funktioniert aber bei mir nicht.
Wenn ich folgende Zuweisung durchführe...

Code: Alles auswählen

ftp.DSock.OnStatus := SockGetCallBack;

- bekomme ich ohne Parameter die Fehlermeldungen:

Code: Alles auswählen

...Error: Wrong number of parameters specified for call to "SockGetCallBack"
 

- bekomme ich mit Parameter die Fehlermeldungen:

Code: Alles auswählen

...Error: Incompatible types: got "untyped" expected "<procedure variable type of procedure(TObject,THookSocketReason,const AnsiString) of object;Register>"
 

Kann mir jemand weiterhelfen...
danke

Udo

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse

Beitrag von theo »

Code: Alles auswählen

    ftp.DSock.OnStatus := @SockGetCallBack;

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Synapse

Beitrag von Cool-Tuc »

...es hat sich leider nichts geändert....
es erscheint die Meldung

Code: Alles auswählen

...Error: Incompatible types: got "<address of procedure(TObject,THookSocketReason,const AnsiString);Register>" expected "<procedure variable type of procedure(TObject,THookSocketReason,const AnsiString) of object;Register>"
 

:cry:

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse

Beitrag von theo »

Ist deine Prozedur denn auch wie im Beispiel eine Methode von z.B. TftpForm ?

Er verlangt ja eine procedure of object

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Synapse

Beitrag von Cool-Tuc »

ja, das wars wohl, nun wird durchkompiliert und das Programm läuft, allerdings wird nur genau einmal in die Routine gesprungen, und zwar wenn der Download beendet ist (HR_SocketClose); die Progressbar wird nicht aktualisiert und es kommen auch keine Daten (übertragene Bits, Bytes oder was auch immer) durch....

Code: Alles auswählen

PROCEDURE TfrmProgressbar.SockGetCallBack(Sender: TObject; Reason: THookSocketReason; const Value: string);
 
  case Reason of
    HR_Connect: // Reset
      lCurrentBytes := 0;
    HR_ReadCount: // Value contains number of bytes;
      BEGIN
        inc(lCurrentBytes, StrToIntDef(Value, 0)); // Increment uploaded bytes
        Progressbar.Position := Round(1000 * (lCurrentBytes / lTotalBytes));
        Application.Processmessages;
      END;

Ich muss wohl noch etwas übersehen haben...

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse

Beitrag von theo »

Da müsste man mehr Code sehen, um etwas zu sagen.

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Synapse

Beitrag von Cool-Tuc »

OK, mehr Code...

hier dir Prozedur für den Download:

Code: Alles auswählen

PROCEDURE TfrmPicPreView.btnDownloadClick(Sender: TObject);
VAR ProcessPicPreView: TProcess;
BEGIN
  // Verbindung aufbauen und Download des Bildes...
  ProcessPicPreView := TProcess.Create(nil);
  IF (FtpLoginHomeServer) THEN BEGIN
    // Download starten...
    sTargetFile := sTargetDirDownload + ''\'' + imgSelImage.Hint;
    IF (NOT FileExists(sTargetFile)) THEN BEGIN
      sHS_FTP_Path_Pic := sHS_FTP_Pic + '/' + sPathOriTarget + '/' + imgSelImage.Hint;
      // ProgressBar setzen...
      lTotalBytes := FtpInstanceHomeServer.FileSize(sHS_FTP_Path_Pic);
      pbPicPreView.Position := 0;
      pbPicPreView.Max := 100;
      pbPicPreView.Visible := TRUE;
      Application.Processmessages;
      FtpInstanceHomeServer.DSock.OnStatus := @SockGetCallBack;
      bResult := FtpGetFile(sHS_FTP_Host, sHS_FTP_Port, sHS_FTP_Path_Pic, sTargetFile, sHS_FTP_User, sHS_FTP_PWD);
      // ProgressBar verstecken...
      IF (pbPicPreView.Visible) THEN  pbPicPreView.Visible := FALSE;
    END;
    // Verbindung trennen...
    FtpLogoutHomeServer;
  END;
  // Prozess freigeben...
  ProcessPicPreView.Free;
END;
 


...und hier für die Funktion "SockGetCallBack"

Code: Alles auswählen

PROCEDURE TfrmPicPreView.SockGetCallBack(Sender: TObject; Reason: THookSocketReason; const Value: string);
BEGIN
  case Reason of
    HR_ReadCount: // Value contains number of bytes;
      BEGIN
        inc(lCurrentBytes, StrToIntDef(Value, 0)); // Increment uploaded bytes
        pbPicPreView.Position := Round(1000 * (lCurrentBytes / lTotalBytes));
        Application.Processmessages;
      END;
  END;
END;


...das wars schon...

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse

Beitrag von theo »

Ja, dachte ich mir.

Du verwendest die Convenience Funktion "FtpGetFile".
Diese created ihr eigenes Objekt intern und hat mit deinem FtpInstanceHomeServer nichts zu tun.
Du musst den FtpGetFile Quellcode rauskopieren und mit FtpInstanceHomeServer kombinieren.

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Synapse

Beitrag von Cool-Tuc »

jau, das wars, hatte ich übersehen....es funzt nun... :lol:

danke

Antworten