![]() |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Allerdings... denn OnWork muss ja nicht pro Byte feuern! Ich nehme mal an, BytesZuSenden ist die Größe seiner Datei, die er uploaden will.
|
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
BytesZuSenden ist die Grösse der Datei in Bytes. Dies funktioniert beim Download einwandfrei.
Natürlich habe ich auch schon AWorkCountMax anstatt BytesZuSenden versucht, mit dem gleichen Erfolg. Nochmals: Das Ereignis OnWork wird beim Upload überhaupt nicht ausgeführt, beim Download sehr wohl. Dies muss in Indy 10 blockiert sein, in Indy 9 hingegen funktioniert das. Hat vielleicht jemand eine E-Mail-Adresse von irgendeinem Indy-Entwickler, damit ich dort einfach mal die Frage stellen kann, warum dies in Indy 10 nicht mehr funktioniert. mfg Herbert |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Schau doch mal in den Sourcecode. Du solltest anhand der Getter/Setter von OnWork das entsprechende Feld finden und einen eventuellen Aufruf. Vielleicht ist ja tatsächlich nur der Setter kaputt?! Einfach mal ein bisschen debuggen ;)
|
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Zitat:
|
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
@DGL-luke
Was bedeutet Getter/Setter ??? Man müsste halt wissen, wo im Quellcode der Aufruf von OnWork stattfindet, bzw. ob dieser überhaupt stattfindet. mfg Herbert |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Aus der IdComponent (Indy 9)
Delphi-Quellcode:
Hier ist FOnWork einmal der Getter und Setter.
property OnWork: TWorkEvent read FOnWork write FOnWork;
Grüße Klaus |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
@Meflin
Zitat:
Zitat:
Zitat:
Mir wäre ev. auch geholfen, wenn ich eine E-Mail-Adresse von einem Indy-Entwickler erfahren könnte. Auch hier schweigt sich die Indy-Seite zur Gänze aus. mfg Herbert |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Schlag mich grade mit dem Selben Problem rum
Delphi-Quellcode:
und
procedure TForm1.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Integer); begin ProgressBar1.Max := AWorkCountMax; ProgressBar1.Position := 0; end;
Delphi-Quellcode:
Upload Funktioniert aber eben die progressbar nicht
procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer); begin //Aktualisieren der Fortschrittsanzeige: ProgressBar1.Position := AWorkCount; end; |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Könnte Ihr mal überprüfen ob die Methode InternalPut aus der idFTP.pas
mit diese mehr oder weniger übereinstimmt, diese ist von Indy 9: Vielleicht hilft es ja dem Fehler auf die Schliche zu kommen.
Delphi-Quellcode:
Grüße
procedure TIdFTP.InternalPut(const ACommand: string; ASource: TStream; AFromBeginning: Boolean = true);
var LIP: string; LPort: Integer; LResponse: Integer; begin DoStatus(ftpTransfer, [RSFTPStatusStartTransfer]); try if FPassive then begin SendPassive(LIP, LPort); WriteLn(ACommand); FDataChannel := TIdTCPClient.Create(nil); with TIdTCPClient(FDataChannel) do try if (Self.IOHandler is TIdIOHandlerSocket) then begin if not assigned(IOHandler) then begin IOHandler:=TIdIOHandlerSocket.create(nil); end; TIdIOHandlerSocket(IOHandler).SocksInfo.Assign(TIdIOHandlerSocket(Self.IOHandler).SocksInfo); TIdIOHandlerSocket(IOHandler).SocksInfo.IOHandler:=IOHandler; end; InitDataChannel; Host := LIP; Port := LPort; Connect; try Self.GetResponse([110, 125, 150]); try WriteStream(ASource, {false}AFromBeginning); except on E: EIdSocketError do begin // If 10038 - abort was called. Server will return 225 if E.LastError <> 10038 then begin raise; end; end; end; finally Disconnect; end; finally FDataChannel.IOHandler.free; FDataChannel.IOHandler:=nil; FreeAndNil(FDataChannel); end; end else begin FDataChannel := TIdSimpleServer.Create(nil); try with TIdSimpleServer(FDataChannel) do begin InitDataChannel; BoundIP := (Self.IOHandler as TIdIOHandlerSocket).Binding.IP; BoundPort := Self.DataPort; BoundPortMin := Self.DataPortMin; BoundPortMax := Self.DataPortMax; BeginListen; SendPort(Binding); Self.SendCmd(ACommand, [125, 150]); Listen; WriteStream(ASource, AFromBeginning); end; finally FreeAndNil(FDataChannel); end; end; finally DoStatus(ftpReady, [RSFTPStatusDoneTransfer]); end; // 226 = download successful, 225 = Abort successful} LResponse := GetResponse([225, 226, 250, 426, 450]); if (LResponse = 426) or (LResponse = 450) then begin // some servers respond with 226 on ABOR GetResponse([226, 225]); DoStatus(ftpAborted, [RSFTPStatusAbortTransfer]); end; end; procedure TIdFTP.InitDataChannel; begin FDataChannel.SendBufferSize := SendBufferSize; FDataChannel.RecvBufferSize := RecvBufferSize; FDataChannel.OnWork := OnWork; FDataChannel.OnWorkBegin := OnWorkBegin; FDataChannel.OnWorkEnd := OnWorkEnd; end; Klaus [edit] habe gerade festgestellt, daß dies hier nicht die große Hilfe ist, da idFTP wohl sehr große Veränderungen erfahren hat. [/edit] |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Hat jmd zufällig ein Tool zum Vergleichen von 2 Source Codes =P
Delphi-Quellcode:
procedure TIdFTP.InternalPut(const ACommand: string; ASource: TIdStream; AFromBeginning: Boolean = true);
var LIP: string; LPort: Integer; LPasvCl : TIdTCPClient; LPortSv : TIdSimpleServer; begin FAbortFlag.Value := False; //for SSL FXP, we have to do it here because there is no command were a client //submits data through a data port where the SSCN setting is ignored. ClearSSCN; DoStatus(ftpTransfer, [RSFTPStatusStartTransfer]); try if FPassive then begin SendPret(ACommand); if FUsingExtDataPort then begin SendEPassive(LIP, LPort); end else begin SendPassive(LIP, LPort); end; IOHandler.WriteLn(ACommand); FDataChannel := TIdTCPClient.Create(nil); LPasvCl := TIdTCPClient(FDataChannel); try InitDataChannel; LPasvCl.Host := LIP; LPasvCl.Port := LPort; if Assigned(FOnDataChannelCreate) then begin OnDataChannelCreate(self,FDataChannel); end; LPasvCl.Connect; try Self.GetResponse([110, 125, 150]); try if FUsingSFTP and (FDataPortProtection = ftpdpsPrivate) then begin TIdSSLIOHandlerSocketBase(FDataChannel.IOHandler).Passthrough := False; end; if FCurrentTransferMode<>dmDeflate then begin if AFromBeginning then begin FDataChannel.IOHandler.Write(ASource,0, false); // from beginning end else begin FDataChannel.IOHandler.Write(ASource,-1, false); // from current position end; end else begin FCompressor.CompressFTPToIO(ASource,FDataChannel.IOHandler,FZLibCompressionLevel,FZLibWindowBits,FZLibMemLevel, FZLibStratagy); end; except on E: EIdSocketError do begin // If 10038 - abort was called. Server will return 225 if E.LastError <> 10038 then begin raise; end; end; end; finally LPasvCl.Disconnect; end; finally FinalizeDataOperation; end; end else begin FDataChannel := TIdSimpleServer.Create(nil); LPortSv := TIdSimpleServer(FDataChannel); try InitDataChannel; LPortSv.BoundIP := (Self.IOHandler as TIdIOHandlerSocket).Binding.IP; LPortSv.BoundPort := FDataPort; LPortSv.BoundPortMin := FDataPortMin; LPortSv.BoundPortMax := FDataPortMax; if Assigned(FOnDataChannelCreate) then begin OnDataChannelCreate(Self, FDataChannel); end; LPortSv.BeginListen; if FUsingExtDataPort then begin SendEPort(LPortSv.Binding); end else begin SendPort(LPortSv.Binding); end; Self.SendCmd(ACommand, [125, 150]); LPortSv.Listen; if FUsingSFTP and (FDataPortProtection = ftpdpsPrivate) then begin TIdSSLIOHandlerSocketBase(FDataChannel.IOHandler).PassThrough := False; end; if FCurrentTransferMode<>dmDeflate then begin if AFromBeginning then begin FDataChannel.IOHandler.Write(ASource,0, false); // from beginning end else begin FDataChannel.IOHandler.Write(ASource,-1, false); // from current position end; end else begin FCompressor.CompressFTPToIO(ASource,FDataChannel.IOHandler,FZLibCompressionLevel,FZLibWindowBits,FZLibMemLevel, FZLibStratagy); end; finally FinalizeDataOperation; end; end; except //Note that you are likely to get an exception you abort a transfer //hopefully, this will make things work better. on E: EIdConnClosedGracefully do begin if not (E is EIdConnClosedGracefully) then begin raise; end; end; end; { commented out because we might need to revert back to this if new code fails. if (LResponse = 426) or (LResponse = 450) then begin // some servers respond with 226 on ABOR GetResponse([226, 225]); DoStatus(ftpAborted, [RSFTPStatusAbortTransfer]); end; } end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 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