Toon posts:

[Delphi] Close Command werkt niet!?!??!

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vreemd probleem. Ik ben bezig met een FTP client te maken. Nou dat werkt allemaal goed voor wat ik op dit moment heb geprobeerd alleen wanneer ik de geconnect heb met de ftp server en dan de dirlist opvraag kan ik de applicatie niet meer sluiten. Ik bedoel dus echt de applicatie en niet de connectie met de ftp server. De knoppen werken gewoon(dat heb ik met breakpoints getest)maar hij voer op een of andere manier niet het close commando uit en gaat gewoon door. Wie kan mij hiermee helpen. Ik ben geen goeroe maar een begint programmeur dus niet te moeilijk graag. :)

unit Ftp;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Psock, NMFtp, FileCtrl, Grids, ExtCtrls;

type
TForm1 = class(TForm)
NMFTP1: TNMFTP;
btnConnect: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
btnDisconnect: TButton;
StringGrid1: TStringGrid;
btnClose: TButton;
btnCmdList: TButton;
procedure btnConnectClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure NMFTP1Success(Trans_Type: TCmdType);
procedure NMFTP1Connect(Sender: TObject);
procedure btnCmdListClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NMFTP1Success(Trans_Type: TCmdType);
var
I: Integer;
begin
case Trans_Type of
cmdList:
begin
for I := 0 to (StringGrid1.ColCount - 1) do
StringGrid1.Cols[I].Clear;
StringGrid1.RowCount := NMFTP1.FTPDirectoryList.name.Count;
StringGrid1.ColCount := 4;
StringGrid1.Cells[0, 0] := 'Filename';
StringGrid1.Cells[1, 0] := 'File Size';
StringGrid1.Cells[2, 0] := 'Modified Date';
StringGrid1.Cells[3, 0] := 'Attributes';
begin
for I := 0 to (NMFTP1.FTPDirectoryList.name.Count - 1) do
with NMFTP1.FTPDirectoryList do
begin
StringGrid1.Cells[0, I+1] := name[I];
StringGrid1.Cells[1, I+1] := Size[I];
StringGrid1.Cells[2, I+1] := ModifDate[I];
StringGrid1.Cells[3, I+1] := Attribute[I];
end;
end;
end;
end;
end;

procedure TForm1.btnConnectClick(Sender: TObject);
begin
NMFTP1.Host := Edit1.Text;
NMFTP1.Port := 676;
NMFTP1.TimeOut := 10000;
NMFTP1.UserID := Edit2.Text;
NMFTP1.Password := Edit3.Text;
NMFTP1.Connect;
end;

procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
NMFTP1.Disconnect;
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.NMFTP1Connect(Sender: TObject);
begin
NMFTP1.List;
end;

procedure TForm1.btnCmdListClick(Sender: TObject);
begin
NMFTP1Success(cmdList);
end;

end.

Verwijderd

misschien Close; ?? gokje hoor

Verwijderd

Topicstarter
Op dinsdag 23 oktober 2001 15:43 schreef Phalcon het volgende:

procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;
Deze werkt dus niet meer als ik de dirlist heb. Als ik er een breakpoint zet en dan op de close knop druk gaat hij er wel naar toe en voert het uit maar sluit de applicatie niet. :?

Verwijderd

Op dinsdag 23 oktober 2001 15:50 schreef Phalcon het volgende:

[..]

Deze werkt dus niet meer als ik de dirlist heb. Als ik er een breakpoint zet en dan op de close knop druk gaat hij er wel naar toe en voert het uit maar sluit de applicatie niet. :?
En met het X je wil het ook niet??

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

QueryOnClose

misschien ff disconnect commando geven?

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Topicstarter
Disconnect heb ik al geprobeerd. Dat had geen effect. Zelf het kruisje werkt niet. Het lijkt wel of hij alleen nog commando's wil ontvangen. Na deze procedure aanroep lukt het niet meer om te sluiten. Verder werken alle knoppen nog wel.

procedure TForm1.btnCmdListClick(Sender: TObject);
begin
NMFTP1Success(cmdList);
end;

Verwijderd

Het ligt duidelijk aan je ftp component, en óf jij doet iets fout, óf er zit een bug in het component.

