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 2 von 3     12 3      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 10:51
Generell sollte man sowas etwas mehr trennen:
Delphi-Quellcode:
procedure TDatMod.DoStoreBlobToFile(Feld: TField; Datei: String);
Var
  S : TStream;
  FileS : TFileStream;
begin
  If Not Feld.IsBlob Then
    raise Exception.Create( 'Das angegebene Feld ist kein Blobfeld.' );

  If Feld.IsNull Then
    raise Exception.Create( 'Im angegebenen Blobfeld des aktuellen Records befinden sich keine Daten.' );

  S := nil;
  FileS := nil;
  Try
    S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
    FileS := TFileStream.Create(Datei, fmCreate);
    FileS.CopyFrom(S, S.Size );
  Finally
    S.Free;
    FileS.Free;
  End;
  if not FileExists( Datei ) then
    raise Exception.CreateFmt( 'Eigentlich sollte die Datei "%s" jetzt vorhanden sein?', [Datei] );
end;

Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
begin
  Result := True;
  try
    DoStoreBlobToFile( Feld, Datei );
  except
    on E: Exception do
    begin
      GLD.FehlerText := E.Message;
      Result := False;
    end;
  end;
end;
Schon wird es kürzer und knackiger, obwohl es jetzt zwei Methoden sind
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Apr 2015 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#12

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:04
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.
Echt jetzt? Aprilscherz? In der Unit System wird doch bereits auf Nil geprüft und Destroy nur ausgeführt, wenn nicht Nil:
Delphi-Quellcode:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
Und wird eine Objektvariable nicht automatisch bei der Deklaration mit Nil initialisiert? Oder muß ich das dann auch bereits vor dem ersten Try machen?
So dürfte es dann wohl hinhauen:
Delphi-Quellcode:
Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
Var
  S : TStream;
  FileS : TFileStream;

begin
  Result := False;

  ...

  Try
    S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
    FileS := TFileStream.Create(Datei, fmCreate);
    Try
      FileS.CopyFrom(S, S.Size);
      Result := True;
    Except
      on e:exception Do GLD.FehlerText := 'Fehler bei BlobToFile: ' + e.Message;
    End;
  Finally
    S.Free;
    FileS.Free;
  End;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:17
Ja, Free prüft auf nil, aber lokale Variablen sind nicht unbedingt automatisch mit nil initialisiert.
Aber das sollte dir der Compiler auch sagen.

Entweder es knallt nicht, weil der Zeiger zufällig auf "irgendein" Objekt zeigt und es dann freigegeben wird, oder es knallt hoffentlich.
$2B or not $2B
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#14

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:23
Jetzt ist der Groschen auch bei mir gefallen:

UnitData.pas(331,1): warning W1036: W1036 Variable 'S' ist möglicherweise nicht initialisiert worden
UnitData.pas(331,1): warning W1036: W1036 Variable 'FileS' ist möglicherweise nicht initialisiert worden

Okay, dann füge ich die Nilsetzung vor dem ersten Try ein und gut ist

Entweder es knallt nicht, weil der Zeiger zufällig auf "irgendein" Objekt zeigt und es dann freigegeben wird, oder es knallt hoffentlich.
Da hat noch nie was geknallt, hätte aber können
Jetzt ist ja alles wieder gut
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:25
Echt jetzt? Aprilscherz?
Wenn  S := Feld.DataSet.CreateBlobStream(Feld, bmRead); scheitert geht er nach except und danach nach finaly. Dort veursacht FileS.Free ebenfalls eine Exception falls nicht zufällig mit nil initiiert. Deshalb hat Sir Rufo FileS erst mal nil gesetzt. Alternativ kann man auch 2 try finally Blöcke nehmen.

Geändert von Bjoerk ( 1. Apr 2015 um 11:29 Uhr) Grund: Name falsch geschrieben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:31
Mehrere Frees in einem Finaly geht natürlich nur, wenn alle Frees selber keine Exceptions erzeugen können (also jeweils die Free vor einem anderen Free ... sozusagen der Letzte darf knallen, wenn er will)
Wenn das nicht nahezu sichergestellt ist, dann entweder jeder sein eigenes Try-Finally, oder ein Try-Finally/Except im Finally.

Fälle, wonach das Programm dann eh komplett im Arsch ist und sowieso beendet werden muß, "kann" man weniger sorgsam sichern.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 11:41
Echt jetzt? Aprilscherz?
Wenn  S := Feld.DataSet.CreateBlobStream(Feld, bmRead); scheitert geht er nach except und danach nach finaly. Dort veursacht FileS.Free ebenfalls eine Exception falls nicht zufällig mit nil initiiert. Deshalb hat Sir Rufo FileS erst mal nil gesetzt. Alternativ kann man auch 2 try finally Blöcke nehmen.
Jupp, allerdings ist es nicht ratsam (wegen der Lesbarkeit) für jeden und alles einen eigenen try finally Block zu nehmen, denn dann sieht man irgendwann den Wald vor lauter Bäumen (try und Einrückungen) nicht mehr

Und schreibfaul bin ich auch noch
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
RooT314
(Gast)

n/a Beiträge
 
#18

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 12:20
Hallo Leute !

Erstmal danke für eure zahlreichen Antwroten !

Ich werde mir die gelisteten Tipps von himitsu raussuchen und so gut wie es geht beheben !

Jedoch habe ich als Anfänger gerade einmal die hälfte Verstanden

Ich werde im Verlaufe des Tages Updates posten

@himitsu : Sie meinten das dir kein path sein soll ? Was soll den Dir sonst sein ? versteh ich nicht ganz Und das mit dem TOpenDialog habe auch nach dem Lesen im Wiki nicht verstanden

Gruß RooT

Geändert von RooT314 ( 1. Apr 2015 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#19

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 13:48
Himitsu meinte, daß du für das Abspeichern des des TFileStreams eine Datei und nicht nur ein Verzeichnis benötigst:

Nicht C:\MeinOrdner\
sondern
C:\MeinOrdner\Datei.html
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 13:59
Path: C:\Programme\ = etwas in dem Verzeichnis (Pfadangabe für eine Datei/Verzeichnis zum Anhängen, also mit abschließendem PathDelimiter)
Directory, bzw. Pathname: C:\Programme = das Verzeichnis selber (der Verzeichnisname, also ohne abschließenden PathDelimiter)
Filepath: C:\Programme\Meine.exe = eine bestimmte Datei (inkl. Pfad)
Filename: Meine.exe = irgendeine Datei (ohne Pfad)

SaveToFile benötigt einen FileName, aber idealer Weise besser einen kompletten FilePath
Du schreibst aber erstmal einem Path in die Variable und der Auswahldialog wählt dann nur ein Verzeichnis (Dir).



PS: '\', oder Delphi-Referenz durchsuchenPathDelim, Delphi-Referenz durchsuchenTPath.DirectorySeparatorChar oder besser mit Delphi-Referenz durchsuchenTPath.Combine .
$2B or not $2B

Geändert von himitsu ( 1. Apr 2015 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 15:14 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