Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   TDBXTypes.WideString-Wertetyp (https://www.delphipraxis.net/172444-tdbxtypes-widestring-wertetyp.html)

gee21 4. Jan 2013 01:50

AW: TDBXTypes.WideString-Wertetyp
 
Es friert eben leider das Programm ein bevor ich zu der funtion komme,

gee21 4. Jan 2013 01:51

AW: TDBXTypes.WideString-Wertetyp
 
Merkwürdig jetzts gings wieder als wäre nichts gewesen. jedoch hält er beim brekpoint nicht an....?

Volker Z. 4. Jan 2013 01:57

AW: TDBXTypes.WideString-Wertetyp
 
Hallo gee21,

poste doch mal Deine kompletten Sourcen, ich kuck dann morgen (morgen ist ja schon heute) mal drüber. Vielleicht finde ich ja dann den bösen Buben, der da querschießt.

Gruß

gee21 4. Jan 2013 02:05

AW: TDBXTypes.WideString-Wertetyp
 
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 = 'CONNECTION' then
   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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.
Seite 3 von 3     123   

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