Waarschijnlijk doe jij iets fout, maar het is zowiezo verstandig om die componenten van NetMasters niet te gebruiken. Je zou eens kunnen kijken naar de opensource internet componenten van Indy, die zijn een stuk minder buggy dan die van NetMasters.

http://www.nevrona.com/indy/

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 17-09 15:54

mulder

ik spuug op het trottoir

Euuh...

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Op dinsdag 23 oktober 2001 17:31 schreef El_Mundo het volgende:
Euuh...

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Ik heb het geprobeerd maar zonder succes. Bedankt in iedergeval.

Verwijderd

Topicstarter
Op dinsdag 23 oktober 2001 17:26 schreef _JWB_ het volgende:
Het ligt duidelijk aan je ftp component, en óf jij doet iets fout, óf er zit een bug in het component.

Waarschijnlijk doe jij iets fout, maar het is zowiezo verstandig om die componenten van NetMasters niet te gebruiken. Je zou eens kunnen kijken naar de opensource internet componenten van Indy, die zijn een stuk minder buggy dan die van NetMasters.

http://www.nevrona.com/indy/
Bedankt voor de tip ik zal dat eens gaan proberen.

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 23-07 15:18

Tim

Is het niet Form1.Close?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 17-09 15:54

mulder

ik spuug op het trottoir

Op dinsdag 23 oktober 2001 18:07 schreef Timpie2000 het volgende:
Is het niet Form1.Close?
Close doet het zelfde. We bevinden ons inmiddels in Form1.
Wil er aan toevoegen dat Action := caFree *volgens mij* wel een vereiste is, als dat niet werkt is idd iets met het componentje niet helemaal lekker.

oogjes open, snaveltjes dicht


Verwijderd

Bij de main form wordt automatisch Application.Terminate aangeroepen na een Close [tenminste als je bij de CloseQuery de close action niet caNone maakt]

Maar geen idee wat er fout gaat, bij mij doet ie het gewoon.. Naar welke ftp site ga je? Is het bij elke ftp site? Gebeurt het ook als je de computer herstart/niet in de designer etc...

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

Als het goed is bestaat er voor het TNMFTP component ook het commando ABORT (of iets in die richting). Messchien moet je eerst die oproepen voordat je Close doet.

En naast Close en Application.Terminate is er ook nog HALT.

Anders zou ik toch overstappen op de componenten van INDY. Deze bevatten veel minder bugs dan die van FastNet (die zitten er vol mee).

...beter bekend als AMFan


Verwijderd

Eigen schuld. :)
code:
1
2
3
4
procedure TForm1.NMFTP1Disconnect(Sender: TObject);
begin
  NMFTP1.Disconnect;
end;

In 't OnDisconnect event roep je zelf weer Disconnect aan, die weer 't OnDisconnect event aanroept, etc., etc.
Daar is 'ie dan zo druk mee, dat 't form niet eens aan 't echte closen toekomt.

Verwijderd

ipv Close;
Application.Terminate;

Verwijderd

Op dinsdag 23 oktober 2001 20:08 schreef Sire het volgende:
ipv Close;
Application.Terminate;
Ja, laten we daar een gewoonte van maken... |:(

TCustomForm.Close doet uiteindelijk netjes een Release, en die zet een CM_RELEASE message in de message queue.
Voordeel: alle pending messages voor je applicaties worden eerst nog netjes afgehandeld voordat 'ie afgesloten wordt.
Nadeel: soms moet je erbij nadenken... :)

In dit geval werden op de Close van 't mainform eerst alle componenten van dat form gefreed, en NMFTP probeert dat netjes te doen: eerst disconnecten, daarna opruimen. Maar als dat disconnecten in een lus komt, komt 'ie niet aan opruimen toe.

Terminate of Halt heb je vrijwel nooit nodig, en wanneer je 't wel nodig denkt te hebben is 't vaak het gevolg van een ontwerp- of implementatiefout.

Verwijderd

Op dinsdag 23 oktober 2001 20:00 schreef Afterlife het volgende:
..
In 't OnDisconnect event roep je zelf weer Disconnect aan, die weer 't OnDisconnect event aanroept, etc., etc.
Daar is 'ie dan zo druk mee, dat 't form niet eens aan 't echte closen toekomt.
Ah, f*ck tuurlijk. Helemaal overheen gekeken. Toen ik het effe testte gaf hij bij de tweede aanroep van Disconnect een access violation en sprong dus uit die loop; die access violation viel me niet eens zo op omdat ik die componenten niet echt geweldig vind...

