Delphi FTP List indeling

Pagina: 1
Acties:

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Ik ben net begonnen met Delphi 4 te leren.
Ben zelf met een FTP proggie bezig en dat valt niet mee zeg!
Verbinding wordt gelegd en ik krijg er ook een overzicht van Dir's en bestanden uit, maar dat overzicht dat door die .List methode wordt terug gegeven is een beetje crappy.
Ik krijg dus een string terug waar alle eigenschappen van het bestand/dir achterelkaar in staat, bijv:

drwxr-xr-x 4096 Mar 1 16:53 www

Da's natuurlijk hartstikke fijn enzo, maar ik zou dus wel heel graag die info een beetje overzichtelijk in kolommen willen zetten (NList geeft alleen namen weer, maar da's niet echt handig). Is er een manier om de String te splitsen en in verschillende kolommen naar te zetten?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Tuurlijk is dat mogelijk.

Gebruik de Copy functie of regex (zit standaard niet in Delphi).

Maar biedt NMFTP niet meer mogelijkheden op dit gebied?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Overweeg eens om een andere component-set te gebruiken: met ICS heb ik goede ervaringen (http://overbyte.alexid.fr/frame_index.html?redirTo=/products/ics.html)
op de site staat daarover:
TFtpCli - FTP client protocol support. Used to send and receive files to/from an FTP server. Also able to do directory and file handling.
De Netmaster componentjes zijn helaas niet geheel bug-vrij... Er zitten (iig in het HTTP-componentje) kleine mem-leaks in.

Localhost, sweet localhost


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Thx!
<----Nog heeeeeeeeeeeeeeel errug newbie in Delphi :D
Hep met copy die String gesplits en de waarden in een StringGrid gepleurd, dan kan je ze gelijk voor navigatie gebruiken ook!
Dat FTP proggie komt er wel!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Probleempje.
Het opdelen van die String gaat allemaal goed.
De opgesplitste delen in een StringGrid zetten ook.
Het probleem is alleen dat hij alleen de eerste regel van de List pakt, opdeelt en in de cellen van de StringGrid pleurt.
Ik krijg dus maar een rij cellen terwijl er toch echt meerdere dir/files op de ftp server voorkomen.
Ik snap er niets meer van.
Gebruik in een Memo dan krijg ik de verschillende rijen weer wel te zien:



//Als er op de connect knop gedrukt wordt dan wordt o.a dit uitgevoerd:


procedure TForm1.BtnConnectClick(Sender: TObject);
begin

if HostAdress.Text <> '' then
ftp.host:=(HostAdress.Text);

if HostPort.Text <> '' then
ftp.Port:=StrToInt(HostPort.Text);

if Username.Text <> '' then
ftp.UserID:=(Username.Text);

if Password.Text <> '' then
ftp.Password:=(Password.Text);

ftp.Connect;
Q:=1; //Q is glob. var. voor regelnummering
ftp.List;

end;



procedure TForm1.ftpListItem(Listing: String);
begin

Memo1.Lines.Add(IntToStr(Q)+': '+Listing);
Inc(Q);

end;


Dit levert dus wel meerder regels op...

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Shit, de indeling van de code wordt niet overgenomen...
Niet echt hadig te lezen zo.

  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op maandag 04 maart 2002 22:46 schreef FallenAngel666 het volgende:
Shit, de indeling van de code wordt niet overgenomen...
Niet echt hadig te lezen zo.
Dan moet je je code tussen [ code ] en [ /code ] zetten (zonder spaties), dan krijg je dus:
code:
1
2
3
H
 o
  i

Wat is je code om het in je StringGrid te pleuren?

Als je niets in een van je textveldjes zet, dan omzeil je mooi de null-pointer assignment (Invalid variant type conversion en zo :r ), maar je gaat wel vrolijk verder :) Is het niet slimmer om alleen verder te gaan als ze ook ALLEMAAL ingevuld zijn? dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ((HostAdress.Text <> '') and
    (HostPort.Text   <> '') and
    (Username.Text   <> '') and
    (Password.Text   <> '') then
  begin
    try
    ftp.host:=(HostAdress.Text);
    ftp.Port:=StrToInt(HostPort.Text);
    ftp.UserID:=(Username.Text);
    ftp.Password:=(Password.Text);

    ftp.Connect;
    except
    on (e Exception) do showMessage(e.Message);
    end;
  end;

De try..except zijn vooral voor de ftp.connect (geen connection of zo, of iets anders, en verder nog voor je StrToInt, want die kan nog een fout geven als je text geen integer is...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Ja, die fouten afvangen heb ik me nog niet mee bezig gehouden. Kan je niet beter een algemene procedure schrijven die alle fouten afvangt en het proggie netjes afsluit als er wat fou loopt trouwnes?
Het is toch maar een oefen proggie om een beetje met Delphi te leren werken.
Die code voor die StringGrid heb ik dus niet meer. M'n hele proggie liep er door in de soep en dus heb ik het eruit gehaald.
Ik was het in iedergeval met behulp van Dynamische Arrays aan ut proberen...misschien kan dat wel helemaal niet trouwens.
Maar zoals ik zei, ik ben nog errug newbie met Delphi.

  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op maandag 04 maart 2002 23:57 schreef FallenAngel666 het volgende:
Ja, die fouten afvangen heb ik me nog niet mee bezig gehouden. Kan je niet beter een algemene procedure schrijven die alle fouten afvangt en het proggie netjes afsluit als er wat fou loopt trouwnes?
Het kan altijd dat tijdens het uitvoeren van een ftp-opdracht er een fout optreed. Offwel, ftp kan goed zelf fouten gooien, die jij moet catchen, euh, excepten dus.
De user-input kun je wel centraal controleren, maar dit soort run-time conflictjes moet je toch lokaal oplossen.
Het is toch maar een oefen proggie om een beetje met Delphi te leren werken.
Die code voor die StringGrid heb ik dus niet meer. M'n hele proggie liep er door in de soep en dus heb ik het eruit gehaald.
Klik klik sringgrid toevoegen, rowcount op nul zetten, en dan: (ik ben overigens niet 100% zeker van de volgorde in Cells (heb hier geen Delphi, en ik zit altijd te k*tten met die twee :) )
code:
1
2
3
4
5
6
7
8
9
procedure TForm1.ftpListItem(listing: String);
begin
  stringGrid1.RowCount := stringGrid1.RowCount + 1;
  stringGrid1.Cells[stringGrid1.RowCount - 1, 0] := copy(listing, startPos, aantal);
  stringGrid1.Cells[stringGrid1.RowCount - 1, 1] := copy(listing, startPos, aantal);
  .
  .
  en zo voor tot je al je kolommen hebt
end;
Ik was het in iedergeval met behulp van Dynamische Arrays aan ut proberen...misschien kan dat wel helemaal niet trouwens.
Ja, dat kan ook, maar dan zit je nog met je weergave :)
Maar zoals ik zei, ik ben nog errug newbie met Delphi.
Geeft niet. Was ik toen ik een half jaar geleden aan mijn STAGE (!!) begon ook >:) :P

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
:D
Bedankt voor de uitleg, heb het nog niet geprobeerd, maar telt ie met die code automatisch alle regels uit die return waarde van dat List commando en zet ze in en aparte rij?
Dat is waar ik voor ga natuurlijk :)
Ik ga het in iedergeval zo snel mogelijk proberen, maar dat wordt wel morgen denk ik :/

  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op dinsdag 05 maart 2002 00:21 schreef FallenAngel666 het volgende:
:D
Bedankt voor de uitleg, heb het nog niet geprobeerd, maar telt ie met die code automatisch alle regels uit die return waarde van dat List commando en zet ze in en aparte rij?
Dat is waar ik voor ga natuurlijk :)
Ik ga het in iedergeval zo snel mogelijk proberen, maar dat wordt wel morgen denk ik :/
Ik ken die hele List eigenlijk niet, maar ik heb gewoon jouw proceure gejat waarin je je string in een memo dumpte, dus als jij die iedere keer aanroept, dan wordt mijn code dus ook iedere keer aangeroepen.

En ja, hij zet ze onder elkaar in een stringgrid.
Eerst vergroot hij het aantal rijen met 1, en dan zet hij de text er in :) Die -1 bij Cells is omdat de array met 0 begint. Want dat is eigenlijk wat een TStringGrid is, een fancy visuele twee dimensionale array van strings :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Hmmm, ik heb ff snel die code getest, hij compileert, maakt verbinding maar ik krijg nix in die StringGrid...
Ik kijk er moregen nog wel ff naar, want nu zit ik er een beetje door, na een hele avond proberen, proberen en NOG NIET LUKKEN! :)

  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op dinsdag 05 maart 2002 00:33 schreef FallenAngel666 het volgende:
Hmmm, ik heb ff snel die code getest, hij compileert, maakt verbinding maar ik krijg nix in die StringGrid...
Ik kijk er moregen nog wel ff naar, want nu zit ik er een beetje door, na een hele avond proberen, proberen en NOG NIET LUKKEN! :)
En als je bij mijn code voor de stringgrid jou oude code ook nog even laat staan zodat hij hem naar de memo gooit? Dan weet je iig dat hij daar komt. Dan is je te debuggen stuk ook wat kleiner :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Hmmm, nog geen reultaat.
Maar nou gaat ik echt slapen hoor!
Morgen is er weer een dag om mijn tijd weer helemaal te verneuken met programma's die gedoemd zijn te mislukken :)
Iig bedankt zover!

  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op dinsdag 05 maart 2002 00:44 schreef FallenAngel666 het volgende:
Hmmm, nog geen reultaat.
Maar nou gaat ik echt slapen hoor!
Morgen is er weer een dag om mijn tijd weer helemaal te verneuken met programma's die gedoemd zijn te mislukken :)
Iig bedankt zover!
Lol :)

Trustuh

Speciale reden overigens dat je de procedure ftpListItem hebt gemaakt? Wordt die ergens in een for-loopje iedere keer aangeroepen of zo? Misschien dat je daar moet gaan zoeken :)

