![]() |
Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.
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 |
AW: Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.
Zitat:
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:
Vielleicht liegt es aber auch daran, dass der Aufruf nicht aus dem Hauptthread stattfindet.
// Test
ShowMessageFmt('Name=%s:%s', [lOBJ.Items[iY].Name, lOBJ.Items[iY].Classname]); Um herauszufinden, in welchem Thread du bist einfach die Funktion ![]() 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); |
AW: Von TEdit den Focus wechseln, wenn die Eingabe noch aktiv ist.
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:
Die entscheidende Info:TButton(lOBJ.Items[iY]).Perform(WM_SetFocus,scr_Main.Handle,0); SendMessage(Handle, WM_NEXTDLGCTL, TButton(lOBJ.Items[iY]).Handle, 1); Zitat:
![]() Trotzdem Danke, Fuchtel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 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-2025 by Thomas Breitkreuz