![]() |
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:
im ftp_array befinden sich die Serverdaten.
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; Hier noch die verwendete getfile Funktion:
Delphi-Quellcode:
Bei mir funktioniert das alles ohne Probleme.
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; 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. |
AW: Daten aktualisieren sich nicht
Ändere mal FTPGetFile so ab:
Delphi-Quellcode:
fmCreate erstellt direkt die Datei neu.Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, fmCreate, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_RELOAD, 0); 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 |
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:
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)?
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; MfG Dalai |
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:
EDIT: Ich hab den delay auf 3000 gesetzt ohne Veränderung.
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; Ja - im except fehlt noch ein exit. |
AW: Daten aktualisieren sich nicht
Zitat:
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:
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.
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; Gruß NickelM |
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; |
AW: Daten aktualisieren sich nicht
Zitat:
Zitat:
MfG Dalai |
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. |
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: |
AW: Daten aktualisieren sich nicht
Vielen Dank nochmal an alle.
Es läuft jetzt :) |
AW: Daten aktualisieren sich nicht
Und du meinst jetzt, daß es niemanden interessieren würde, wie/warum es nun geht, wenn irgendwann nochmal jemand soein Problem hat?
|
AW: Daten aktualisieren sich nicht
Ich habe den Lösungsvorschlag von NickelM genommen und fmCreate durch 0 ersetzt.
Delphi-Quellcode:
Deine Lösung gab bei
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, 0, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_RELOAD, 0); finally InternetCloseHandle(hconnect); end; finally InternetCloseHandle(hopen); end; end;
Delphi-Quellcode:
und
if hopen = 0 then
Delphi-Quellcode:
einen Fehler zurück. (aber vllt hab ich auch etwas vergessen zu berücksichtigen).
if hconnect = 0 then begin
|
AW: Daten aktualisieren sich nicht
"Ausführliche" Fehlerbeschreibungen find ich immer sehr gut ... denn da erkennt man eventuell direkt, warum was nicht geht. :wink:
Ich nahm einfach an HINTERNET wäre ein THandle/DWORD, so wie es viele Handles ala HWND oder HRESULT sind. Wie dir bestimmt die Fehlermeldung gesagt hat, paßt 0 und Pointer nicht zusammen, also verwendet mal ganz einfach nil statt 0. Nja, im MSDN steht was von NULL, was bei Delphi-Pointern eben das nil ist, allerdings werden Header leider nicht immer korrekt übersetzt ... drum ist einfsch der Erfahrungswert, statt dem Gelesenem in den Code eingeflossen. :oops: Ich kann dir bei sowas auch immer das MSDN (online) oder Windows PSDK (Plattform SDK zum downloaden) empfehlen, wo man alles zu Windows-APIs wie ![]() PS: Man kann statt der Exceptions auch einfach das jeweils letzte GetLastError als HRESULT zurückgeben und im Erfolgsfall dann NO_ERROR, also statt des nichtssagenden Boolean. So oder so hat man dann immernoch einen auswertbaren Rückgabewert, den man zur Fehleranalyse nutzen kann, um rauszufinden warum was nicht geht. (aber Exceptions sind auch eine Nette Angelegenheit) |
AW: Daten aktualisieren sich nicht
@himitsu : :-D Denkste wie ich mich mit diesen Funktionen beschäftigt habe, woher ich meine Kenntnisse größsten Teils habe...von der Quelle direkt. Ein bischen googlen und schon findet man was man sucht. Einfach mal eine WinAPI gegoogled und siehe da MSDN Seite. In Englisch aber super beschrieben. Wenn man dann auch noch weis, wie man die C++ Paramter in Delphi umsetzt, kann man jede belibige Funktion importieren und benutzen.
Naja es gibt so viele Funktionen, natürlich kann man sich nicht alle Paramter, Flags usw. merken. Wenn ich WinAPI schreibe "spicke" ich auch öfters mal bei MSDN, was nochmal wo hingehört. Aber damit sich manche diese MSDN, die für "Laien" nicht gerade einfach zuverstehen ist, anschauen müssen gibts ja uns Delphilaner, die mal schnell nachgugen und hilfsbereit sind :lol: Gruß NickelM P.S. : Ich geh jetzt Pennen :wiejetzt: Bin zeit 24h wach hallo? :lol: |
AW: Daten aktualisieren sich nicht
Nur 24?
Ein ordentlicher Tag hat mindestens 48. :freak:
Delphi-Quellcode:
Das sind im Prinzip alles Konstanten für erfolgreiche Verarbeitung, hängt halt davon ab, von wo die Fehler kommen, aber im Prinzip isses egal, was man nimmt ... 0 ist 0 :angle:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): HRESULT;
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 if FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0) then Result := NO_ERROR else Result := GetLastError; finally InternetCloseHandle(hconnect); end; end else Result := GetLastError; finally InternetCloseHandle(hopen); end; end else Result := GetLastError; end; // etwas gekürzt/zusammengefasst (man muß nur wissen was wie/wo/warum gemacht wurde, bzw. wie sich der Code verhält) function getfile(server, username, password, localfile, remotefile: string; port: word = 21): HRESULT; var hopen, hconnect: HINTERNET; begin hconnect := 0; hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0); try if hopen <> 0 then begin hconnect := InternetConnect(hopen, PChar(server), port, PChar(username), PChar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); if (hconnect <> 0) and FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0) then Result := NO_ERROR else Result := GetLastError; end else Result := GetLastError; //hconnect := InternetConnect(hopen, PChar(server), port, PChar(username), PChar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); //if (hopen <> 0) and (hconnect <> 0) and FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0) then // Result := NO_ERROR //else // Result := GetLastError; // ich weiß jetzt aber nicht ganz sicher, wie InternetConnect bei hopen=0 reagiert finally InternetCloseHandle(hconnect); InternetCloseHandle(hopen); end; end; E := getfile(...); if E <> NO_ERROR then RaiseLastOSError(E); // RaiseLastWin32Error(E); // ShowMessage('Problem: ' + SysErrorMessage(E));
Delphi-Quellcode:
S_OK = $00000000;
NOERROR = 0; ERROR_SUCCESS = 0; NO_ERROR = 0; |
AW: Daten aktualisieren sich nicht
0 ist aber nicht nil, hast Du ja selbst gesagt.
Delphi-Quellcode:
hopen := InternetOpen(...);
if Assigned(hopen) then |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 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