PDA

Vollständige Version anzeigen : Manipulation von Controls in Formularen


TommyK
01.03.2004, 16:01
Hallo,

Eine auch oft gestellte Frage: Wie kann ich in einem Zug alle 10 Felder in meinem Suchform leeren oder alle 15 Checkboxen deaktivieren usw.
Die Lösung bestand dann meistens darin alle Felder einzeln aufzurufen und die Einstellung vorzunehmen oder eine eigene Funktion zu schreiben.
Deshalb möchte ich hier eine universelle Funktion vorstellen mit des möglich ist mehrere Eigenschaften zu ändern.


Problemstellung:

Wie kann ich gleichzeitig für mehrere Controls bestimmte Eigenschaften ändern bzw. prüfen?

Voraussetzungen:

Das Bsp ist unter A97, A00 und AXP lauffähig, unter A03 wurde es nicht getestet.


Funktionsweise:

Die Funktion "tk_Controls_Property" ändert für alle Controls, deren Marke (Tag-Eigenschaft) gesetzt ist, die benannte Eigenschaft.
(Achtung die Änderung ist nur temporär)
Folgende Eigenschaften können manipuliert werden mit möglichen Werten:

"Enabled" True(-1)/False(0)
"Locked" True(-1)/False(0)
"Visible" True(-1)/False(0)
"BackStyle" Normal=1, Transparent=0
"FontSize" beliebige Werte von 1 bis 127
"FontBold" Fett=True (-1), Normal=False (0)
"BorderStyle" Transparent=0, Durchgezogen=1, Strichlinien=2
Kurze Strichlinien=3, Punkte=4, Wenige Punkte=5
Strichlinie Punkt=6, Strichlinie Punkt Punkt=7
"SpecialEffect" Flach=0, Erhöht=1, Vertieft=2, Graviert=3, Schattiert=4, Unterstrichen=5
"Value" Null oder beliebiger Wert
"Empty" Kein Wert

Bis auf "Empty" können alle Properties auch auf Controls in Unterformularen angewendet werden.
Achtung: Nicht auf die Unterformulare selbst anwenden !!!
Desweiteren ist ein Erweiterung des Programmcodes um weitere Eigenschaften möglich.
Controls die eine Eigenschaft nicht besitzen bzw. unterstützen lösen den Fehler 2455 aus,
durch On Error Resume Next, werden diese übersprungen.

