Announcement

Collapse
No announcement yet.

Interbase-DB-Feld als booleschen Haken in DBGrid darstellen

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

  • Interbase-DB-Feld als booleschen Haken in DBGrid darstellen

    Hallo Leute,

    habe mich als Anfänger so allmählich im Delphi-Dschungel verheddert...

    Mein Ziel ist, eine Interbase-Tabelle (über TTable) in einem DBGrid zu bearbeiten. Kein Problem. Doch nun möchte ich ein Feld als booleschen Ausdruck verwenden und dazu auch im DBGrid eine optische Darstellung mit einem Häkchensymbol erreichen. Da es in Interbase keinen Datentyp Boolean gibt, habe ich eine entsprechende Domain (Smallint mit Check auf 0 und 1) erzeugt.

    (Mega-Schlau habe ich gedacht, ich kann ja einfach den Datentyp des entsprechenden persistenten Datenfeldes von ftSmallInt auf ftBoolean umsetzen, doch das fand Delphi gar nicht so toll und hat sich beim Compilieren verabschiedet.)

    Wer kann mir sagen, wie ich möglichst schnell dafür eine Lösung erstellen kann, bzw. ob es überhaupt geht?!

    Außerdem möchte ich gerne einen längeren Text im DBGrid darstellen, der eine mehrzeilige Anzeige erfordert. Habe aber noch keine Möglichkeit gefunden, dies hinzubekommen.

    Würde mich über eine ausführliche Antwort zu meinen Problemchen echt freuen, :|

    Danke im Voraus,

    Heike

  • #2
    Hallo,

    muss es denn unbedingt ein DBGrid sein - oder kann die gleiche Funktion auch mit einem <b>TDBCtrlGrid</b> erfüllt werden? Wenn letzteres zutrifft, kann ich folgendes anbieten.

    In der InterBase-Datenbank wird die Domain TBOOLEAN wie folgt deklariert:

    <pre>
    CREATE DOMAIN TBOOLEAN AS
    CHAR(1)
    NOT NULL
    CHECK (VALUE IN ("J","N"))
    </pre>
    Um nun eine TDBCheckBox im TDBCtrlGrid einzusetzen, lege ich ein neues berechnetes Feld an:
    <pre>
    object Table1AbschlBool: TBooleanField
    FieldKind = fkCalculated
    FieldName = 'AbschlBool'
    Calculated = True
    end
    </pre>
    Somit kann jeder beliebige Wert aus der Datenbank in das logische TRUE oder FALSE umgesetzt werden:
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Db, Grids, DBGrids, DBTables, RXDBCtrl, StdCtrls, DBCtrls, DBCGrids;

    type
    TForm1 = class(TForm)
    Database1: TDatabase;
    Table1: TTable;
    Table1VERNR: TIntegerField;
    Table1PRONR: TIntegerField;
    Table1VERDATUM: TDateTimeField;
    Table1ABSCHLUSS: TStringField;
    DataSource1: TDataSource;
    Table1AbschlBool: TBooleanField;
    DBCtrlGrid1: TDBCtrlGrid;
    DBCheckBox1: TDBCheckBox;
    DBMemo1: TDBMemo;
    Table1INFOTXT: TStringField;
    procedure Table1CalcFields(DataSet: TDataSet);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    if Table1ABSCHLUSS.Value = 'J' then
    Table1AbschlBool.Value := True
    else
    Table1AbschlBool.Value := False;
    end;

    end.
    </pre>

    P.S: Mit dem TDBCtrlGrid ist auch das mehrzeilige Textproblem gelöst

    Comment


    • #3
      Hallo Andreas,

      Danke für die ausführliche Antwort.

      Inzwischen habe ich selbst das TDBCtrlGrid "entdeckt" und einen ähnlichen aber einfacheren Weg gefunden. Ich habe die Domain (Typ SmallInt) in IB so gelassen und auch eine TDBCheckBox eingesetzt. Allerdings habe ich direkt das DB-Feld als DataField zugewiesen und zusätzlich folgende Eigenschaften gesetzt:

      ValueChecked := 1

      ValueUnchecked := 0

      Somit habe ich zwar keinen Haken, aber immerhin ein Kreuz..

      Comment

      Working...
      X