Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aktivieren von Controls

2 views
Skip to first unread message

Lothar Geyer

unread,
May 8, 2012, 4:26:21 AM5/8/12
to
Es geht um eine MDI-Anwendung. In fast jedem Child sind Controls (vor
allem Textbox) vorhanden, die Enabled=False gesetzt haben. Für Test- und
Dokumentationszwecke wäre es nun manchmal von Vorteil, wenn man alle
Controls mit einem Schlag auf Enabled=True setzen könnte.

Wie gehe ich das am Besten an, ohne in jeder Form das KeyPreview
anpacken zu müssen?

Lothar Geyer

Martin KoWi

unread,
May 8, 2012, 4:45:03 AM5/8/12
to
Hallo Lothar,

meinst du sowas in der Art?

Dim CTL As Control

For Each CTL In MyForm.Controls
Select Case TypeName(CTL)
case "TextBox"
CTL.Enabled = true
end select
next

gruß, martin.

Lothar Geyer

unread,
May 8, 2012, 5:19:08 AM5/8/12
to
Hallo Martin,

Am 08.05.2012 10:45, schrieb Martin KoWi:
> ...
> meinst du sowas in der Art?
>
> Dim CTL As Control
>
> For Each CTL In MyForm.Controls
> Select Case TypeName(CTL)
> case "TextBox"
> CTL.Enabled = true
> end select
> next

Genau. Ich möchte aber nicht jede der über 300 Forms anpassen müssen,
sondern das irgendwie "zentral" geregelt haben.

Lothar Geyer

Martin KoWi

unread,
May 8, 2012, 5:41:37 AM5/8/12
to
Am 08.05.2012 11:19, schrieb Lothar Geyer:

> Genau. Ich möchte aber nicht jede der über 300 Forms anpassen müssen,
> sondern das irgendwie "zentral" geregelt haben.

Wenn du nur die geladenen Forms behandeln willst, was in dem Fall wohl
sinnvoll ist, dann gehe einfach die Forms-Collection durch:

Dim F As Form

For Each F In Forms
Call EnableTextboxes(F)
Next

wobei EnableTextboxes die Funktion aus der vorigen Nachricht ist (mit
der Form als Parameter).

Falls du es wirklich für ALLE Forms brauchst - das braucht gew.
Voraussetzungen.
Geht aber auch, habe ich einmal zur Lokalisierung aller Forms gemacht.

Sag Bescheid,
gruß, martin.

Lothar Geyer

unread,
May 8, 2012, 6:01:49 AM5/8/12
to
Hi Martin,

Am 08.05.2012 11:41, schrieb Martin KoWi:
> ...
>
>> Genau. Ich möchte aber nicht jede der über 300 Forms anpassen müssen,
>> sondern das irgendwie "zentral" geregelt haben.
>
> Wenn du nur die geladenen Forms behandeln willst, was in dem Fall wohl
> sinnvoll ist, dann gehe einfach die Forms-Collection durch:
>
> Dim F As Form
>
> For Each F In Forms
> Call EnableTextboxes(F)
> Next
>
> wobei EnableTextboxes die Funktion aus der vorigen Nachricht ist (mit
> der Form als Parameter).

Soweit ist mir das schon alles klar gewesen. Ich möchte das über eine
"geheime" Tasten-Kombination aktivieren können. Dazu müsste ich aber
AFAIK Key-Events bei allen Forms einbauen.

Und _das_ hätte ich gerne "zentral" gemacht.

Lothar Geyer

Martin KoWi

unread,
May 8, 2012, 6:21:10 AM5/8/12
to
Am 08.05.2012 12:01, schrieb Lothar Geyer:

> Soweit ist mir das schon alles klar gewesen. Ich möchte das über eine
> "geheime" Tasten-Kombination aktivieren können. Dazu müsste ich aber
> AFAIK Key-Events bei allen Forms einbauen.

Achsooo! Missverständnis, sorry.

Aber auch das geht recht leicht, ohne Hooks und so:
an zentraler Stelle in einem Timer GetAsyncKeyState abfragen.
Für so einen Zweck reicht es, sich eine möglichst "kranke" Tastenkombi
zu nehmen.
Also zb. Shift+Alt+Ctrl+F1 - irgendwas, das keine Konflikte macht.
Der Timer braucht auch nicht besonders schnell sein, du hältst die
Tasten dann halt länger gedrückt.
Habe soetwas mit 3 sec. drin, und das ist für den Zweck völlig ok.

hth, martin.

Lothar Geyer

unread,
May 8, 2012, 9:21:49 AM5/8/12
to
Hallo Martin,

Am 08.05.2012 12:21, schrieb Martin KoWi:
> ...
> Achsooo! Missverständnis, sorry.

No problem ;-)