Hier die eigentliche Funktion:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public Function</span> tk_Controls_Property(objF <span class="TOKEN">As</span> Form, strMarke <span class="TOKEN">As</span> String, strProperty <span class="TOKEN">As</span> String, _
<span class="TOKEN">Optional</span> varValue <span class="TOKEN">As</span> Variant = <span class="TOKEN">False</span>)
&nbsp;
<span class="REM">'*******************************************</span>
<span class="REM">'Name: tk_Controls_Property (Function)</span>
<span class="REM">'Purpose:</span>
<span class="REM">'Author: Thomas Ke&szlig;ler</span>
<span class="REM">'Date: Februar 20, 2004, 07:00:00</span>
<span class="REM">'Inputs: objF = Formular, strMarke = Tag der Controls im Form,strProperty= Name der Eigenschaft</span>
<span class="REM">' (&quot;Enabled&quot;,&quot;Locked&quot;,&quot;Visible&quot;,&quot;BackStyle&quot;,&quot;FontSize&quot;,&quot;FontBold&quot;,&quot;BorderStyle&quot; ,</span>
<span class="REM">' &quot;SpecialEffect&quot;,&quot;Value&quot;,&quot;Empty&quot;)</span>
<span class="REM">' varValue=Wert der Eigenschaft</span>
<span class="REM">'Output:</span>
<span class="REM">'Example: tk_Controls_Property3 Me, &quot;DS&quot;, &quot;FontBold&quot;, True</span>
<span class="REM">' &Auml;ndert die Schriftart in allen Controls deren Tag &quot;DS&quot; enth&auml;lt, in Fett</span>
<span class="REM">'*******************************************</span>
<span class="TOKEN">On Error GoTo</span> Err_Handler
&nbsp;
<span class="TOKEN">Dim</span> intI <span class="TOKEN">As</span> Integer, objC <span class="TOKEN">As</span> Control, varX <span class="TOKEN">As</span> Variant
&nbsp;
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> objC <span class="TOKEN">In</span> objF.Controls
<span class="REM"> 'F&uuml;r jedes Objekt im &uuml;bergebenem Formular</span>
<span class="TOKEN">If</span> InStr(objC.Tag, strMarke) &gt; 0 <span class="TOKEN">Then</span>
<span class="REM"> 'Wenn der gleiche Ausdruck in der Marke steht, wie &uuml;bergeben</span>
Select Case strProperty
<span class="REM"> 'Ein Select um die einzelnen Eigenschaften zu verarbeiten</span>
Case &quot;Enabled&quot;, &quot;Locked&quot;, &quot;Visible&quot;, &quot;BackStyle&quot;, &quot;FontSize&quot;, &quot;FontBold&quot;, &quot;BorderStyle&quot;, &quot;SpecialEffect&quot;
<span class="REM"> 'F&uuml;r diese Eigenschaften</span>
objC.Properties(strProperty) = varValue
<span class="REM"> 'Setze die entsprechenden Eigenschaften auf den &uuml;bergebenen Wert</span>
<span class="TOKEN">If</span> <span class="TOKEN">TypeOf</span> objC <span class="TOKEN">Is</span> SubForm <span class="TOKEN">Then</span>
<span class="REM"> 'Wenn es sich um ein Unterformular handelt</span>
varX = tk_Controls_Property(objF, strMarke, strProperty, varValue)
<span class="REM"> 'Rufe diese Funktion erneut auf, allerdings ist dann das Formular, das Unterformular</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Case &quot;Value&quot;
<span class="REM"> 'Wenn es sich um den Wert handelt</span>
objC = varValue
<span class="REM"> 'Schreibe diesen in das Feld</span>
<span class="TOKEN">If</span> <span class="TOKEN">TypeOf</span> objC <span class="TOKEN">Is</span> SubForm <span class="TOKEN">Then</span>
varX = tk_Controls_Property(objF, strMarke, strProperty, varValue)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Case &quot;Empty&quot;
<span class="REM"> 'Wenn gepr&uuml;ft werden soll, ob es leer ist</span>
<span class="TOKEN">If</span> Len(Nz(objC, &quot;&quot;)) = 0 <span class="TOKEN">Then</span>
<span class="REM"> 'Len(Nz(Feld, &quot;&quot;) = 0 ist sicherer, da ein einfaches Leerzeichen IsNull(Feld) aufhebt</span>
objC.SetFocus
<span class="REM"> 'Setze den Focus auf das entsprechende Feld</span>
MsgBox &quot;Leider fehlt eine Eingabe in &quot; &amp; objC.Name &amp; vbCrLf &amp; _
&quot;Eine Eingabe ist in diesem Feld erforderlich.&quot;, vbOKOnly + vbCritical, &quot;Eingabefehler&quot;
<span class="REM"> 'Gebe eine Messagebox aus</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Case Else</span>
GoTo Err_Handler_Exit
<span class="TOKEN">End</span> Select
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Next</span> objC
&nbsp;
<span class="REM">'Fehlerbehandlung</span>
Err_Handler_Exit:
<span class="TOKEN">Exit Function</span>
Err_Handler:
<span class="TOKEN">If</span> Err = 2455 <span class="TOKEN">Then</span>
<span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
<span class="TOKEN">Else</span>
<span class="TOKEN">Dim</span> strErrString <span class="TOKEN">As</span> <span class="TOKEN">String</span>
strErrString = &quot;Error Information...&quot; &amp; vbCrLf
strErrString = strErrString &amp; &quot;Error#: &quot; &amp; Err.Number &amp; vbCrLf
strErrString = strErrString &amp; &quot;Description: &quot; &amp; Err.Description &amp; vbCrLf
MsgBox strErrString, vbCritical + vbOKOnly, &quot;Error in Function: tk_ControlsProperty3 &quot;
GoTo Err_Handler_Exit
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Syntax und Argumente:

