Announcement

Collapse
No announcement yet.

TWebResponse Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TWebResponse Problem

    ich habe eine Funktion

    MapWindowFile1.WriteToMwfStream

    die ein OleVariant zurückliefert. Dieses soll ein Array of Byte sein.

    Dieses Array möchte ich als TWebResonse - Content zurückgeben.

    Wie mache ich aus diesem OleVariant einen gültigen Content / Stream ?

    Das VBScript Beispiel dazu sieht so aus:

    Response.Expires = -1
    Response.Buffer = TRUE
    Response.ContentType = "application/x-mwf"
    Response.BinaryWrite(MapWindowFile1.WriteToMwfStre am())
    Response.End

  • #2
    Hallo,

    das folgende Beispiel demonstriert, wie man eine Grafik direkt aus einer Datenbank heraus an den Browser schicken kann. Das Gegenstück zu VBScript <i>Response.BinaryWrite</i> ist in Delphi <b>Response.ContentStream</b>:

    <pre>
    <b>uses</b> JPEG, Graphics;

    <b>procedure</b> TWebModule1.WebModule1WebActionGrafik1Action(Sende r: TObject;
    Request: TWebRequest; Response: TWebResponse; <b>var</b> Handled: Boolean);
    <b>var</b>
    aBitmap : TBitmap;
    aBS : TADOBlobStream;
    aJPEG : TJPEGImage;
    aMemStrm : TMemoryStream;
    <b>begin</b>
    <b>try</b>
    FCounterID := Request.QueryFields.Values[<font color="#9933CC">'ID'</font>];
    FPathInfo := Request.Query;
    <font color="#003399"><i>// ADO-Verbindung herstellen</i></font>
    ADOConnection1.Connected := True;
    <b>try</b>
    ADODataSet1.Parameters[0].Value := StrToInt(FCounterID);
    ADODataSet1.Active := True;

    aBS := TADOBlobStream.Create(ADODataSet1Photo, bmRead);
    <b>try</b>
    aBS.Seek(78, soFromBeginning);
    aBitmap := TBitmap.Create;
    <b>try</b>
    aBitmap.LoadFromStream(aBS);
    aJPEG := TJPEGImage.Create;
    <b>try</b>
    aJPEG.Assign(aBitmap);
    aMemStrm := TMemoryStream.Create;
    <b>try</b>
    aJPEG.SaveToStream(aMemStrm);
    aMemStrm.Position := 0;
    <font color="#003399"><i>{ Test - siehe PageProducer1HTMLTag }</i></font>
    <font color="#003399"><i>// Response.Content := PageProducer1.Content;</i></font>
    <font color="#003399"><i>{ entweder PageProducer1.Content oder image/jpeg}</i></font>
    Response.ContentType := <font color="#9933CC">'image/jpeg'</font>;
    Response.ContentStream := aMemStrm;
    Response.SendResponse;
    <b>finally</b>
    aMemStrm.Free;
    <b>end</b>;
    <b>finally</b>
    aJPEG.Free;
    <b>end</b>
    <b>finally</b>
    aBitmap.Free;
    <b>end</b>
    <b>finally</b>
    aBS.Free;
    <b>end</b>;
    <b>finally</b>
    <font color="#003399"><i>// ADO-Verbindung wieder trennen</i></font>
    ADOConnection1.Connected := False;
    <b>end</b>;
    <b>except</b>
    <b>on</b> E : Exception <b>do</b>
    Response.Content := <font color="#9933CC">'&lt;B&gt;Fehler&lt;/B&gt;&lt;BR&gt;'</font> + #13#10 + E.Message;
    <b>end</b>;

    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo,

      danke für die Antwort, löst aber leider nicht mein Problem.

      <pre>
      Response.ContentType := 'application/x-mwf';
      Response.ContentStream := MapWindowFile1.WriteToMwfStream;
      Response.SendResponse;

      </pre>

      Wenn ich es so mache bekomme ich eine Fehlermeldung vom Compiler Inkompatible Type
      TStream und TOleVariant.

      Wie bekomme ich den OleVariant in einen TMemoryStream

      Comment


      • #4
        Hallo,

        in diesem Fall wird über <b>VarArrayLock</b> ein Zeiger auf diesen Speicherblock gesetzt, um dann den Inhalt in eine <b>TMemoryStream</b>-Instanz zu kopieren:

        <pre>

        pData := VarArrayLock(vData);
        iCnt := VarArrayHighBound(vData, 1) + 1;
        ms := TMemoryStream.Create;
        ms.Write(pData^, iCnt);

        </pre&gt

        Comment


        • #5
          Danke, das war die Lösung

          Comment

          Working...
          X