En probeer anders regel voor regel te kijken waar het zit. Zet een breakpoint op ftp.List; (in de kantlijn klikken, wordt dan een rode regel), en stap door je code heen (runnen (F9), en als hij daar gestopt is met F7 regel voor regel doorlopen. Met F8 kan ook, maar dan voert hij aangeroepen procedures wel uit, maar hij laat ze niet stap voor stap doen.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20:17

Delphi32

Heading for the gates of Eden

Op dinsdag 05 maart 2002 00:50 schreef Paul Nieuwkamp het volgende:

Speciale reden overigens dat je de procedure ftpListItem hebt gemaakt? Wordt die ergens in een for-loopje iedere keer aangeroepen of zo? Misschien dat je daar moet gaan zoeken :)
De procedure FTPListItem wordt door de NMFTP component aangeroepen als ie van de server een stukje list binnen krijgt. Wat dat betreft zit de topicstarter op het goede spoor.
En probeer anders regel voor regel te kijken waar het zit. Zet een breakpoint op ftp.List; (in de kantlijn klikken, wordt dan een rode regel), en stap door je code heen (runnen (F9), en als hij daar gestopt is met F7 regel voor regel doorlopen. Met F8 kan ook, maar dan voert hij aangeroepen procedures wel uit, maar hij laat ze niet stap voor stap doen.
Ik zou zekers een breakpoint gaan plaatsen in procedure FTPListItems. Er zijn hier al vaker topics over de NMFTP component geweest, juist over dit onderwerp, en ik heb het nog niet goed zien werken.

Nog een tip trouwens: in \Program Files\Borland\Delphi5\Demos is een dir NetMasters opgenomen, waarin een aantal demo's te vinden zijn. Als ik me goed herinner ook een demo van de FTP component. FF spieken kan geen kwaad :)

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Jah, heb ik al gespiekt en daar wordt gebruik gemaakt van die Memo. Dat is dus zooooooooooooooo onhandig, ik snap echt niet dat een programmeur zulke onzin kan verzinnen.

Om antwoord te geven op die vraag, die List funtcie wordt aangeroepen als er een connectie gemaakt is. Dan krijg je dus een overzicht van alles wat in de homedir van de ftpserver staat. Nou was het mijn bedoeling om die zooi in zo'n tabel te gieten en de navigatie via die tabel te laten verlopen. Maarja, da's dus nniet zo makkelijk als het klink....voor mij niet tenminste.

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Waarom die programmeur daar voor gekozen heeft kan ik wel begrijpen. Maar ik zal eerst wat code pasten, over hoe je je listing in een listview kan proppen, dit is de code van dat voorbeeldje van fastnet. Met daar bij de uitbreiding dat ik naast het memotje nog een listview gesmeten heb die op vsReport staat. (en 3 coloms heeft).
code:
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.NMFTP1ListItem(Listing: String);
var
  ListItem : TListitem;
begin
  Memo1.Lines.Add(IntToStr(Q)+': '+Listing);
  inc(q);
  ListItem := ListView1.Items.Add;
  Listitem.caption := copy(listing,1,10);
  listitem.SubItems.Add(copy(listing,12,4));
  listitem.SubItems.Add(copy(listing,17,6));
end;

Volgens mij heeft hij gekozen voor een memo omdat de colommen die je terug krijgt (listing in dit geval) niet altijd even groot zijn, met een memo krijg je zeker altijd alles terug en raak je niet door copy wat kwijt.

"Then there was the man who drowned crossing a stream with an average depth of six inches."


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Daar heb ik dus ook aan gedacht, maar dat is dus niet zo.
Voor elk deel uit de String zijn een vast aantal characters gereserveerd. Zijn deze niet ingevuld, dan wordt het weer gegeven als een stukje lege string. Dit geldt voor alles behalve de bestands/dirnaam, maar dat maakt niet uit want die staat aan het einde van de String en begint op een vaste index waarde.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Het enige waar ik nog steeds niet zeker van ben is hoe de List methode de returnwaarde prcies teruggeeft.
In iedergeval niet als een grote string waar alles in bijelkaar gepleurd is. Volgens mij via een soort Array van strings, als dat zo is en je kan het net zolas een array benaderen, zou dat wel makkelijk zijn.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
Heb het nu bijna voor elkaar.
Alleen zet ie het nog verkeerd neer :)
Rijen en Kolommen omgedraaid....DOH!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:49
code:
1
2
3
4
5
      StringGrid1.Cells[0,Q] := Copy(Listing, 56,100);
      StringGrid1.Cells[1,Q] := Copy(Listing, 32,10 );
      StringGrid1.Cells[2,Q] := Copy(Listing, 1,12 );
      StringGrid1.Cells[3,Q] := Copy(Listing, 43,13 );
Inc(Q);

TADAAAAAAAAAAAA!
Bedankt voor alle hulp mensen, anders was ik er zeer zeker never uit gekomen!
Voordat dit proggie eindelijk is alles doet wat ie moet doen, zien jullie me hier vast nog wel eens terug.....een keer of 1000 :)
Pagina: 1