![]() |
Hilfe mit Delphi [idhttp.get error]
Hey Leute !
Ich beschäftige mich seit einigen tagen mit einem neuen Projekt und als anfänger habe ich noch nicht wirklich sehr viel erfahrung und habe deswegen ein paar fragen die ihr mir hoffentlich beantworten könnt ! Mein Programm : Ich möchte eine Wikipedia seite aufrufen (zzt. passiert dies über den Standardbrowser) und daraufhin wird eine neue unit geöffnet die fragt ob dies der richtige Artikel ist den jemand speichern möchte falls der benutzer ja klickt soll die html datei als pdf gespeichert werden So hier ist mein code mit dem ich leider nicht viel weiter komme, da mir das Programm nicht erlaubt die Datei irgendwo zu speichern (egal welcher Speicherort & auch nicht als Admin) Code vom JA Knopf aus der Unit3
Code:
Falls ihr irgendwelche fragen habt oder ihr mehr information braucht sagt bitte bescheid !
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm3 = class(TForm) Label1: TLabel; Button1: TButton; Button2: TButton; IdHTTP1: TIdHTTP; Edit1: TEdit; SaveDialog1: TSaveDialog; Button3: TButton; Edit2: TEdit; procedure Button1Click(Sender: TObject); procedure Edit2Enter(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Speicherort, Form3: TForm3; implementation uses unit2, unit1, Filectrl; {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); var ResponseStream: TFileStream; begin ResponseStream := TFileStream.Create(Edit1.Text, fmCreate); try idHTTP1.Get(url, ResponseStream); finally ResponseStream.Free; end; ShowMessage('Download abgeschlossen'); end; procedure TForm3.Button3Click(Sender: TObject); var dir : String; begin dir := ExtractFilePath(Application.ExeName); if SelectDirectory ('Bitte ein Verzeichnis auswählen','',Dir) then edit1.Text := (dir); end; procedure TForm3.Edit2Enter(Sender: TObject); begin Edit2.Text := ''; end; end. Zurzeit benutze ich die Indy Komponente für delphi (version xe7) Danke für eure Antworten :) |
AW: Hilfe mit Delphi [idhttp.get error]
Ich sehe nicht, wo da irgendetwas gespeichert wird. Du liest den Inhalt einer Webseite in einen Stream und gibst den gleich wieder frei. Dazwischen müsste der Stream seinen Inhalt aber erstmal noch speichern (s. Write oder WriteBuffer).
Außerdem gibst du dem Stream beim create lediglich ein Verzeichnis an und keinen vollständigen Dateinamen. |
AW: Hilfe mit Delphi [idhttp.get error]
Zitat:
![]() fmCreate – Erstellt eine Datei mit dem angegebenen Namen. Ist eine Datei mit diesem Namen bereits vorhanden, wird die Datei zum Schreiben geöffnet. Das heißt: In dem Moment, in dem du in einen geöffneten Filestream was reinschreibst, wird das auf Platte geschrieben. Ich mach das seit Jahr und Tag mit meiner Blob-To-File-Funktion ganz genau so:
Delphi-Quellcode:
Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
Var S : TStream; FileS : TFileStream; begin Result := False; If Not Feld.IsBlob Then Begin GLD.Fehlertext := 'Das angegebene Feld ist kein Blobfeld.'; Exit; End; If Feld.IsNull Then Begin GLD.Fehlertext := 'Im angegebenen Blobfeld des aktuellen Records befinden sich keine Daten.'; Exit; End; S := Feld.DataSet.CreateBlobStream(Feld, bmRead); FileS := TFileStream.Create(Datei, fmCreate); Try Try FileS.CopyFrom(S, S.Size); Result := FileExists(Datei); Except on e:exception Do Begin GLD.FehlerText := 'Fehler bei BlobToFile: ' + e.Message; Result := False; End; End; Finally S.Free; FileS.Free; End; end; Zitat:
|
AW: Hilfe mit Delphi [idhttp.get error]
Zitat:
|
AW: Hilfe mit Delphi [idhttp.get error]
@Perlsau: Nur im Unterschied zum Threadersteller schreibst du auch was rein
Delphi-Quellcode:
FileS.CopyFrom(S, S.Size);
Delphi-Quellcode:
Jetzt rate mal wie die Datei heißt und wo sie liegt? :roll:
edit1.Text := (dir);
... ... ... ResponseStream := TFileStream.Create(Edit1.Text, fmCreate); Ausgewählte Verzeichnis: c:\ddd\eee -> Dateiname eee im Verzeichnis c:\ddd. Ich glaube kaum, dass das funktionieren wird. |
AW: Hilfe mit Delphi [idhttp.get error]
Zitat:
Zitat:
Zitat:
Man sollte hier wirklich nichts behaupten, das man nicht zuvor überprüft hat, nur um sich hervorzutun mit einem "ich weiß auch was" und sich dann doch zu blamieren :cyclops: Übrigens kann man im ![]() Zitat:
Delphi-Quellcode:
etwa nicht? Was macht die Get-Version mit String als Var-Parameter? Richtig, das Resultat wird im String gespeichert. Warum sollte es bei einem Stream als Ziel-Behälter dann anders sein?
idHTTP1.Get(url, ResponseStream);
AResponseContent is the TStream instance that is the destination for data retrieved from the specified URL. For example: AHttp.Get(AUrl, AResponseContent) |
AW: Hilfe mit Delphi [idhttp.get error]
Ok, überlesen. Aber letztendlcih wird es daran scheitern dass ein Verzeichnis übergeben wird und kein Dateiname.
|
AW: Hilfe mit Delphi [idhttp.get error]
Noch besser, das "dir" ist erstmal ein "path", denn
Delphi-Quellcode:
, aber hier passt Vieles nicht so ganz.
dir := ExtractFilePath(Application.ExeName);
PS: @BlobFeldInDatei
Delphi-Quellcode:
ist etwas sinnlos nutzlos, denn es muß zwangsläufig immer True zurückgeben.
Result := FileExists(Datei);
Entweder knallte das TFileStream.Create und der Code kommt dort nie vorbei, oder TFileStream.Create(fmCreate) war erfolgreich und die Datei ist somit auch vorhanden. Wenn TFileStream.Create knallt, dann bleibt auch noch der Blob-Stream schön als Speicherleck zurück. |
AW: Hilfe mit Delphi [idhttp.get error]
Zitat:
Du meinst, das
Delphi-Quellcode:
gehört in den Try-Finally-Block? Klingt logisch, werde ich gleich mal ändern. Dann macht auch
TFileStream.Create
Delphi-Quellcode:
Sinn, obwohl ich da natürlich genausogut schreiben könnte
Result := FileExists(Datei);
Delphi-Quellcode:
.
Result := True;
Du hast meinen Code verbessert, dafür sei dir mein Dank gewiß :cheers: |
AW: Hilfe mit Delphi [idhttp.get error]
Jupp, aber dann vor dem Try natürlich nicht das :=nil vergessen, denn sonst knallt auch noch das Free, da nicht initialisiert, wenn es im Create knallte.
2x Try-Finally, oder Create drinnen und davor initialisieren. Sinn: Nja, wenn es im Create knallt, kommt es dennoch nicht beim Exists vorbei, außer Exists steckt im finally. :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 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