AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.
Thema durchsuchen
Ansicht
Themen-Optionen

Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.

Ein Thema von Fuchtel · begonnen am 21. Jul 2011 · letzter Beitrag vom 22. Jul 2011
Antwort Antwort
Fuchtel

Registriert seit: 9. Nov 2005
Ort: Bamberg
53 Beiträge
 
Delphi 2005 Personal
 
#1

Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.

  Alt 21. Jul 2011, 15:49
Hallo,

ich habe zur Zeit folgendes Problem:

Vorauszuschicken ist, daß alle VCL-Objecte im Programm zur Laufzeit scriptgesteuert erzeugt werden und in einer TComponentList verwaltet werden.

Wenn ein TEdit den Focus besitzt ist ja auch dessen "InplaceEditor" aktiv.
Nun soll aber der Focus auf z.B.: einen TButton gesetzt werden.

Geschieht das durch Mausclick auf einen anderen Button langt bekanntlich:

Delphi-Quellcode:

TButton(lOBJ.Items[iY]).SetFocus

Kommt dies aber durch ein Ereignis (bei mir durch ein COM-Schnittstellenevent), passiert mit obigen garnichts.

Mit:

Delphi-Quellcode:

TButton(lOBJ.Items[iY]).Perform(WM_SetFocus, scr_Main.Handle, 0)

wird zwar der Focusrahmen auf dem Button gezeichnet. Der Eingabefocus liegt aber immer noch im TEdit.

Sitzt der Focus aber nicht auf einem TEdit, so funzt das ganze.

Ich suche jetzt also eine eine Möglichkeit, den InplaceEditor des TMyEdit zu beenden.

Danke im vorraus,

Fuchtel
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.

  Alt 21. Jul 2011, 23:36
Kommt dies aber durch ein Ereignis (bei mir durch ein COM-Schnittstellenevent), passiert mit obigen garnichts.
Das muss ja einen Grund haben.
Vielleicht ist ja lOBJ.Items[iY] in Wirklichkeit das TEdit das gerade schon den Fokus hat.
Lass dir auf jeden Fall den Namen der Komponente ausgeben damit du 1000% sicher bist, dass du die richtige Komponente ansteuerst:
Delphi-Quellcode:
// Test
ShowMessageFmt('Name=%s:%s', [lOBJ.Items[iY].Name, lOBJ.Items[iY].Classname]);
Vielleicht liegt es aber auch daran, dass der Aufruf nicht aus dem Hauptthread stattfindet.
Um herauszufinden, in welchem Thread du bist einfach die Funktion MSDN-Library durchsuchenGetCurrentThreadId aufrufen und die Id anzeigen.

Da die VCL nicht threadsicher ist muss SetFocus aber aus dem Hauptthread aufgerufen werden.
Du könntest dazu eine benutzerdefinierte Message an das Formular schicken, dass dann im Kontext des Hauptthreads die SetFocus-Methode aufruft.
Delphi-Quellcode:
const
  WM_MYSETFOCUS = WM_USER + 1;
...
PostMessage(form1.handle, WM_MYSETFOCUS, Integer(lOBJ.Items[iY]), 0);
  Mit Zitat antworten Zitat
Fuchtel

Registriert seit: 9. Nov 2005
Ort: Bamberg
53 Beiträge
 
Delphi 2005 Personal
 
#3

AW: Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.

  Alt 22. Jul 2011, 06:57
Danke sx2008 für die Hilfe.

Hat aber erstmal so nichts gebracht:

Sobald vor WM_SetFocus eine normale Msg-Box auf und wieder zugemacht wurde funzte es.

Lasse ich den Namen und ClassenNamen anzeigen, wie von dier zum Test vorgeschlagen, ist MsgBox leer.
Setze ich aber darauf einen Breakpoint, und lasse sie dann mit [F9] anzeigen ist der korrekte Inhalt darin. Seltsam !?!

Auf jedenfall habe ich doch noch (nach weiterem langen Probieren) eine Lösung gefunden:

(Frag mich aber nicht warum das Funzt!):

Delphi-Quellcode:

  TButton(lOBJ.Items[iY]).Perform(WM_SetFocus,scr_Main.Handle,0);
  SendMessage(Handle, WM_NEXTDLGCTL, TButton(lOBJ.Items[iY]).Handle, 1);
Die entscheidende Info:

Zitat:

Do not call SetFocus in a dialog window, except in WM_INITDIALOG
Note: Do not call SetFocus to change a control's focus in a dialog window, except when handling the WM_INITDIALOG message.

To explicitly set the focus to a dialog's control call SendMessage(hDialog, WM_NEXTDLGCTL, (WPARAM)hwndCtrl, TRUE). The WM_NEXTDLGCTL message notifies the dialog manager that the focus has changed.

The exception is the initial WM_INITDIALOG message. When you receive WM_INITIDIALOG call SetFocus on the desired control's hWnd. You must return FALSE to notify the dialog manager that you set the initial focus.

When handling other dialog messages if you use SetFocus (and not WM_NEXTDLGCTL) it prevents the dialog manager from updating its internal bookkeeping. For example, it might cause the dialog manager to display the wrong default pushbutton or fail to select the text of an edit control. For details see Raymond Chen's book The Old New Thing, page 227, "How to set focus in a dialog box." (Or see his blog.)
Quelle: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Trotzdem Danke,

Fuchtel
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:56 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