Public Function tk_Controls_Property(objF As Form, strMarke As String, strProperty As String, Optional varValue As Variant = False)
objF = Name des Forms, also "Me" oder "Forms![frm_Start]![frm_Sub1].Form" für ein UFO
strMarke = die Marke (TAG), z.B: "XY"
strProperty= Name der Eigenschaft z.B. "Locked"
varValue= Wert der Eigenschaft z.B. True, False, Null usw.

Wichtige Hinweise:

1. Zu beachten wäre das keine Controls auf deaktiv, gesperrt oder unsichtbar gesetzt werden können, die den Focus besitzen.
Das würde die Fehler 2164 und 2165 auslösen.
Als Lösung würde sich ein Control anbieten, das eine Größe von 0x0 hat und beim Aufruf der Funktion den Focus erhält.
Dieses Control darf nicht unsichtbar sein.

2. nicht alle Eigenschaftseinstellungen stehen allen Controltypen zur Verfügung, z.B. Hintergrund Transparent für Listenfelder oder Checkboxen usw.
Auch ergeben einige Einstellungen nur in Kombination ein Sinn, z.B. fast alle BorderStyles ergeben nur Sinn mit SpecialEffect=Flach usw.

3. Das Füllen von Controls mit "True"(-1) oder False(0) hat natürlich nur bei Checkboxen Sinn.
Die hier dargestellte Lösung ist nur aus Demonstrationszwecken gewählt.
Bei der Wertübergabe Null für Listen- und Kombinationsfelder wird die dortige Markierung aufgehoben.

4. Dem Argument "Empty" wird kein Wert übergeben
Diese Funktion steht nicht für Unterformulare zur Verfügung

Mögliche Erweiterungen:

Es besteht die Möglichkeit die Funktion um weitere Properties zu erweitern.
Denkbar wäre eine Ausweitung auf die Eigenschaften "Backcolor", "Bordercolor", "FontName", "BorderWidth", "FontWeight", "FontItalic", "FontUnderline" und "TextAlign"
Die Funktion müsste, z.B. für die Property "Backcolor" dahin gehend erweitert werden, das die Property in der Select Case-Anweisung gelistet wird:

Case "Enabled", "Locked", "Visible", "BackStyle", "FontSize", "FontBold", "BorderStyle", "SpecialEffect", "Backcolor"

Der Aufruf um z.B. bei allen Controls mit TAG="XYZ" den Hintergrund rot zu färben wäre dann:

tk_Controls_Property Me, "XYZ", "Backcolor", 255

Beispiele zum Aufruf:

Alle Controls mit dem TAG= „XY“ sollen auf unsichtbar gesetzt werden

für HFO
tk_Controls_Property Me, "XY", "Visible", False

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_OnOff“
tk_Controls_Property Forms![frm_Start]![frm_Sub_OnOff].Form, "XY", "Visible", False


Alle Controls mit dem TAG= „XY“ sollen auf Aktiv gesetzt werden

für HFO
tk_Controls_Property Me, "XY", "Enabled", True

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_OnOff“
tk_Controls_Property Forms![frm_Start]![frm_Sub_OnOff].Form, "XY", "Visible", True


Bei allen Controls mit dem TAG= „YZ“ soll der Hintergrund auf Transparent gesetzt werden

für HFO
tk_Controls_Property Me, "YZ", "BackStyle", 0

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_Styles“
tk_Controls_Property Forms![frm_Start]![frm_Sub_Styles].Form, "YZ", 0

Bei allen Controls mit dem TAG= „ZY“ soll der Schriftstil auf „Fett“ gesetzt werden

für HFO
tk_Controls_Property Me, "ZY", "FontBold", True

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_Fonts“
tk_Controls_Property Forms![frm_Start]![frm_Sub_Fonts].Form, "ZY", "FontBold", True

Bei allen Controls mit dem TAG= „ZY“ soll der Schriftgröße auf „22“ gesetzt werden

für HFO
tk_Controls_Property Me, "ZY", "FontSize", 22

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_Fonts“
tk_Controls_Property Forms![frm_Start]![frm_Sub_Fonts].Form, "ZY", "FontSize", 22


Bei allen Controls mit dem TAG= „XZ“ soll der Feldinhalt gelöscht werden (Bitte Hinweise Punkt 3, s.o. beachten)

für HFO
tk_Controls_Property Me, "XZ", "Value", Null

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_Values“
tk_Controls_Property Forms![frm_Start]![frm_Sub_Values].Form, "XZ", "Value", Null

Bei allen Controls mit dem TAG= „XZ“ soll der Feldinhalt auf „Test1“ gesetzt werden (Bitte Hinweise Punkt 3, s.o. beachten)

für HFO
tk_Controls_Property Me, "XZ", "Value", "Test1"

für UFO (Name des UFO-Steuerelements im HFO „frm_Sub_Values“
tk_Controls_Property Forms![frm_Start]![frm_Sub_Values].Form, "XZ", "Value", "Test1"


Bei allen Controls mit dem TAG= „WZ“ soll geprüft werden ob das Control Daten enthält(Bitte Hinweise Punkt 4, s.o. beachten)

für HFO
tk_Controls_Property Me, "WZ", "Empty"


Ich hoffe Ihr könnt damit was anfangen.

Hier gehts zum Download:

für A00/XP (http://www.ms-office-forum.net/daten/access/03_2004/120256_00.zip)
für A97 (http://www.ms-office-forum.net/daten/access/03_2004/120256_97.zip)

AndiFranz
14.12.2005, 08:59
Hallo Tommy!

Ich möchte die Funktion in einer Funktion aufrufen, funktioniert allerdings nicht so richtig, vielleicht kannst du mir weiterhelfen.
tk_Controls_Property Forms!(ForName).[Notenschlüssel].Form, "1Sem", "Visible", True

Der Aufruf sollte für mehrere Formulare möglich sein, in jeden dieser Formulare existiert ein Unterformular "Notenschlüssel" und die Marke "1Sem".

TommyK
14.12.2005, 10:39
Hallo Andi,

was steht in der Variablen "ForName" bzw. wie wird diese übergeben?
Was geht nicht oder was für ein Fehler tritt auf?

AndiFranz
14.12.2005, 11:59
ForName ist einfach das Aktive Formular und als Fehlermeldung kommt:
Die Verknüpfung Nach-Eigenschft(LinkMasterFields) hat folgenden Fehler verursacht:'Typzeichen entspricht nicht deklariertem Datentyp'

TommyK
14.12.2005, 14:05
Hallo Andi,

das sieht aber so aus das dies nichts mit meiner Funktion zu tun hat.
Verknüpfst Du die UFO's per Code? Wenn ja, wie sieht der Code aus?

AndiFranz
14.12.2005, 15:03
Ich habe es wahrscheinlich schon selbst herausgekriegt, aber die Sache hat noch einen Haken um zu testen sollte Ich im Formularnamen den Teilstring "1" heraussuchen und wenn die Bedingung zutrifft wird entweder 1 Semester oder 2 Semester eingeblendet,bekomme aber die Fehlermeldung "Objektvariable oder With-Blockvariable nicht festgelegt", hier mein bisheriger Versuch und Weiter unten mein abgeänderter Code von der 1 Frage.
Private Sub Form_Load()
Dim ctl As Form
On Error GoTo Err_Form_Load
' Ganz wichtig, hier muß immer Me.SetFocus stehen
Me.SetFocus
If InStr(ctl.Value, "1") = True Then
Call NoteSem1
Else
Call NoteSem2
End If
Exit_Form_Load:
Exit Sub
Err_Form_Load:
MsgBox Err.Description
Resume Exit_Form_Load
End Sub

Public Function NoteSem1()
tk_Controls_Property Screen.ActiveForm.Controls![Notenschlüssel].Form, "1Sem", "Visible", True
tk_Controls_Property Screen.ActiveForm.Controls![Notenschlüssel].Form, "2Sem", "Visible", False
'Forms(ForName).AllowAdditions = False 'Daten Anfügen = nein
End Function
Public Function NoteSem2()
tk_Controls_Property Screen.ActiveForm.Controls![Notenschlüssel].Form, "1Sem", "Visible", False
tk_Controls_Property Screen.ActiveForm.Controls![Notenschlüssel].Form, "2Sem", "Visible", True
End Function

TommyK
15.12.2005, 04:46
Hallo Andi,

so richtig nachvollziehen kann ich es nicht.
Kannst Du mir einen Auszug Deiner DB als Zip-Datei mailen?
Mail an Access-Beipiele (access-beispiele@tommyk-webbox.de)

TommyK
15.12.2005, 09:18
Hallo Andi,

der Anhang von Deinem Mail wurde von Deinem Provider geblockt und nicht durchgelassen.
War der Anhang im Zip-Format?

AndiFranz
16.12.2005, 09:41
Hallo Tommy,

habe deine Variante probiert, funktioniert aber nicht, Ich habe eine eigene ausgetüftelt die funktioniert, aber Ich bekomme folgende Fehlermeldung wenn das Formular öffnet "Anwendungs-oder Objektdefinierter Fehler".

Private Sub Form_Load()
Dim ctl As Form
Set ctl = Screen.ActiveForm
On Error GoTo Err_Form_Load
' Ganz wichtig, hier muß immer Me.SetFocus stehen
Me.SetFocus
If InStr(ctl.Value, "1") = True Then
Call NoteSem1
Else
Call NoteSem2
End If
Exit_Form_Load:
Exit Sub
Err_Form_Load:
MsgBox Err.Description
Resume Exit_Form_Load
End Sub

TommyK
16.12.2005, 10:10
Hallo Andi,

das kann nicht gehen.
Das Form-Object hat keine Value-Eigenschaft.
Und wenn es die hätte dann wäre es ein Zahl.
Es geht eigentlich nur die Lösung des Formnamens.
Dim ctl As Form
Set ctl = Screen.ActiveForm
On Error GoTo Err_Form_Load
' Ganz wichtig, hier muß immer Me.SetFocus stehen
Me.SetFocus
If InStr(1, ctl.Name, "1") > 0 Then
Call NoteSem1
Else
Call NoteSem2
End If

AndiFranz
16.12.2005, 12:17
Hallo Tommy,
es geht leider noch nicht , dieser Codeteil
"If InStr(1, ctl.Name, "1") > 0 Then" soll prüfen ob der Formularname
"Anch-Note 1 Semester" oder "Anch-Note 2 Semester" zutrifft, also prüfen ob der String 1 oder 2 enthält,
Ich prüfe deshalb nicht auf den ganzen Formularnamen weil Ich noch andere Formulare habe die 1 oder 2 enthalten aber sonst verschieden sind , wie z.B. CH-Note 1 Semester und CH-Note 2 Semester.

Korrektur
Mit "If InStr(1, ctl.Name, "1") Then" funktionierts, aber nur wenn Ich vom Entwurfsmodus in die Formularansicht gehe, öffne Ich das Formular gehts nicht, wahrscheinlich ein Fehler in der Reihenfolge.

TommyK
16.12.2005, 14:30
Hallo Andi,

ändere mal das Ereignis.
Ich denke es liegt daran das Du das "Beim Öffnen" Ereignis nimmst.
Dieses Ereignis wird ausgelöst bevor das Form geöffnet wird.
Verschiebe mal den Code in das "Beim Laden" Ereignis.

AndiFranz
16.12.2005, 15:08
Hallo Tommy,
das Problem ist endlich gelöst, Ich habe im Code einfach die Reihenfolge vertauscht:

Me.SetFocus
Dim ctl As Form
Set ctl = Screen.ActiveForm

statt

Dim ctl As Form
Set ctl = Screen.ActiveForm
Me.SetFocus

Ich Bedanke mich recht herzlich für deine Hilfe

Gruss Andi