Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Daten aktualisieren sich nicht (https://www.delphipraxis.net/169202-daten-aktualisieren-sich-nicht.html)

Curry 4. Jul 2012 18:28

Daten aktualisieren sich nicht
 
Hallo liebes Forum,

Ich hab mich an ein neues Projekt mit Delphi7 angefangen, dessen Grundlage darin besteht das einmal pro Sekunde eine Datei von einem FTP server gelesen wird und anschließend in einem memo angezeigt wird.

Auf meinem eigenen Rechner funktioniert dies ohne Probleme. Auf den Rechnern zweier Freunde hingegen wird die betreffende Datei nur einmal zu Anfang geladen - danach wird sie nicht mehr aktualisiert.

Hier die entsprechende Stelle:

Delphi-Quellcode:
procedure TFOrm1.ftpschleife;
var
ergebnis: boolean;
programpath: string;
begin

  programpath:=ExtractFilePath(Application.Exename) ;
 
    while schalter do begin
     ergebnis:=getfile(ftp_array[1],ftp_array[2],ftp_array[3],ftp_array[4]+'tracer.txt',programpath+'tracer.rax');
     utime.Delay(500);
    try
        memo1.Lines.LoadFromFile(programpath+'tracer.rax');
    except
        edit1.Text:= 'Fehler beim einlesen der Datei!';
        end;
    memo1.Lines.LoadFromFile(programpath+'tracer.rax');
  end;

end;
im ftp_array befinden sich die Serverdaten.

Hier noch die verwendete getfile Funktion:
Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;
Bei mir funktioniert das alles ohne Probleme.
Deswegen hab ich Probleme damit eine Lösung zu finden.

lg

EDIT: Also um das Problem etwas genauer zu beschreiben: Die Zieldatein ("tracer.rax") aktualsiert sich nicht. Trotzdem is die variable "ergebnis" immer true.
Wenn meine Freunde die Datei ("tracer.rax") während das Programm läuft bearbeiten, wird die Änderung immerwieder rückgängig gemacht und der ursprüngliche Inhalt (das was auch im memo steht) wird wieder in Datei geschrieben.

NickelM 4. Jul 2012 19:09

AW: Daten aktualisieren sich nicht
 
Ändere mal FTPGetFile so ab:
Delphi-Quellcode:

Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, fmCreate, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_RELOAD, 0);
fmCreate erstellt direkt die Datei neu.
INTERNET_FLAG_RELOAD Flag sagt dem Server er soll die Datei direkt vom Server holen nicht vom Cache.
Die WinInet APIs haben für sowas immer einen Cache und wenn man nicht direkt sagt, er soll die geänderte Datei abrufen nihmt er die Datei, die er bereits runtergeladen hat.

EDIT: Ach und mach mal bei deiner getFile Funktion immer try...finally rein. Die anderen Handles musst du auch mit InternetCloseHandle beenden.

Gruß NickelM

Dalai 4. Jul 2012 19:12

AW: Daten aktualisieren sich nicht
 
Wie wär's, das Delay erstmal zum Test deutlich nach oben zu schrauben? Ne halbe Sekunde (laut Quellcode) ist verdammt wenig, vor allem dann, wenn der FTP irgendwo im Internet steht.

Davon abgesehen verstehe ich diesen Teil überhaupt nicht:
Delphi-Quellcode:
while schalter do begin
     ergebnis:=getfile(ftp_array[1],ftp_array[2],ftp_array[3],ftp_array[4]+'tracer.txt',programpath+'tracer.rax');
     utime.Delay(500);
    try
        memo1.Lines.LoadFromFile(programpath+'tracer.rax');
    except
        edit1.Text:= 'Fehler beim einlesen der Datei!';
        end;
    memo1.Lines.LoadFromFile(programpath+'tracer.rax');
  end;
Nehmen wir an, das LoadFromFile im try knallt (weiß grad nicht, ob diese Methode überhaupt eine Exception auslöst), dann wird im except fortgesetzt und dort ein Text ausgegeben. Soweit in Ordnung. Aber warum versuchst du gleich danach noch einmal, den Knall zu wiederholen (dann ohne try..except)?

MfG Dalai

Curry 4. Jul 2012 19:24

AW: Daten aktualisieren sich nicht
 
