Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi dBase-Datenbanken mit Topaz-Erweiterung - Teil 2 (https://www.delphipraxis.net/151787-dbase-datenbanken-mit-topaz-erweiterung-teil-2-a.html)

FriendOfDelphi 1. Jun 2010 16:55

Datenbank: dBase • Zugriff über: Topaz

dBase-Datenbanken mit Topaz-Erweiterung - Teil 2
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo Allerseits,

nachdem nun im ersten Teil geklärt wurde wie ein dBase-Datenbankzugriff grundsätzlich realiesiert wird, hier nun die Steigerung.
Die Delphi Erweiterung Topaz erlaubt die Möglichkeit mit sog. virtuellen Dateien zu arbeiten.
Dies bedeutet lediglich, dass die dBase-Datei zunächst in den Speicher geladen und dann dort verarbeitet wird.
Welche Vor- oder Nachteile dies hat, soll hier nicht Thema sein.
Ziel soll es vielmehr sein, ein vorhandenes Programm welches mit den Grafikkomponenten von Topaz implementiert wurde, so zu ändern, dass dies alles zur Laufzeit erstellt wird und ohne die Grafikkomponenten auskommt.
Hier zunächst der vorhandene Quellcode:
Delphi-Quellcode:
unit UTest;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, ucommon, tzprimds, utzcds, utzmds, StdCtrls;

type
  TForm1 = class(TForm)
    TzVFile1: TTzVFile;
    TzVFile1NAME: TStringField;
    TzVFile1AGE: TTzFloatField;
    TzVFile1AMOUNT: TTzFloatField;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TzVFile1.Open;
  TzVFile1.Append;
  TzVFile1NAME.AsString:='Max Mustermann';
  TzVFile1AGE.AsFloat:=88.88;
  TzVFile1AMOUNT.AsInteger:=100;
  TzVFile1.Post;
  TzVFile1.WriteToDisk;
end;

end.
Das Beispielprogramm ist absichtlich einfach gehalten.
Zunächst wird die Verbindung zur dBase-Datei und ein Button auf einem Formular erzeugt.
Wenn der Button gedrückt wird, wird ein neuer Datensatz in die dBase-Datei eingefügt.
Das war es auch schon.

Die zugehörige dfm-Datei sieht so aus:
Delphi-Quellcode:
{kein Delphi-Quellcode, sondern der Inhalt der dfm-Datei}
object Form1: TForm1
  Left = 1283
  Top = 316
  Width = 398
  Height = 252
  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 Button1: TButton
    Left = 64
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object TzVFile1: TTzVFile
    DbfFields.Strings = (
      'name, C, 30, 0'
      'age, F, 18, 8'
      'amount, N, 10, 2')
    DbfFileName = 'junk.dbf'
    HideDeletedRecs = False
    TableLanguage = tlOem
    Left = 24
    Top = 24
    object TzVFile1NAME: TStringField
      FieldName = 'NAME'
      Size = 30
    end
    object TzVFile1AGE: TTzFloatField
      FieldName = 'AGE'
      Size = 18
    end
    object TzVFile1AMOUNT: TTzFloatField
      FieldName = 'AMOUNT'
      Size = 10
    end
  end
end
Das Problem besteht nun darin, die grafische Implementierung durch eine reine Quellcode-Implementierung auszutauschen.
Bisher ist mir dies nicht gelungen und ich hoffe, dass hier im Forum jemand Erfahrung damit hat.
Im Dateianhang das Objektinspektor-Fenster von TTzVFile (Topaz-Komponente), dass Formular (Delphi 5) und die dBase-Datei.

Alfredo 3. Jun 2010 09:51

Re: dBase-Datenbanken mit Topaz-Erweiterung - Teil 2
 
TDataSource ist eine non-visual componente,
die der Anwender zur Laufzeit nicht sieht
und deren Aufgabe es ist TQuery mit TDBGrid zu verbinden.

Mir ist deshalb nicht klar, warum Du diese austauschen willst.
Was soll dass bringen, ausser dass Du dann diese Komponenten
selbst neu geschrieben hast.

FriendOfDelphi 3. Jun 2010 11:04

Re: dBase-Datenbanken mit Topaz-Erweiterung - Teil 2
 
Zitat:

Zitat von Alfredo
TDataSource ist eine non-visual componente,
die der Anwender zur Laufzeit nicht sieht
und deren Aufgabe es ist TQuery mit TDBGrid zu verbinden.

Mir ist deshalb nicht klar, warum Du diese austauschen willst.
Was soll dass bringen, ausser dass Du dann diese Komponenten
selbst neu geschrieben hast.

Hmm - TDataSource taucht doch hier im Quellcode gar nicht auf, oder?
Ich verwende im o.g. kleinen Beispiel die Topaz-Typen "TTzVFile", "TStringField" und "TTzFloatField".
Das Ganze läuft so, dass ich bei der Programmerstellung dem Objekt "TzVFile1" (vom Typ "TTzVFile") mitteile, welche Datenbank verwendet werden soll. Daraus erkennt das Objekt, welche Felder in der dBase-Datei enthalten sind. Ich kann dann auswählen, welche ich verwenden möchte (im Beispiel alle). Daraus ergeben sich dann die "Unter"-Objekte "TzVFile1NAME" (vom Typ TStringField), "TzVFile1AGE" (vom Typ "TTzFloatField") und "TzVFile1AMOUNT" (vom Type "TTzFloatField").
Diese sind dann aber fest zugewiesen. Und das will ich ändern.
Ich möchte das Ganze über eine ini-Datei steuern, in welcher die Feldnamen stehen.
Das hat den Vorteil, dass das Programm sehr variabel ist. Ich brauche nur noch die ini-Datei zu editieren. Der Quellcode bleibt unverändert.

hoika 3. Jun 2010 11:44

Re: dBase-Datenbanken mit Topaz-Erweiterung - Teil 2
 
Hallo,

Delphi-Quellcode:
TzVFile1.Open;
TzVFile1.Append;
TzVFile1.FieldByName('NAME').AsString:='Max Mustermann';
TzVFile1.FieldByName('AGE').AsFloat:=88.88;
TzVFile1.FieldByName('AMOUNT').AsInteger:=100;
TzVFile1.Post;
TzVFile1.WriteToDisk;

TXXXField sind persistente Felder (ist hier aber kein Diskussions-Gegenstand, nur zum googlen ;)).


Heiko

Alfredo 3. Jun 2010 14:48

Re: dBase-Datenbanken mit Topaz-Erweiterung - Teil 2
 
Zitat:

Aber noch bestehen grafische, feste Komponenten (TTzDbf, TDataSource). Diese müssen noch durch Quellcode ersetzt werden.
Siehe Teil 1 #38


Ich würde die Auswahl der Felder im Grid lösen.

Beim Start des Formulars die Felder die man nicht will ausblenden.

Delphi-Quellcode:
DBGRid1.Columns.Items[1].Visible := False;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz