Announcement

Collapse
No announcement yet.

Interbase und RTF-Feld

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

  • Interbase und RTF-Feld

    Hallo Thomas,

    also auch nach mehrmaliger Durchsicht finde ich in den Demos nichts, was mir die EINFACHEN Techniken im Umgang mit Interbase zeigt. Google liefert vieles zu PHP und (natürlich) jede Menge alte Seiten mit Beschreibungen zu Interbase. Da suche ich noch weiter. Das Buch von Andreas Kosch habe ich bestellt, die Lieferung wird aber wohl noch etwas dauern. In der Zwischenzeit habe ich mal mein Problem auf den Kern reduziert und in ein Minimalprogramm gepackt:

    <PRE>
    Die Datenbank:
    ==============

    CREATE TABLE TEST (
    TEST_ID INTEGER NOT NULL,
    TEST_NAME VARCHAR(100),
    TEST_TEXT BLOB SUB_TYPE 0 SEGMENT SIZE 80);

    Das Formular:
    =============

    object Form1: TForm1
    Left = 309
    Top = 212
    Width = 508
    Height = 304
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBGrid1: TDBGrid
    Left = 40
    Top = 128
    Width = 217
    Height = 120
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object DBRichEdit1: TDBRichEdit
    Left = 288
    Top = 128
    Width = 193
    Height = 121
    DataField = 'TEST_TEXT'
    DataSource = DataSource1
    TabOrder = 1
    end
    object DBNavigator1: TDBNavigator
    Left = 40
    Top = 88
    Width = 218
    Height = 25
    DataSource = DataSource1
    VisibleButtons = [nbPrior, nbNext]
    TabOrder = 2
    end
    object Button1: TButton
    Left = 288
    Top = 88
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 3
    OnClick = Button1Click
    end
    object IBDatabase1: TIBDatabase
    Connected = True
    DatabaseName = 'D:\database\test.gdb'
    Params.Strings = (
    'user_name=sysdba'
    'password=masterkey')
    LoginPrompt = False
    IdleTimer = 0
    SQLDialect = 3
    TraceFlags = []
    Left = 32
    Top = 24
    end
    object IBDataSet1: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    ForcedRefresh = True
    BufferChunks = 1000
    CachedUpdates = False
    SelectSQL.Strings = (
    'select * from TEST')
    UpdateObject = IBUpdateSQL1
    Active = True
    Left = 80
    Top = 24
    object IBDataSet1TEST_ID: TIntegerField
    FieldName = 'TEST_ID'
    Origin = 'TEST.TEST_ID'
    Required = True
    end
    object IBDataSet1TEST_NAME: TIBStringField
    FieldName = 'TEST_NAME'
    Origin = 'TEST.TEST_NAME'
    Size = 100
    end
    object IBDataSet1TEST_TEXT: TBlobField
    FieldName = 'TEST_TEXT'
    Origin = 'TEST.TEST_TEXT'
    Size = 8
    end
    end
    object IBUpdateSQL1: TIBUpdateSQL
    ModifySQL.Strings = (
    'update test set test_text = :text where test_id = :id')
    Left = 120
    Top = 24
    end
    object IBTransaction1: TIBTransaction
    Active = True
    DefaultDatabase = IBDatabase1
    AutoStopAction = saNone
    Left = 160
    Top = 24
    end
    object DataSource1: TDataSource
    DataSet = IBDataSet1
    Left = 200
    Top = 24
    end
    end

    Das Programm:
    =============

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, DBCtrls, StdCtrls, ComCtrls, Grids, DBGrids, DB,
    IBDatabase, IBCustomDataSet, IBUpdateSQL;

    type
    TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBDataSet1: TIBDataSet;
    IBUpdateSQL1: TIBUpdateSQL;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBRichEdit1: TDBRichEdit;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    IBDataSet1TEST_ID: TIntegerField;
    IBDataSet1TEST_NAME: TIBStringField;
    IBDataSet1TES

  • #2
    Interbase und RTF-Feld

    Hallo !

    Wie bekomme ich den Inhalt eines RTF-Feldes (mit Formatierungen etc.) in eine IB-Datenbank gespeichert. Geht das per SP? Irgendwie finde ich der Doku nicht das Richtige. Also habe ich's wie unten probiert, bekomme aber Fehlermeldungen über ungültigen typecast:

    var
    blo : TBlobStream;

    ....

    with quTexte do
    begin
    Close;
    ParamByName('id').asInteger := ID;
    Open;
    Edit;

    {....bis hierhin alles ok: richtiger Datensatz etc....)

    Blo := NIL;
    try
    Blo := TBlobStream.Create( quTexteTEXTFELD as TBlobField, bmWrite );
    Richedit1.Lines.SaveToStream( Blo );
    finally
    Blo.Free;
    end;

    Post;
    Close;
    end;

    .....

    quTexte ist eine IBQuery

    (Ich verwende D6, Interbase 6)

    Comment


    • #3
      Hallo Bernd,<br><br>
      ich nehme mal an, dass Du auch noch ein TIBUpdateSQL in Verbindung mit der TIBQuery verwendest, da Du sonst mit TIBQuery nur eine Read-Only Datenmenge zurückbekommst.<br><br>
      Unter Verwendung einer TIBDataset funktioniert bei mir folgendes Codestück.<br><br>
      procedure TForm1.Button1Click(Sender: TObject);<br>
      var b: TStream;<br>
      begin<br>
      &nbsp;&nbsp;with IBDataSet1 do begin<br>
      &nbsp;&nbsp;&nbsp;&nbsp;Insert;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;b := IBDataSet1.CreateBlobStream(IBDataSet1BLOBsubt0, bmWrite);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;try<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichEdit1.Line s.SaveToStream(b);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Post;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.Free;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;end;<br>
      &nbsp;&nbsp;end;<br>
      end;<br><br>
      Gruss,<br>
      Thoma
      Thomas Steinmaurer

      Firebird Foundation Committee Member
      Upscene Productions - Database Tools for Developers
      Mein Blog

      Comment


      • #4
        Hallo Thomas,

        danke erstmal für die TURBO-Antwort!

        Ja, ich verwende eine TIBUpdateSQL (mit allen SQL-Statements). Ich möchte allerdings im Unterschied zu Deinem Beispiel einen bestehenden Datensatz ändern. Deshalb verwende ich statt "INSERT" eben "EDIT", bekomme dann allerdings die Meldung "Aktualisierung nicht erfolgreich".

        Kennst Du ein gutes Tutorial zu den IB-Komponenten? Früher gabs bei den Delphi-Komponenten in der Hilfe immer noch ein paar Beispiele, die vermisse ich doch sehr.

        Gruß

        Bern

        Comment


        • #5
          Hallo Bernd,<br><br>
          bei mir funktioniert auch das Abspeichern eines RTF-Textes mit TIBQuery/TIBUpdateSQL für einen bestehenden Datensatz (D6 UP2, IB 6.03).<br><br>
          Zum Thema Tutorial. Diese Ressourcen würd ich ernsthaft in Betracht ziehen (obwohl es sich nicht wirklich um Tutorials im engeren Sinne handelt):<br><br>
          - Buch "InterBase Datenbankentwicklung mit Delphi" http://www.entwickler.com/itr/buecher/show.php3?id=14&nodeid=92&ps_lo=30<br><br>
          - Demoanwendungen im %Delphi%\Demos\Db Ordner<br><br>
          - Suchen in den Newsgroups mit http://www.google.com<br><br>
          Gruss,<br>
          Thoma
          Thomas Steinmaurer

          Firebird Foundation Committee Member
          Upscene Productions - Database Tools for Developers
          Mein Blog

          Comment


          • #6
            Das Programm:
            =============

            unit Unit1;

            interface

            uses
            Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
            Dialogs, ExtCtrls, DBCtrls, StdCtrls, ComCtrls, Grids, DBGrids, DB,
            IBDatabase, IBCustomDataSet, IBUpdateSQL;

            type
            TForm1 = class(TForm)
            IBDatabase1: TIBDatabase;
            IBDataSet1: TIBDataSet;
            IBUpdateSQL1: TIBUpdateSQL;
            IBTransaction1: TIBTransaction;
            DataSource1: TDataSource;
            DBGrid1: TDBGrid;
            DBRichEdit1: TDBRichEdit;
            DBNavigator1: TDBNavigator;
            Button1: TButton;
            IBDataSet1TEST_ID: TIntegerField;
            IBDataSet1TEST_NAME: TIBStringField;
            IBDataSet1TEST_TEXT: TBlobField;
            procedure Button1Click(Sender: TObject);
            private
            { Private-Deklarationen }
            public
            { Public-Deklarationen }
            end;

            var
            Form1: TForm1;

            implementation

            {$R *.dfm}

            procedure TForm1.Button1Click(Sender: TObject);
            var
            b : TStream;
            begin
            with IBDataSet1 do
            begin
            Edit;
            b := IBDataSet1.CreateBlobStream( IBDataSet1TEST_TEXT, bmWrite );
            try
            DBRichEdit1.Lines.SaveToStream( b );
            Post;
            finally
            b.Free;
            end;
            end;
            end;

            end.

            Vielleicht gibt es ja doch den einen entscheidenden Fehler ?!
            Bis hierhin aber nochmal vielen Dank!

            Gruß
            Bern

            Comment


            • #7
              Das Programm:
              =============

              unit Unit1;

              interface

              uses
              Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
              Dialogs, ExtCtrls, DBCtrls, StdCtrls, ComCtrls, Grids, DBGrids, DB,
              IBDatabase, IBCustomDataSet, IBUpdateSQL;

              type
              TForm1 = class(TForm)
              IBDatabase1: TIBDatabase;
              IBDataSet1: TIBDataSet;
              IBUpdateSQL1: TIBUpdateSQL;
              IBTransaction1: TIBTransaction;
              DataSource1: TDataSource;
              DBGrid1: TDBGrid;
              DBRichEdit1: TDBRichEdit;
              DBNavigator1: TDBNavigator;
              Button1: TButton;
              IBDataSet1TEST_ID: TIntegerField;
              IBDataSet1TEST_NAME: TIBStringField;
              IBDataSet1TEST_TEXT: TBlobField;
              procedure Button1Click(Sender: TObject);
              private
              { Private-Deklarationen }
              public
              { Public-Deklarationen }
              end;

              var
              Form1: TForm1;

              implementation

              {$R *.dfm}

              procedure TForm1.Button1Click(Sender: TObject);
              var
              b : TStream;
              begin
              with IBDataSet1 do
              begin
              Edit;
              b := IBDataSet1.CreateBlobStream( IBDataSet1TEST_TEXT, bmWrite );
              try
              DBRichEdit1.Lines.SaveToStream( b );
              Post;
              finally
              b.Free;
              end;
              end;
              end;

              end.

              Vielleicht gibt es ja doch den einen entscheidenden Fehler ?!
              Bis hierhin aber nochmal vielen Dank!

              Gruß
              Bern

              Comment


              • #8
                Hallo Bernd,<br><br>
                schick mir Dein Delphi-Projekt einfach per E-Mail. ts @ iblogmanager.com<br><br>
                Gruss,<br>
                Thoma
                Thomas Steinmaurer

                Firebird Foundation Committee Member
                Upscene Productions - Database Tools for Developers
                Mein Blog

                Comment

                Working...
                X