AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Setfocus auf dbgrid

Ein Thema von Luckner · begonnen am 18. Jun 2014 · letzter Beitrag vom 20. Jun 2014
Antwort Antwort
Seite 1 von 2  1 2      
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 12:34
Wo genau setzt du denn deinen Fokus für das DBGrid? Ich würde das in deinem Fall mal in der Button-Ereignisbehandlung versuchen ...
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 12:44
Aus einem Editfeld im Panel wird folgendes aufgerufen:

Delphi-Quellcode:
procedure TFrameAuftrag.JvEditKundennrsuchenKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if Key = VK_F10 then ButtonPanelSchliessen.Click;
end;
Dann im Button:

Delphi-Quellcode:
procedure TFrameAuftrag.ButtonPanelSchliessenClick(Sender: TObject);
begin
 DBGridAuftrag.SetFocus;
 PanelFilter.Visible := False;
 JvHTButtonSuchenFiltern.Visible := True;
end;

Geändert von mkinzler (18. Jun 2014 um 12:46 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 12:51
Was passiert, wenn du das Setzen des DBGrid-Fokus ans Ende stellst, d.h. zuletzt ausführst? Welche Delphi-Version verwendest du eigentlich?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.351 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 12:58
Wird denn ButtonPanelSchliessenClick auch ausgeführt?

Versuche dann mal folgendes:
Delphi-Quellcode:
procedure TFrameAuftrag.ButtonPanelSchliessenClick(Sender: TObject);
 begin
  DBGridAuftrag.SetFocus;
  // PanelFilter.Visible := False;
  // JvHTButtonSuchenFiltern.Visible := True;
 end;
Es ist denkbar, dass Dir hier ein Zeitverhalten der VCL in die Quere kommt. Es KÖNNTE SEIN, dass der Focus noch nicht wirklich umgesetzt wurde und Dein Edit durch Ausschalten des Panels "verschwindet". Dann würde der Parent den Focus erhalten.

Wenn das das Problem wäre, dann vielleicht einfach den Focus zuletzt zuweisen:

Delphi-Quellcode:
procedure TFrameAuftrag.ButtonPanelSchliessenClick(Sender: TObject);
 begin
  PanelFilter.Visible := False;
  JvHTButtonSuchenFiltern.Visible := True;
  DBGridAuftrag.SetFocus;
 end;
Da die VCL solche Anweisungen verzögert durch Nachrichtenverarbeitungen abarbeitet muss man mit solchen Effekten rechnen.


EDIT: Oups, kein roter Kasten, aber Perlsau ist wohl auf der gleichen Spur...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 13:31
Da die VCL solche Anweisungen verzögert durch Nachrichtenverarbeitungen abarbeitet muss man mit solchen Effekten rechnen.
Eigentlich kann ich mir nicht vorstellen, daß die Codezeilen nicht der Reihe nach ausgeführt werden. Ich glaube vielmehr, daß durch das Unsichtbarmachen des einen und das Sichtbarmachen des anderen der Fokus gesetzt wird, was auch immer das für visuelle Komponenten sind:

Delphi-Quellcode:
 PanelFilter.Visible := False;
 JvHTButtonSuchenFiltern.Visible := True;
EDIT: Oups, kein roter Kasten, aber Perlsau ist wohl auf der gleichen Spur...
Genau deshalb bin ich mir ziemlich sicher, daß das Setzen des Fokus ans Ende der Befehlsliste gehört. Das war schon mein Gedanke, als ich den TE oben fragte:

Zitat:
vielleicht wird ja noch was aufgerufen nach dem DBGrid.SetFocus, das den Fokus wieder verändert ... ?
.

Die Lösung ist: Key:=0; Jetzt funktioniert es.
Echt? Kann ich mir kaum vorstellen ... wie sieht dein Code denn jetzt aus?

Ach ja, bevor ich's wieder vergesse: Welche Delphi-Version setzt du ein?

Geändert von Perlsau (18. Jun 2014 um 13:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.351 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 13:47
Ok, Problem ist ja gelöst, dennoch ein Satz zu Perlsaus Frage:

Wenn DBGrid konkret den Fokus hat, dürfte es ja egal sein, ob ein anderes Panel ausgeblendet wird. In meinem Framework bin ich mit ähnlichen Abläufen aber einige Male auf die Nase gefallen - und bei verschiedenen Delphi- bzw- Windows-Versionen auch unterschiedlich.
Man kann auf jeden Fall nicht davon ausgegen, dass alle VCL-Ereignisse immer und überall 1:1 chronologisch nacheinander abgearbeitet werden.

Die Codezeilen werden natürlich nacheinander abgearbeitet, aber wenn nur Nachrichten verschickt werden kann man nie sicher sein, wann diese "beim Empfänger" verarbeitet werden. Bei schnellen Abläufen kann dann mal eine erwartete Reihenfolge durcheinander kommen.

Ein konkretes (ähnlich gelagertes) Problem hatte ich, wenn ich ein focusiertes Control gelöscht habe und zuvor ein anderes focusiert habe. Windows wollte dann unbedingt das gelöschte nochmal neu zeichnen, aber das existierte dann ja nicht mehr. Gelöst habe ich das indem ich das zu löschende Control erst mal unsichtbar gemacht und erst später gelöscht habe.

Dass die Lösung hier in der Key-Behandlung lag ist beruhigend. Aber Zusammenhänge wie von mir angesprochen sollte man mit als mögliche Problemursache beachten.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 14:28
Okay, das mit den verzögerten Messages kann ich zwar theoretisch nachvollziehen, hab's aber noch nicht erlebt bzw. hab keinen Schimmer, wie man das reproduzieren könnte. Dagegen erlebe ich des Öfteren, daß ein Umstellen der Befehlsreihenfolge ein Fehlverhalten beseitigen kann. Z.B. hatte ich kürzlich ein ähnliches Problem: Wenn ich ein DB-Edit, das den Fokus hatte und das auf eine Tabelle zeigte, die sich im Edit- oder Insert-Modus befand, auf ReadOnly := True setzte, wurde der geänderte Wert beim Tabelle.Post nicht übernommen. Bemerkt hatte ich das dadurch, daß ein Auslösen von Tabelle.Post via Buttonklick dazu führte, den Wert zu übernehmen, via Menüklick dagegen nicht. Beide Klicks führten zur selben Ereignisbehandlung einer TActionList. Der Unterschied bestand lediglich darin, daß beim Klick auf den Button der Fokus vom DBEdit weg war, bevor ich dieses Edit auf ReadOnly setzte, beim Klick via Menü jedoch weiterhin den Fokus behielt. Die Lösung bestand darin, den Fokus in der Ereignisbehandlung auf den Button zu setzen und gut war. Natürlich hätte ich auch die Reihenfolge in der Post-Methode ändern können: Erst posten und dann DBEdit.ReadOnly := True. Doch das hätte mein Programmkonzept völlig über den Haufen geworfen, was jetzt aber zu weit führen würde.

Wenn DBGrid konkret den Fokus hat, dürfte es ja egal sein, ob ein anderes Panel ausgeblendet wird.
Ich dachte mal, wenn der TE in seiner DBEdit-Ereignisbehandlung (KeyDown) die ButtonPanelSchliessen-Ereignisbehandlung aufruft (ist eigentlich schlechter Stil, das sollte eine private Methode sein, die von Key- und Button-Ereignisbehandlung gleichermaßen aufgerufen wird), könnte da nicht der Fokus auf dem DBEdit verbleiben? Denn schließlich folgt nach dem KeyDown noch das KeyUp, das ja ebenfalls vom Benutzer ausgelöst wird und den Fokus womöglich wieder an das DBEdit zurückgibt. Oder gehört das KeyUp dann dem DBGrid, wenn das den Fokus hat? Mir ist auf jeden Fall nicht so recht klar, wieso ein leeren des Tastaturpuffers im KeyDown des DBEdit (Key = #0) das Problem löst ...
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.351 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 14:40
Wir schweifen etwas ab, aber noch kurz:

Die VCL hat gewissermaßen ein Eigenleben, das sich auch mal ändern kann. Eigene Logiken davon abhängig zu machen, kann unerwartete Schwierigkeiten bereiten.
Hinzu kommt, dass die Controls in sich öfters nicht so arbeiten, wie man es erwarten sollte (http://www.delphipraxis.net/85385-tr...kt-falsch.html).
Das sollte man nur im Auge behalten.

Das vorliegende Key-Problem ist wohl, dass F10 eine Menüfunktion aufruft. Wenn Key nicht "neutralisiert" wird, macht Windows das noch, nachdem die Anwendung schon mit der Bearbeitung fertig ist.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#9

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 15:04
Die Lösung ist: Key:=0; Jetzt funktioniert es.
Echt? Kann ich mir kaum vorstellen ... wie sieht dein Code denn jetzt aus?
Auf F10 reagiert z.B. das Hauptmenü, womit dann nach dem Verlassen der Eventmethode noch anderer Code auf das VK_F10 ragiert und irgendwas macht.


PS: Den schönsten Spaß hat man, wenn einige Ereignisse im OnKeyDown verarbeitet werden und Andere im OnKeyUp.

Ein gutes Beispiel hatte ich da auch mal, so wurde im OnKeyDown per F2 das aktuelle ShowModal-Fenster geschlossen,
während das übergeordnete Fenster im OnKeyUp per F2 eine neue Instanz des Fenster öffnete.
- F2 rein und alles ist OK
- per F2 wieder raus ging nicht, da es gleich wieder rein ging, weil das eine Fenster sich im Down ausblendete und das Up dann im anderen Fenster landete.
> beides gleichermaßen im Up ODER im Down ausgeführt, hätte keine Probleme bereitet

Oder wie hier:
Mehrere Stellen verarbeiten das selbe Tastenereignis und man wundert sich dann, wenn Mehreres passiert oder Einiges nicht richtig.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jun 2014 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: Setfocus auf dbgrid

  Alt 18. Jun 2014, 15:07
Genau dafür gibt's den Spruch: Verarschen kann ich mich alleine
Daß das wunderbar klappt, hat wohl schon jeder einmal erleben dürfen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 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 by Thomas Breitkreuz