AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe mit Delphi [idhttp.get error]

Ein Thema von RooT314 · begonnen am 31. Mär 2015 · letzter Beitrag vom 1. Apr 2015
Antwort Antwort
Seite 1 von 3  1 23      
RooT314
(Gast)

n/a Beiträge
 
#1

Hilfe mit Delphi [idhttp.get error]

  Alt 31. Mär 2015, 22:30
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:
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.
Falls ihr irgendwelche fragen habt oder ihr mehr information braucht sagt bitte bescheid !

Zurzeit benutze ich die Indy Komponente für delphi (version xe7)

Danke für eure Antworten
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 07:25
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 07:38
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).
Lies doch erstmal den Text der Online-Hilfe zu TFileStream.Create, bevor du da was behauptest:
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;
Außerdem gibst du dem Stream beim create lediglich ein Verzeichnis an und keinen vollständigen Dateinamen.
Das dürfte wohl eher die Fehlerursache sein ...
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#4

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 07:58
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.
OK, dass das so funktioniert, wusste ich nicht, gebe ich zu. Aber aus der Hilfe lese ich das auch nicht. Da steht nur, dass die Datei zum Schreiben geöffnet wird, und nicht das da auch automatisch was reingeschreiben wird, wenn man in den Stream was reinschreibt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:25
@Perlsau: Nur im Unterschied zum Threadersteller schreibst du auch was rein FileS.CopyFrom(S, S.Size);
Delphi-Quellcode:
 edit1.Text := (dir);
...
...
...
ResponseStream := TFileStream.Create(Edit1.Text, fmCreate);
Jetzt rate mal wie die Datei heißt und wo sie liegt?

Ausgewählte Verzeichnis: c:\ddd\eee -> Dateiname eee im Verzeichnis c:\ddd. Ich glaube kaum, dass das funktionieren wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:32
OK, dass das so funktioniert, wusste ich nicht, gebe ich zu.
Tja, man lernt nie aus, das gilt für mich ebenso

Aber aus der Hilfe lese ich das auch nicht.
Und wo hast du das mit dem WriteBuffer gelesen? Etwa in der Online-Hilfe zu TFileStream?

Da steht nur, dass die Datei zum Schreiben geöffnet wird, und nicht das da auch automatisch was reingeschreiben wird, wenn man in den Stream was reinschreibt.
Zum Schreiben geöffnet heißt, sie wird erstellt und wartet darauf, daß geschrieben wird. Wie befüllt man ein geöffnetes Gefäß? Indem man was reingießt? Und wie schreibt man in einen Filestream? Indem man was reinkopiert? Also für mich ist der Text in der OH eindeutig.

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

Übrigens kann man im Codebeispiel zu TFileStream.Create genau diese Vorgehensweise finden.

@Perlsau: Nur im Unterschied zum Threadersteller schreibst du auch was rein FileS.CopyFrom(S, S.Size);
Und macht das der TE mit idHTTP1.Get(url, ResponseStream); 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?

AResponseContent is the TStream instance that is the destination for data retrieved from the specified URL. For example: AHttp.Get(AUrl, AResponseContent)

Geändert von Perlsau ( 1. Apr 2015 um 08:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:39
Ok, überlesen. Aber letztendlcih wird es daran scheitern dass ein Verzeichnis übergeben wird und kein Dateiname.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#8

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:04
Noch besser, das "dir" ist erstmal ein "path", denn dir := ExtractFilePath(Application.ExeName); , aber hier passt Vieles nicht so ganz.
  • erst wird in "dir" ein Pfad "path" reingeschrieben ( C:\dir\ )
  • dann noch der falsche Dialogtext "Bitte ein Verzeichnis auswählen" > Ergibt ein "dir" ( C:\dir\dir2 ), aber nur wenn man den Editinhalt ändert und nicht so belässt
  • Bezogen auf SelectDirectory stimmt der Text zwar, aber in "dir" Edit1 (echt blöde Name) soll doch ein Dateiname (samt path) rein ... warum dann kein TOpenDialog?
  • und zum Schluß wird das Verzeichnis "dir" auch noch direkt als Dateiname "file" verwendet ( C:\dir\file )
  • wenn wirklich ein Vereichnis (dir oder path) in "dir" und Edit1 rein soll, dann muß das eben bei TFileStream um den Dateinamen ergänzt werden




PS: @BlobFeldInDatei
Result := FileExists(Datei); ist etwas sinnlos nutzlos, denn es muß zwangsläufig immer True zurückgeben.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Apr 2015 um 09:09 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:35
PS: @BlobFeldInDatei
Result := FileExists(Datei); ist etwas sinnlos nutzlos, denn es muß zwangsläufig immer True zurückgeben.
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.


Du meinst, das TFileStream.Create gehört in den Try-Finally-Block? Klingt logisch, werde ich gleich mal ändern. Dann macht auch Result := FileExists(Datei); Sinn, obwohl ich da natürlich genausogut schreiben könnte Result := True; .
Du hast meinen Code verbessert, dafür sei dir mein Dank gewiß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#10

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:43
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Apr 2015 um 09:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.
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