Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#6

Re: Datensatzmaske automatisiert erzeugen?

  Alt 24. Feb 2009, 14:10
Hallo!

Ich habe das Ganze jetzt unabhängig von Dir @Martin und Dir @shmia so hier gelöst:

Delphi-Quellcode:
  TDBInputMask = class(TCustomInputMask)
  //diese Klasse für Datenbankmasken verwenden
  //Feldanzahl, damit Anzahl Edits wird durch die Datenbank bestimmt
  private
    FDataSource: TDataSource;
    FEdits: TStrings; //Feldnamen nach Anzeigereihenfolge
    function GetInputs(Index: Integer): TObject;
    function GetLabels(Index: Integer): TDBText;
    function GetMasks(Index: Integer): String;
    function GetDataSource: TDataSource;

    procedure SetCount(ACount: Integer);
    procedure SetInputs(Index: Integer; AInput: TObject);
    procedure SetLabels(Index: Integer; ALabel: TDBText);
    procedure SetMasks(Index: Integer; AMask: String);

    procedure SetDataSource(ADataSource: TDataSource);
  public
    constructor Create(AOwner: TComponent);
    procedure CreateLabel(ACaption: TCaption); override;
    procedure CreateLabelCaptions(ACaptions: TStrings);
    procedure CreateEdit(AEditMask: String); override;
    procedure CreateCheckBox(ACaption: String); override;
    procedure CreateComboBox; override;
    procedure CreateMask; override;
    procedure CreateMemo; override;
    procedure CreateRadioGroup(ACaptions: TStrings); override;
    procedure CreateRichEdit; override;
    destructor Destroy; override;

    property Count: Integer read FCount write SetCount;
    property DataSource: TDataSource read GetDataSource write SetDataSource;
    property Inputs[Index: Integer]: TObject read GetInputs write SetInputs;
    property Masks[Index: Integer]: String read GetMasks write SetMasks; default;
  end;
Die Implementation ist noch nicht ganz ausgereift, daher bring ich hier nur meinen Ansatz. Die Klasse TCustomInputMask ist nix weiter als ein abstrakter Vorfahre, der alle public-Methoden abstrakt definiert. Diese müssen von konkreten Nachfahren auf jeden Fall überschrieben werden.

@mquadrat: Fields[Index] gibt es leider nicht. Es gibt nur Dataset.GetFieldnames(AFieldnames), wobei AFieldnames eine Stringliste sein muss. Ich hoffe mal, das hier die Feldnamen in der jeweils richtigen Reihenfolge übergeben werden.

Die Maske erzeuge ich im Prinzip nach der Vorgehensweise wie im Thread "" erklärt wurde, nur, das es sich hier um die Datenbank-Äquivalente habdelt.

Die Methoden CreateEdit(), CreateComboBox()... erzeugen die Controls zunächst von Hand. Ich habe aber die Möglichkeit vorgesehen standardmäßig DBEDits zu erzeugen. Das passiert in der Methode SetDataSource. Dort will ich später datentypabhängig spezialisierte Controls erzeugen, wobei @shmia einen guten Anstz liefert. @mschaefer hat mir per PN eine passende Klasse gesendet, deren Quelltext ich erst mal bissl studieren muss. Aber das Prinzip ist schon mal das gleiche, wie ich es gemacht habe, nur werden die Controls anders erzeugt.

Ich habe auch den Tipp mit geeigneten Feldnamen berücksichtigt. Heutige Datenbanken können ja recht lange Feldnamen haben. Da könnte ich dann folgendes machen:

Feldname Labelname (wird von DBText bzw als Spaltenüberschrift angezeigt)

Artikel__edt Artikel <Control ist ein Editfeld>
Vorrätig__chbox Vorrätig <Control ist eine Checkbox>

Das Kennzeichen, das mein Felname eine Erweiterung hat, die auf das zu verwendende Control hinweist, ist der doppelte Unterstrich. Ein einfacher Unterstrich ist dagegen im Feldnamen nicht nur erlaubt, sondern wird zur Benennung auch oft genug verwendet. ABer der doppelte Unterstrich dürfte im Feldnamen schon seltener sein. Ist zumindest auf der Arbeitsstelle meines Vaters so.


Ebenso könnte der Datentyp berücksichtigt werden, der in der Datenbank gespeichert ist. Dann könnte, wie nach dem Vorschlag von @shmia datentypabhängig ein passendes Eingabefeld ausgewählt werden.

Meine Eingabemaske kann bisher nur entweder die Standardmäßigen DBEdits erzeugen, die später mittels Eigenschaft Inputs durch spezialisiertere Controls ersetzt werden können. Oder ich weiß vrher, welche Controls am geeignetsten sind und erzeuge sie mit CreateXXXXXX(). Wenn ich weiß, welche Controls da zu wählen sind, kenne ich ja auch die Anzahl der Datenbankfelder.

Die Aufgabe, die ich mir hier gestellt habe bleibt interessant. Ich melde mich wieder, wenn ich neue Erkenntnisse gewonnen oder meine Eingabemaske weiter entwickelt habe.
  Mit Zitat antworten Zitat