> Aber auch das geht recht leicht, ohne Hooks und so:
> an zentraler Stelle in einem Timer GetAsyncKeyState abfragen.
> Für so einen Zweck reicht es, sich eine möglichst "kranke" Tastenkombi
> zu nehmen.
> Also zb. Shift+Alt+Ctrl+F1 - irgendwas, das keine Konflikte macht.
> Der Timer braucht auch nicht besonders schnell sein, du hältst die
> Tasten dann halt länger gedrückt.
> Habe soetwas mit 3 sec. drin, und das ist für den Zweck völlig ok.

GetAsyncKeyState kenne ich. Wusste aber nicht, dass das auch bis auf
MDIform durchschlägt.

Danke.

Lothar Geyer

W. Wolf

unread,
May 8, 2012, 10:17:06 AM5/8/12
to
Am 08.05.2012 15:21, schrieb Lothar Geyer:
[...]
>
> GetAsyncKeyState kenne ich. Wusste aber nicht, dass das auch bis auf
> MDIform durchschlägt.
>

Vorsicht: GetAsyncKeyState "schlägt nicht durch" sondern liefert den
Status einer Taste systemweit. Das bedeutet, dass im deinem Fall die
gesperrten Felder unter Umständen auch aktiviert werden, wenn Du in
einer anderen Anwendung diese geheime Tastenkombination drückst. Damit
bin ich mir nicht so sicher, ob GetAsyncKeyState die richtige Lösung
ist. Zumindest solltest du beim Freischalten der Felder prüfen, ob deine
Anwendung gerade bearbeitet wird oder nicht etwa ein anderes Programm
zufällig auch die gleiche Tastenkombination zu irgendwas braucht.

Schönen Gruß
W. Wolf

Schmidt

unread,
May 8, 2012, 1:48:18 PM5/8/12
to
Am 08.05.2012 16:17, schrieb W. Wolf:

> Zumindest solltest du beim Freischalten der Felder prüfen, ob deine
> Anwendung gerade bearbeitet wird oder nicht etwa ein anderes Programm
> zufällig auch die gleiche Tastenkombination zu irgendwas braucht.

Yep - solch einen Check kann man relativ einfach
sicherstellen, per GetWindowThreadProcessId
und zwei weiteren APIs...:

Private Sub tmrKeyCheck_Timer()
Dim ProcID As Long
GetWindowThreadProcessId GetForegroundWindow, ProcID
If ProcID <> GetCurrentProcessId Then Exit Sub

...

Also solange die eigene Applikation nicht aktiviert
(im Vordergrund) ist, passiert auch nix hinsichtlich
Tastenkombinations-Erkennung.


Olaf

Ahmed Martens

unread,
May 9, 2012, 1:55:42 AM5/9/12
to
Wäre es nicht einfacher, wenn man z. B. aus einem Hilfemenü => ? sich
ein Formular aufruft und dort einfach die Unsichtbarkeit ein- bzw.
ausschaltet?

Man könnte doch z. B. ein Formular nehmen, wo der aktuelle Versionsstand
angezeigt wird.

Nur so als Idee.

Gruß Ahmed
--
Antworten bitte nur in der Newsgroup.
Win7 Prof. 64bit / MS-Office 2010 Prof. 32bit

Schmidt

unread,
May 9, 2012, 5:52:07 AM5/9/12
to
Am 09.05.2012 07:55, schrieb Ahmed Martens:
> Wäre es nicht einfacher, wenn man z. B. aus einem Hilfemenü => ? sich
> ein Formular aufruft und dort einfach die Unsichtbarkeit ein- bzw.
> ausschaltet?
>
> Man könnte doch z. B. ein Formular nehmen, wo der aktuelle Versionsstand
> angezeigt wird.
>
> Nur so als Idee.

Klar, auch das wäre eine Variante ...
KeyPreview auf dieser Info-Form eingeschaltet,
bräuchte man dann weder das GetAsyncKeyState-API
noch irgendwelches SubClassing, um die "geheime
Tastenkombination" auszuwerten.

GetAsyncKeystate in Kombination mit einem Timer
ist jedoch ziemlich robust (und darüber hinaus
IDE-fest) - und funktioniert mit den paar
Zeilen Ergänzung die ich gepostet habe, dann
halt (nur) applikations-weit (und nicht system-weit).

Olaf

Lothar Geyer

unread,
May 9, 2012, 10:04:40 AM5/9/12
to
Hallo an Alle,

Danke für Eure Ideen. Dass man die Tastenkombination auf die Info-Form
beschränken kann, ist mir nicht in den Sinn gekommen. Aber das wird
sicher der einfachste Weg sein.

Danke auch an Olaf für die API-Hinweise. Auf dem Gebiet kann ich immer
noch eine Menge lernen.

Lothar Geyer
0 new messages