Einzelnen Beitrag anzeigen

gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: TDBXTypes.WideString-Wertetyp

  Alt 4. Jan 2013, 02:05
Hallo Volker

Das ist ja mega lieb. DAnke dir vielmals. Ich glaube das müsste von dieser form alles sein.

Delphi-Quellcode:
Unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, WideStrings, DBXMySql, SqlExpr, FMTBcd, DBClient,
  Provider, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls,DBXDataExpressMetaDataProvider,iniFiles, strUtils,cdsfield,
  DBXTrace;

type
  Tform6 = class(TForm)
    SQLConnection1: TSQLConnection;
    ComboBoxConnections: TComboBox;
    Label1: TLabel;
    EditSQL: TEdit;
    EditFilter: TEdit;
    CheckBoxActive: TCheckBox;
    DBNavigator1: TDBNavigator;
    ButtonApply: TButton;
    listbox1: TListBox;
    DBGrid1: TDBGrid;
    SQLDataSet1: TSQLDataSet;
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure ComboBoxConnectionsCloseUp(Sender: TObject);
    procedure listbox1DblClick(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure CheckBoxActiveClick(Sender: TObject);
    procedure ClientDataSet1BeforeClose(DataSet: TDataSet);
    procedure ButtonApplyClick(Sender: TObject);
    procedure EditFilterChange(Sender: TObject);
    procedure EditFilterEnter(Sender: TObject);
    procedure EditFilterExit(Sender: TObject);
    procedure EditSQLChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  TableName: String;
    AllTables: TStringList; //Liste der Datenbanktabellen
    FMetaDataProvider: TDBXDataExpressMetaDataProvider;
     MemoForm: TFormCurrentField;
  public
function MatchFilter(FilterStr, TestStr: String): Boolean;
    procedure PopulateListBox;
  end;
  const
  sDefaultFilterText = 'Filter (* as wild)';
var
  form6: Tform6;

implementation

{$R *.dfm}

procedure Tform6.PopulateListBox;
// AllTables muss auf die Liste der Tabellen für die aktive Datenbankverbindung gesetzt werden.
var
  I: Integer;
begin
  ListBox1.Items.Clear;
  for I := 0 to AllTables.Count - 1 do
  begin
    // Wenn kein Filter vorhanden ist oder die Tabelle dem Filter entspricht, Tabelle dem Listenfeld hinzufügen.
    if (EditFilter.Text = sDefaultFilterText) or MatchFilter(EditFilter.Text, AllTables[I]) then
      ListBox1.Items.Add(FMetaDataProvider.QuoteIdentifierIfNeeded(AllTables[I]));
  end;

  // Wenn das Listenfeld Einträge enthält, soll es aktiviert werden.
  if ListBox1.Count > 0 then
    ListBox1.Enabled := True;
end;


function Tform6.MatchFilter(FilterStr, TestStr: String): Boolean;
var
  Pattern, EndPattern, TempStr: String;
  WildPos: Integer;
begin
  Result := True;
  if FilterStr = 'then
    Exit;

  // Whitespace entfernen und in Großbuchstaben umwandeln.
  Pattern := UpperCase(Trim(FilterStr));
  EndPattern := ''; //nichts bis gefunden

  // Auf Platzhalter überprüfen
  WildPos := AnsiPos('*', Pattern);
  if WildPos <> 0 then
  begin
    if WildPos < Length(Pattern) then //letztes Zeichen
      EndPattern := Copy(Pattern, WildPos+1, MaxInt); //beliebiger Text nach Platzhalter
    Pattern := Copy(Pattern, 1, WildPos-1);
  end;

  if (Pattern <> '') and (AnsiPos(Pattern, UpperCase(TestStr)) <> 1) then
    Result := False
  else if EndPattern <> 'then
  begin
    TempStr := AnsiRightStr(TestStr, Length(EndPattern));
    if AnsiPos(EndPattern, UpperCase(TempStr)) <> 1 then
      Result := False;
  end;
end;


procedure Tform6.ButtonApplyClick(Sender: TObject);

var
  X, Y: Integer;
begin
  // Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt.
  ClientDataSet1.ApplyUpdates(-1);
  Y := Self.Top + Self.ButtonApply.Top;
  X := Self.Left + Self.ButtonApply.Left;

  // Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen.
  if MessageDlgPos('Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes then
  begin
    ClientDataSet1.Close;
    ClientDataSet1.Open;
  end;

end;

procedure Tform6.CheckBoxActiveClick(Sender: TObject);
begin
ClientDataSet1.Active := CheckBoxActive.Checked

end;

procedure Tform6.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
  // Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben.
  if Assigned(MemoForm) then
  begin
   MemoForm.DBMemoCurrentField.DataField := '';
    if MemoForm.Visible then
      MemoForm.Close;
  end;

end;

procedure Tform6.ComboBoxConnectionsCloseUp(Sender: TObject);
begin
  // Wurde eine Auswahl getroffen?
  if ComboBoxConnections.ItemIndex = -1 then
    Exit;

  // Hilfsobjekte initialisieren.
  if not Assigned(AllTables) then
    AllTables := TStringList.Create;
  if Assigned(FMetaDataProvider) then
    FreeAndNil(FMetaDataProvider);

  // Falls eine geöffnete Verbindung vorhanden ist, soll sie geschlossen werden. Anzeigen, dass die Verbindung nicht aktiv ist.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  CheckBoxActive.Checked := False;

  // Die ausgewählte Datenbankverbindung öffnen.
  SQLConnection1.ConnectionName := ComboBoxConnections.Items[ComboBoxConnections.ItemIndex];
  SQLConnection1.LoadParamsOnConnect := True;
  SQLConnection1.LoginPrompt := False;
  SQLConnection1.Open;
  SQLConnection1.GetTableNames(AllTables, False); //Liste der Tabellen aus der Datenbank abrufen

  // Metadaten für die ausgewählte Verbindung ermitteln.
  FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create;
  FMetaDataProvider.Connection := sqlconnection1.DBXConnection; //auf die geöffnete Verbindung setzen
  FMetaDataProvider.Open;

  // Das Listenfeld mit den Tabellen dieser Datenbankverbindung füllen.
  PopulateListBox;

  // Status einiger Dialogfeldelemente initialisieren.
  SQLDataSet1.CommandText := '';
  EditSQL.Text := '';
  CheckBoxActive.Enabled := False;
  ButtonApply.Enabled := False;
end;


procedure Tform6.EditFilterChange(Sender: TObject);
begin
  if SQLConnection1.Connected then
    PopulateListBox; //Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen

end;

procedure Tform6.EditFilterEnter(Sender: TObject);
begin
EditFilter.Text := '';

end;

procedure Tform6.EditFilterExit(Sender: TObject);
begin
if EditFilter.Text = 'then
    EditFilter.Text := 'Filter (* as wild)';

end;

procedure Tform6.EditSQLChange(Sender: TObject);
begin
SQLDataSet1.CommandText := EditSQL.Text;

end;

procedure Tform6.FormDestroy(Sender: TObject);
begin
  // Die Verbindung schließen.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  // Objekte freigeben.
  if Assigned(FMetaDataProvider) then
    FreeAndNil(FMetaDataProvider);
  if Assigned(MemoForm) then
    FreeAndNil(MemoForm);
  if Assigned(AllTables) then
    FreeAndNil(AllTables);

end;



procedure Tform6.DBGrid1CellClick(Column: TColumn);

begin
  if ClientDataSet1.Active then
  begin
    // Wenn das Formular nicht angezeigt wird, wird es erstellt.
    if not Assigned(MemoForm) then
    begin
      MemoForm := TFormCurrentField.Create(Self);
      MemoForm.DBMemoCurrentField.DataSource := DataSource1; //Datenquelle festlegen
    end;

    // Formular genau unterhalb des Hauptdialogfeldes positionieren.
    MemoForm.Top := Self.Top+Self.Height;
    MemoForm.Left := Self.Left;

    MemoForm.Visible := False;
    MemoForm.Visible := True;
    MemoForm.DBMemoCurrentField.DataField := Column.FieldName;
    // Im Titel Informationen über das Feld anzeigen
    MemoForm.Caption := Format('Field Name: %s / Record Num: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
    MemoForm.Width := Self.Width;


end;
end;


procedure tform6.FormCreate(Sender: TObject);

var
  IniFile: TIniFile;
  SectionsList: TStringList; //für die Verbindungsliste
  TempStr: String;
  I: Integer;
begin

  EditFilter.Text := sDefaultFilterText;
  // Informationen über die aktuellen Datenbankverbindungen ermitteln
  IniFile := TIniFile.Create(GetConnectionRegistryFile);

  // Eine Liste der verfügbaren Datenbankverbindungen ermitteln
  SectionsList := TStringList.Create;
  IniFile.ReadSections(SectionsList);

  // Die Verbindungen in das Kombinationsfeld einfügen
  // Jede gültige Verbindung sollte mit den Zeichen 'CONNECTION' enden.
  // Nur diese Verbindungen werden hinzugefügt.
  SectionsList.Sort;
  for I := 0 to SectionsList.Count - 1 do
  begin
   TempStr := UpperCase(AnsiRightStr(SectionsList[I], Length('connection')));
   if TempStr = 'CONNECTIONthen
   begin
     ComboBoxConnections.Items.Add(SectionsList[I]);
   end;
  end;

  // Nicht mehr benötigte Objekte freigeben
  FreeAndNil(IniFile);
  FreeAndNil(SectionsList);


end;

procedure tForm6.listbox1DblClick(Sender: TObject);
var
   s : string;
  FieldNamesList: TStringList;
  SQLStmt: String;
  I: Integer;
begin
  // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
  CheckBoxActive.Enabled := True;
  ButtonApply.Enabled := True;
  TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen

  // Feldnamen (Spaltennamen) für diese Tabelle abrufen.
  FieldNamesList := TStringList.Create;
  FieldNamesList.Clear;
  SQLConnection1.GetFieldNames(TableName, FieldNamesList);




   if FieldNamesList.Count > 0 then
     begin
       SQLStmt := 'select ';
       for I := 0 to FieldNamesList.Count - 1 do
         if s = 'then
           s := FieldNamesList[I]
         else
           s := s + ',' + FieldNamesList[I];
     SQLStmt := SQLStmt + s + ' from '+TableName;
     end

  else
   // Feldnamen nicht gefunden, daher '*' verwenden
   SQLStmt := 'select * from '+TableName;
  FreeAndNil(FieldNamesList);

  // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen.
  EditSQL.Text := SQLStmt;
  // CommandText auf SQL-Anweisung setzen.
  SQLDataSet1.CommandText := EditSQL.Text;
  if ClientDataSet1.Active then
   ClientDataSet1.Close;
  ClientDataSet1.Open;
  CheckBoxActive.Checked := True;

end;

end.


Falls du noch schlafen gehst, wünsche ich gute Nacht & Danke für alles
Robert
  Mit Zitat antworten Zitat