Danke für deine Antwort.

Sowohl auf meinem Rechner wie auch auf denen meiner Freunde wird das File nun einmal am Anfang geladen. Danach wird "ergebnis" false.

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, fmCreate, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_RELOAD, 0);
  InternetCloseHandle(hconnect);
end;
EDIT: Ich hab den delay auf 3000 gesetzt ohne Veränderung.
Ja - im except fehlt noch ein exit.

NickelM 4. Jul 2012 19:33

AW: Daten aktualisieren sich nicht
 
Zitat:

Zitat von NickelM (Beitrag 1173571)
EDIT: Ach und mach mal bei deiner getFile Funktion immer try...finally rein. Die anderen Handles musst du auch mit InternetCloseHandle beenden.

Verweise nochmal darauf, da ich dass nachdräglich gemacht habe.
Die WinInet-API für FTP ist so konzipiert das du nur eine Datei Pro Seesion downloaden oder hochladen kannst. Deshalb auch der try...finally Block für jeden HINTERNET Handle den du hast.

Ändere mach das so ab:

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  try
    hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    try
      Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, fmCreate, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_RELOAD, 0);
    finally
      InternetCloseHandle(hconnect);
    end;  
  finally
    InternetCloseHandle(hopen);
  end;
end;
Und @Dalai: Eigentlich brauch er gar kein Delay, da FTPGetFile erst zurückgibt in diesem Fall, wenn er die Datei hat oder wenn es fehlschlägt.

Gruß NickelM

himitsu 4. Jul 2012 19:35

AW: Daten aktualisieren sich nicht
 
[edit] Mist, editiert, statt mich selbst zitiert, um den Code zu erweitern :wall:

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): Boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if hopen <> 0 then begin
    try
      hconnect := InternetConnect(hopen, PChar(server), port, PChar(username), PChar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
      if hconnect <> 0 then begin
        try
          Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
          if not Result then
            RaiseLastOSError;
        finally
          InternetCloseHandle(hconnect);
        end;
      //end else
      //  RaiseLastOSError;
      end else begin
        // hier hatte ich noch InternetGetLastResponseInfo versucht ausgelesen, für eine Exception-Message
        // InternetConnect: An application can also use InternetGetLastResponseInfo to determine why access to the service was denied.
      end
    finally
      InternetCloseHandle(hopen);
    end;
  end else
    RaiseLastOSError;
end;

Dalai 4. Jul 2012 19:42

AW: Daten aktualisieren sich nicht
 
Zitat:

Zitat von Curry (Beitrag 1173574)
Ja - im except fehlt noch ein exit.

OK, aber selbst dann ist die Methode LoadFromFile nach dem try-Block überflüssig, denn warum muss er es im Erfolgsfall doppelt hintereinander machen?

Zitat:

Zitat von NickelM
Und @Dalai: Eigentlich brauch er gar kein Delay, da FTPGetFile erst zurückgibt in diesem Fall, wenn er die Datei hat oder wenn es fehlschlägt.

Stümmt, jetzt wo du's sagst. Ich war bei Timern, aber das is ja gar keiner.

MfG Dalai

Curry 4. Jul 2012 19:53

AW: Daten aktualisieren sich nicht
 
Vielen Dank an alle schonmal

mache mich gleich ans ausprobieren. Vorher aber eine zwischenfrage:

Seit NickelM's FtpGetFile Ansatz ist die tracer.rax nicht mehr im Explorer sichtbar.
Trotzdem scheint sie noch zu existieren, da ich die Fehlermeldung "existiert bereits und ist schreibgeschützt" erhalte wenn ich maneull eine neue erstellen will.

NickelM 4. Jul 2012 20:01

AW: Daten aktualisieren sich nicht
 
Oh ehm ja...Mein Fehler sorry...ersetzt fmCreate wieder durch 0.
In der Doku stand File_Atributes von CreateFile und ich dachte Flags :-D: oops:
Sorry mein Fehler...bin auch nur ein Mensch.

Gruß NickelM
P.S. : Sorry das passiert, wenn man sowas zwischendurch liest und nicht GENAU liest. :oops:

Curry 4. Jul 2012 20:49

AW: Daten aktualisieren sich nicht
 
Vielen Dank nochmal an alle.

Es läuft jetzt :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz