Autor Téma: RichEdit a TBlobField  (Přečteno 5169 krát)

Offline DELPHIMAKER

  • Nováček
  • *
  • Příspěvků: 12
  • Karma: 0
RichEdit a TBlobField
« kdy: 26-01-2013, 12:32:38 »
Ahoj.
Poradíte mi někdo prosím co dělám špatně?
Pokouším se zapsat obsah RichEditu do datového typu Blob.
Tahle procedura mi končí chybou "Variant or safe array index out of bounds"
Delphi 2009, FB2.5, win all

procedure SaveRichEdit1;
var mst:TMemoryStream;
begin
          Screen.Cursor:= crHourGlass;
          mst:= TMemoryStream.Create;
          RichEdit1.Lines.SaveToStream(mst);
          mst.Seek(0, soFromBeginning) ;
          IBQuery2.Edit;
          TBlobField(IBQuery2.FieldByName('POZNAMKY')).LoadFromStream(mst);
          IBQuery2.Post;
          DM1.IBTransaction1.CommitRetaining;
          Screen.Cursor:= crDefault;
          mst.Free;
end;

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:RichEdit a TBlobField
« Odpověď #1 kdy: 28-01-2013, 08:53:49 »
A tohle by, podobně jako pro memo, nefungovalo?

Kód: Delphi [Vybrat]
  1. IBQuery2.FieldByName('POZNAMKY').AsString := RichEdit1.Lines.Text;

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:RichEdit a TBlobField
« Odpověď #2 kdy: 28-01-2013, 08:56:08 »
Nevím, co konkrétně je špatně v tvém případě, metody Edit a Post u tabulky Paradoxu jsem použil naposledy před x lety.
Pro zápis blobu v D7 používám TIBSQL:

Kód: Delphi [Vybrat]
  1.   with dm.TBSql do begin
  2.     Close;
  3.     SQL.Clear;
  4.     SQL.Add ('update tabulka set historie = :historie ');
  5.     SQL.Add ('where cislo = :cislo ');
  6.     ParamByName ('cislo').AsInteger:=aCislo;
  7.     HistorieR.Position := 0;
  8.     ParamByName('historie').LoadFromStream(HistorieR);
  9.     Prepare;
  10.     ExecQuery;
  11.   end;
  12.  

HistorieR je typu TMemoryStream, naplněno z Richeditu stejným způsobem, jak to máš ty. Transakci spouštím před touto procedurou a ukončuji po ní.
Win10 Prof 64b, Firebird 2.5

Offline DELPHIMAKER

  • Nováček
  • *
  • Příspěvků: 12
  • Karma: 0
Re:RichEdit a TBlobField
« Odpověď #3 kdy: 28-01-2013, 11:23:42 »
A tohle by, podobně jako pro memo, nefungovalo?

Kód: Delphi [Vybrat]
  1. IBQuery2.FieldByName('POZNAMKY').AsString := RichEdit1.Lines.Text;
Tohle mi moc nepomůže, protože tam potřebuju ukládat text včetně formátování proto tam mám RichEdit...

Offline DELPHIMAKER

  • Nováček
  • *
  • Příspěvků: 12
  • Karma: 0
