Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

Suchen in datensensitiven Controls

  Alt 8. Apr 2005, 14:48
Folgende Unit zeigt, wie man über ein datensensitives Steuerelement
nach einem Feldinhalt in der darunter liegenden Datenmenge suchen kann.

Mögliche datensensitives Steuerelemente (data-aware controls) sind:
TDBGrid, TdxDBGrid (von Quantum Express)
TDBEdit, TDBText oder TDBcombobox

Wenn man ein TDBGrid oder TdxDBGrid übergibt, wird im selektierten Feld gesucht;
gibt man ein TDBEdit, TDBText oder TDBcombobox an, ist das verknüpfte Feld die Grundlage
für die Suche.



Delphi-Quellcode:
unit UDBGridUtils;

interface

{Unit dxDBGrid auskommentieren, falls Quantum Express nicht verwendet wird}
uses DB, Controls, SysUtils, Dialogs, dbctrls, DBGrids, dxDBGrid;

function SearchField(feld: TField):Boolean;
function SearchDBControl(DBcontrol: Tcontrol):Boolean;


implementation

function SearchField(feld: TField):Boolean;
var
  s: string;
  ds : TDataSet;
  options : TLocateOptions;
begin
  Result := False;
  if Assigned(feld) then
  begin
    ds := feld.DataSet;

    if InputQuery(PssGetString(ID_FrmLnw_SearchField) + ' ' + feld.DisplayName, '', s) then
    begin
      // Wenn das letzte Zeichen ein * ist,
      // dann wird nur mit einem Teilschlüssel gesucht
      if (Length(s) >= 2) and (s[Length(s)]='*') then
      begin
        SetLength(s, Length(s)-1); // letztes Zeichen (das *) löschen
        options := [loPartialKey];
      end
      else
        options := [];

      Result := ds.Locate(feld.FieldName, s, options);
    end;
  end;
end;

function SearchDBControl(DBcontrol: Tcontrol):Boolean;
begin
  if DBcontrol is TDBEdit then
    Result := SearchField(TDBEdit(DBcontrol).Field)
  else if DBcontrol is TDBGrid then
    result := SearchField(TDBGrid(DBcontrol).SelectedField)
  else if DBcontrol is TdxDBGrid then
    result := SearchField(TdxDBGrid(DBcontrol).FocusedField)
  else if DBcontrol is TDBText then
    Result := SearchField(TDBText(DBcontrol).Field)
  else if DBcontrol is TDBComboBox then
    Result := SearchField(TDBComboBox(DBcontrol).Field)
  else if Assigned(DBcontrol) then
    raise Exception.Create('unsupported control: '+DBcontrol.ClassName)
  else
    Result := False;
end;


end.
Die Anwendung ist ganz einfach:
Delphi-Quellcode:
procedure Tform1.BtnSuchenClick(Sender:TObject);
begin
  if not SearchDBControl(DBGrid1) then
    ShowMessage('kein passender Datensatz gefunden !);
end;
Man kann nicht nur über das selektierte Feld eines Grids suchen, sondern auch ein TDBEdit als Ausgangspunkt für die Suche nehmen:

Delphi-Quellcode:
procedure TAuftragForm.ActSearchExecute(Sender: TObject);
var
  c : TWinControl;
begin
  c := Self.ActiveControl; // das aktuelle Steuerelement

  SearchDBControl(c);
end;
[edit=Chakotay1308]Source formatiert. Mfg, Chakotay1308[/edit]
Andreas
  Mit Zitat antworten Zitat