Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Navigation in DBGrid + Anfangsbuchstabe (https://www.delphipraxis.net/106361-navigation-dbgrid-anfangsbuchstabe.html)

Piro 9. Jan 2008 17:58

Datenbank: MyBase • Zugriff über: TD Pro

Navigation in DBGrid + Anfangsbuchstabe
 
Guten Abend,

wie kann ich folgendes umsetzen? Mir fehlt einfach der Ansatz.

Ich habe ein DBGrid mit verschiedenen Kontakten. Wenn das DBGrid aktiviert ist und ich die Taste z.B.: "K" drücke, soll er zum 1. Kontakt, der mit "K" anfängt navigieren.

Das mit dem Tastendruck und das nur diese Aktion ausgeführt wird, wenn das DBGrid aktiviert ist, bekomme ich hin. Ich weiß nur nicht, wie ich das andere realisieren soll.

Wäre für alle Hinweise, Ansätze, etc. dankbar.

Gruß, Sven

DeddyH 9. Jan 2008 18:21

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Ich kenne MyBase überhaupt nicht, aber ein Lösungsansatz könnte so aussehen (ohne jede Gewähr): zunächst den ersten Datensatz mit den gegebenen Kriterien ermitteln.
SQL-Code:
SELECT TOP 1 * FROM Tabelle
WHERE Name LIKE 'K%'
ORDER BY Name
Auf diesen Datensatz nun ein Locate loslassen.
Das funktioniert natürlich nur, wenn MyBase Limitierung kennt, und da kann die Syntax auch abweichen, zur Not Dokumentation konsultieren.

Piro 10. Jan 2008 08:32

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Das mit Locate sollte Funktionieren aber ich bekomme nicht den 1. Datensatz in Abhängigkeit des Buchstabens.

Delphi-Quellcode:
cds_filme.Locate('TITEL','Ali', [loPartialKey, loCaseInsensitive] ); // loPartialKey     = Suchtext kann auch teilweise vorkommen
                                                                     // loCaseInsensitive = Ignoriert Groß-Kleinschreibung
Hier springt er zu dem Datensatz, setzt aber voraus, dass Ali existiert. Schöner wäre sowas wie "A*" und dann geht es zum 1. Datensatz mit "A".

mkinzler 10. Jan 2008 08:40

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Zitat:

Gibt es bei Locate Wildcards oder vergleichbaren?
Jein, du kannst in de Locateoptions loPartialKey setzen.

Piro 10. Jan 2008 08:41

Re: Navigation in DBGrid + Anfangsbuchstabe
 
sorry habe gerade meinen Post editiert.

Piro 10. Jan 2008 08:53

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Ich habe noch ein wenig rumgespielt. Ich habe es jetzt hinbekommen.
Delphi-Quellcode:
cds_filme.Locate('TITEL','A', [loPartialKey, loCaseInsensitive] );
Dadurch springt er zum 1.Datensatz, wo der Titel mit A anfängt.

Danke.

bisenegger 28. Jan 2008 20:07

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Ich habe das mit der Adressen-Sucherei folgendermassen gelöst:

Delphi-Quellcode:
KeySuchStr: string; //allg. als globale Variable in der Unit

procedure TAdressen.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if Datasource1.state=dsbrowse then
  begin
  TimerEingabe.Enabled:=False;
  if ord(Key)=27 then //bei ESC Sucheingabe löschen
  begin
    KeySuchStr:='';
  end else
  begin
    if ord(Key)<>8 then //bei BackSpace letzes Zeichen löschen
    begin
            KeySuchStr:=KeySuchStr+Key;
    end
    else begin
      Delete(KeySuchStr,length(KeySuchStr), 1);
    end;
  end;
  TimerEingabe.Enabled:=True;
  end;
end;

procedure TAdressen.TimerEingabeTimer(Sender: TObject);
begin
  PvQuery1.DisableControls;
  TimerEingabe.Enabled:=False;

//  PvQuery1.Locate('Name', KeySuchStr, [loCaseInsensitive,loPartialKey]);

//alternativ, besser
  PvQuery1.Params.CreateParam(ftString, 'pName', ptInput);
  PvQuery1.Close;
  PvQuery1.SQL.Clear;
  PvQuery1.SQL.Add('select * FROM Adressen a WHERE name like :pName order by Name');
  PvQuery1.Params.ParamByName('pName').AsString:=KeySuchStr+'%';
  PvQuery1.Open;
  PvQuery1.Params.Clear;
  //
  PvQuery1.EnableControls;
  TimerEingabe2.Enabled:=True;
end;

procedure TAdressen.TimerEingabe2Timer(Sender: TObject);
begin
  TimerEingabe2.Enabled:=False;
  KeySuchStr:='':
end;
Läuft prima und ist die Luxus-Lösung.
Der eine Timer fasst die Eingaben zusammmen, so dass nicht bei jedem Buchstaben innert kürzester Zeit eine SQL Abfräge rausgeht, der andere Timer löscht nach einer gewissen Zeit den Suchstring.
Mit ESC ist wieder die vollständige Tabelle sichtbar.

Gruss
Beni

Hansa 28. Jan 2008 22:18

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Was zum Teufel hat da ein Timer zu suchen ?? :shock:

bisenegger 29. Jan 2008 11:46

Re: Navigation in DBGrid + Anfangsbuchstabe
 
Zitat:

Zitat von Hansa
Was zum Teufel hat da ein Timer zu suchen ?? :shock:

Ich habe dies noch geschrieben?

Delphi-Quellcode:
Was ich nicht geschrieben habe, sind die Werte:
TimerEingabe.Interval:=1000;
// Das heisst: nach dem letzen Tastendruck verstreicht eine Sekunde, bis die Anfrage als SQL-String an den Server gesendet wird. Mit der obigen Routine kann man nicht nur nach *dem* Anfangsbuchstaben sondern nach einem Anfangs-String suchen.

TimerEingabe2.Interval:=2000;
//nach 2Sekunden wird der in der Unit definierte Globalstring gelöscht. Irgendwann müssen ja die Anfangsbuchstaben gelöscht werden
Ausprobieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.

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