Re:RichEdit a TBlobField
« Odpověď #4 kdy: 28-01-2013, 11:36:38 »
V té tabulce je ještě jeden sloupec blob pro vložení obrázku.
Když prvně vložím obrázek a potom uložím obsah RichEditu,tak se chyba nekoná!
Pokud ale prvně uložím ubsah RichEditu tak chyba.
Zkusil jsem to i takhle :
Kód: [Vybrat]
(IBQuery2.FieldByName('POZNAMKY') as TBlobField ).LoadFromStream(mst);
ale chová se to stejně...  :(
Kód: [Vybrat]
procedure TFormRowProductEdit.JvImage1DblClick(Sender: TObject); //uložení obrázku
begin
         if OpenPictureDialog1.Execute then
         begin
           if fileExists(OpenPictureDialog1.FileName) then
           begin
                  Screen.Cursor:= crHourGlass;
                  IBQuery2.Edit;
                 (IBQuery2.FieldByName('PRILOHY') As TBlobField).LoadFromFile(OpenPictureDialog1.FileName);
                  IBQuery2.Post;
                  Screen.Cursor:= crDefault;
                  DM1.IBTransaction1.CommitRetaining;
           end;

         end;
end;

procedure TFormRowProductEdit.RichEdit1MouseLeave(Sender: TObject); //uložení poznámek
var mst:TMemoryStream;
begin
          Screen.Cursor:= crHourGlass;
          mst:= TMemoryStream.Create;
          RichEdit1.Lines.SaveToStream(mst);
          mst.Seek(0, soFromBeginning) ;
          IBQuery2.Edit;
          TBlobField(IBQuery2.FieldByName('POZNAMKY')).LoadFromStream(mst);
          IBQuery2.Post;
          DM1.IBTransaction1.CommitRetaining;
          Screen.Cursor:= crDefault;
          mst.Free;
end;

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:RichEdit a TBlobField
« Odpověď #5 kdy: 28-01-2013, 12:41:36 »
no, získat formátovaný text je možné třeba takhle?
Kód: Delphi [Vybrat]
  1. function GetRTFAsText(RichEdit: TRichedit): string;
  2. var
  3.   SS: TStringStream;
  4. begin
  5.   SS:= TStringStream.Create('');
  6.   try
  7.     RichEdit.PlainText := False; //nezapomenout
  8.     RichEdit.Lines.SaveToStream(SS);
  9.     Result := SS.DataString;
  10.   finally
  11.     SS.Free
  12.   end;
  13. end;
  14.  
« Poslední změna: 28-01-2013, 12:43:12 od JaroB »

Offline DELPHIMAKER

  • Nováček
  • *
  • Příspěvků: 12
  • Karma: 0
Re:RichEdit a TBlobField
« Odpověď #6 kdy: 29-01-2013, 16:04:27 »
no, získat formátovaný text je možné třeba takhle?
Díky za radu, ale to mi stejně neřeší ten problém co mám.
Chybou totiž končí i když tam zapíšu string, ale pokud prvně vložím obrázek chyba není.
Není třeba firebird 2.5 omezený na jednu položku BLOB na jednu tabulku?
Zkusil jsem i uložit RichEdit do *.rtf a nahrát ho jako nahrávám obrázek, ale zase chyba.
Myslím si, že to chce vyloženě ukládat binární data, ale proč mi potom neuloží ze streamu..?, nevim si opravdu rady :-(

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:RichEdit a TBlobField
« Odpověď #7 kdy: 30-01-2013, 08:34:35 »
Moji vyzkoušenou proceduru jsi aspoň otestoval ? A FB určitě nemá omezení na 1 blob na jeden záznam, běžně jich mám několik v jednom záznamu. Chyba je stále stejná ? A na kterém řádku ? To zjistíš při krokování. Zkus uložení jiných dat, obrázku, prostého textu a pod. a pak se vrať k rtf. Pomocí SQL monitoru si můžeš odchytit SQL příkaz, kterým se to posílá do databáze, jestli k tomu vůbec dojde. Hlavně neházet flintu do žita  :)
Win10 Prof 64b, Firebird 2.5

Offline DELPHIMAKER

  • Nováček
  • *
  • Příspěvků: 12
  • Karma: 0
Re:RichEdit a TBlobField
« Odpověď #8 kdy: 30-01-2013, 14:02:45 »
Moji vyzkoušenou proceduru jsi aspoň otestoval ? A FB určitě nemá omezení na 1 blob na jeden záznam, běžně jich mám několik v jednom záznamu. Chyba je stále stejná ? A na kterém řádku ? To zjistíš při krokování. Zkus uložení jiných dat, obrázku, prostého textu a pod. a pak se vrať k rtf. Pomocí SQL monitoru si můžeš odchytit SQL příkaz, kterým se to posílá do databáze, jestli k tomu vůbec dojde. Hlavně neházet flintu do žita  :)


KarelHorky má pravdu nevzdávat to!
A měl pravdu i s tím parametrem ...
teď to běží bez chyby... Díky Karle :-)

Kód: Delphi [Vybrat]
  1. Procedure UlozBlob;
  2. var mst:TMemoryStream;
  3. begin
  4.           Screen.Cursor:= crHourGlass;
  5.           mst:= TMemoryStream.Create;
  6.           RichEdit1.Lines.SaveToStream(mst);
  7.           mst.Seek(0, soFromBeginning) ;
  8.           IBSQL1.SQL.Clear;
  9.           IBSQL1.SQL.Add('UPDATE VYROBKY SET POZNAMKY = :parametr1');
  10.           IBSQL1.SQL.Add(' WHERE ID='+IBQuery2.FieldByName('ID').AsString);
  11.           IBSQL1.ParamByName('parametr1').LoadFromStream(mst);
  12.           IBSQL1.Prepare;
  13.           IBSQL1.ExecQuery;
  14.           DM1.IBTransaction1.CommitRetaining;
  15.           Screen.Cursor:= crDefault;
  16.           mst.Free;
  17. end;
  18.