Verwijderd

Op dinsdag 23 oktober 2001 21:33 schreef DiFool het volgende:
die access violation viel me niet eens zo op omdat ik die componenten niet echt geweldig vind...
Mee eens, al is de 5.6.4 versie (zie NetMasters) een stuk stabieler dan de versie die bij D5 zit. Nog steeds niet iets wat je aan de serverkant wilt gebruiken, maar voor een niet-multithreaded client doet 'ie het vrij goed.
En da's ook meteen het "nadeel" van Indy: die eist bijna een multithreaded omgeving, en voor vooral beginnende Delphi programmeurs is dat een vrij hoge drempel...

Verwijderd

Topicstarter
Op dinsdag 23 oktober 2001 20:00 schreef Afterlife het volgende:
Eigen schuld. :)
code:
1
2
3
4
procedure TForm1.NMFTP1Disconnect(Sender: TObject);
begin
  NMFTP1.Disconnect;
end;

In 't OnDisconnect event roep je zelf weer Disconnect aan, die weer 't OnDisconnect event aanroept, etc., etc.
Daar is 'ie dan zo druk mee, dat 't form niet eens aan 't echte closen toekomt.
Ik heb dit gedeelte weggehaald maar het probleem blijft hetzelfde. Het vreemde is zodra ik op de connect button druk kan ik mijn applicatie niet meer closen, MAAR ik kan de disconnect button wel gebruiken. Dat vind ik het hele vreemde ervan. Ik gebruik delphi 6 en daar zitten ook de indy files bij maar ik heb echt geen idee hoe ik daar bijvoorbeeld een connectie kan maken met mijn ftp. Misschien dat iemand een voorbeeldje van heeft?? Er staan daar gewoon geen lekkere voorbeelden bij.

  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 16-09 16:22
Waarom geen ICS van www.overbyte.be ?

Verwijderd

Topicstarter
Op woensdag 24 oktober 2001 00:02 schreef Eegee het volgende:
Waarom geen ICS van www.overbyte.be ?
Zal eens even kijken. Bedankt alvast

Verwijderd

Dit probleem heb ik dus ook gehad en helaas is het een bug in het NMFTP component (staat ook op de site van de makers).

Ik heb het zelf opgelost door een nieuw component te kopen, maar waarschijnlijk kan je wel ergens een gratis component vinden.

Verwijderd

Topicstarter
Op woensdag 24 oktober 2001 17:41 schreef Los_Bastardos het volgende:
Dit probleem heb ik dus ook gehad en helaas is het een bug in het NMFTP component (staat ook op de site van de makers).

Ik heb het zelf opgelost door een nieuw component te kopen, maar waarschijnlijk kan je wel ergens een gratis component vinden.
Dat is dus echt beroerd als ze een component erin flikkeren die gewoon zo brak is dat je niet meer kunt closen. Bedankt in iedergeval. Ik ga nu proberen met de componenten proberen van http://www.overbyte.be/ . Die zijn ook gratis.

Verwijderd

Op woensdag 24 oktober 2001 21:12 schreef Phalcon het volgende:

Dat is dus echt beroerd als ze een component erin flikkeren die gewoon zo brak is dat je niet meer kunt closen. Bedankt in iedergeval. Ik ga nu proberen met de componenten proberen van http://www.overbyte.be/ . Die zijn ook gratis.
Ik heb ff heel snel naar je code gekeken, maar de bug in NMFTP ligt niet zozeer in de close procedure, maar in de list procedure. De list procedure hangt heel vaak (bij mij deed ie het af en toe) en gebeurt er gewoon niks. Ik weet niet zeker of dit de reden is dat de close niet werkt, maar dit is iig een erkende bug.

Succes!

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

gebruik als je D6 hebt de indy varianten, debug anders de source of download een goed component.

Ik denk trouwens dat application.terminate wel zal werken, maar is waarschijnlijk te grof geschut...

Cogito Ergo Credo

Pagina: 1