Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

generelle Eigenschaften

Begonnen von Carl, Mai 07, 2019, 19:28:02

⏪ vorheriges - nächstes ⏩

Carl

Hallo, ist es möglich, einen Code mit Hintergrundfarbe für alle Formulare in einem Modul zu hinterlegen und dieses Modul im Eigenschaftsfenster anzusprechen? Also im Fenster mit F4.

Carl

PhilS

Ja.
Ich bin zwar nicht ganz sicher, ob ich verstehe was du tun möchtest, aber höchstwahrscheinlich sollte das möglich sein.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Carl

Also ich suche eine Möglichkeit, eine Eigenschaft wie die Hintergrundfarbe global zu ändern. Am liebsten wäre mir, wenn es ein globales Modul gäbe, in das Optionen geschrieben werden können, die Einträge im Eigenschaftsfenster eines jeden Formulares überschreiben.

Als: Mach alle Hintergründe aller Formulare weiß.

Carl

dedidado

Hallo Carl,
das Modul kannst du dir ganz einfach selbst machen.
Sofern du nicht schon eine "globale" Funktion in jeder Maske hast, die beim laden oder öffnen eines Formulars ausgeführt wird, legst du dir eben eine solche an und legst darin fest wie deine Formulare aussehen sollen.

Public Function Aktion_Beim_Laden_aller_Formulare()
With CodeContextObject
    .Formularkopf.BackColor = FarbeKopf     ' oder direkt abrufen    Forms!xxx!FarbeKopf
    .Detailbereich.BackColor = FarbeDetailbereich
    .Formularfuß.BackColor = FarbeFuss
End With
End Function

Die Variablen FarbeKopf etc. kannst du beim Start der Anwendung in einem unsichtbaren Formular festlegen.

Über diesen Weg kannst du deine Anwendung ganz individuell und einheitlich gestalten.

Gruß Dieter

Carl

Vielen Dank für Deine Antwort.

Also ich lege ein Modul an, z.B. Modul1 und kopiere den vervollständigten Quellcode da hinein. Wie merkt Access, dass es ein allgemeines Modul ist?

Wie spreche ich dann an, dass, egal welches Formular geöffnet, wird, immer dieser Code genommen wird und immer der Wert, der im Eigenschaftsfenster steht, davon überschrieben wird? Vermerkt man im Formular, dass es diesen Code in dem Modul gibt?

Carl

dedidado

beim erstellen eines Moduls gibt es nur Module oder Klassenmodule, "allgemeine" Module gibt es nicht.
Das was du vermutlich meinst, sind einfach nur "Module".

Du musst in all deinen Formularen im Ereignis "Bei Laden" die Funktion aufrufen.
Sieht dann in etwa so aus:

Private Sub Form_Load()
    Aktion_Beim_Laden_aller_Formulare
End Sub

Der Wert den jedes Formular hat wird automatisch durch den Wert überschrieben, den du beim Laden setzt.
Vermerken musst du dabei nichts, außer eben in jedem Formular einmalig diesen Funktionsaufruf im Ereignis "bei Laden" setzen.
Danach kannst du über diese eine Funktion das komplette Erscheinungsbild deiner Formulare ändern, sofern das eben für alle Formulare gelten soll.

Gruß Dieter

Carl

#6
Ich habs gemacht und der Hintergrund des zu ladenden Formulars wird schwarz, egal welchen Farbwert ich im Modul eintrage.


Public Function Aktion_Beim_Laden_aller_Formulare()
With CodeContextObject
    .Detailbereich.BackColor = CCC8C2
End With
End Function


Woran könnte das denn liegen?

Carl

MzKlMu

Hallo,
stelle den gewünschten Hintergrund ein und kopiere dann den Farbwert aus den Eigenschaften. Und den verwendest Du.
Gruß Klaus

dedidado

ich glaube das hat er auch gemacht, nur da steht keine Dezimalzahl drin, sondern eine verdrehte Hex. In VBA funktioniert die natürlich nicht.

Wenn du die HEX benutzen willst, dann musst du dir noch folgende Funktion in dein Modul rein kopieren:
Public Function getcolor(s As String) As Long
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBscript.regexp")
    s = Left(s & "000000", 6)
    objRegEx.Pattern = "^[0-9A-F]{0,6}$"
    If objRegEx.Replace(s, "") <> "" Then
        getcolor = 0
    Else
        getcolor = "&h" & Mid(s, 5, 2) & Mid(s, 3, 2) & Mid(s, 1, 2)
    End If
    Set objRegEx = Nothing
End Function

In der Funktion sieht die Zeile dann so aus:
.Detailbereich.BackColor = getcolor("CCC8C2")

alternativ dazu, könntest du auch alle gewünschten Farben in einem Formular einstellen und dann beim laden den Code anhalten und dir die Dezimalwerte für jedes Objekt übers Direktfenster ausgeben lassen.
Find ich aber auf Dauer ziemlich umständlich, aber das ist nur meine Meinung...

Carl

Ah, damit funktioniert es. Ihr seid super! Ich glaube diese globalen Module sind sehr nützlich in vielerlei Hinsicht.

Ich hatte zwischenzeitlich vergeblich versucht, Hex in VBA flott zu machen, aber daran gescheitert, dass viele ihre Farbwerte aus einer Tabelle holen. Das ist wahrscheinlich besser, wenn man eine Administratorseite macht, mit der der User die Farboptionen wählen kann. Dann muss der Code nochmal anders aussehen.

Danke
Carl

Beaker s.a.

@dedidado
Wie sicher ist denn "CodeContextObject" bezügl. Verweis auf
das aufrufende Formular?
Wenn ich die OH richtig verstehe, ist es in diesem Fall nicht
unbedingt nötig dieses Objekt heranzuziehen.
Ich habe bei sowas immer einfach direkt das Form übergeben
(ByRef frm As Access.Form)
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Carl

Ich habe jetzt mal versucht, eine weitere Public Funktion für die Schriftfarben der TextBoxen anzulegen.

Im Formular funktioniert "Text72i.ForeColor = 32768".

Im Modul funktioniert aber folgende Codes nicht. Fehler: "Objekt fehlt".


Public Function Aktion_Beim_Laden_aller_Texte()
      Me!Text72.ForeColor = 32768
      Me.Text72.ForeColor = 32768
      Text72i.ForeColor = 32768
      Text72ii.ForeColor = 1
End Function


Was könnte der Grund sein?

Carl

Beaker s.a.

Hallo Carl,
ZitatWas könnte der Grund sein?
"Me." funktioniert auch nur im Formularmodul. In "fremden" Modulen
musst du eine explizite Referenz auf das Formular einrichten.
Entweder, wie schon mal gezeigt, mit dem "CodeContextObject"
With CodeContextObject
    !Text72.ForeColor = 32768
'usw.

oder per Übergabe des Formulars an die Function
Public Function Aktion_Beim_Laden_aller_Texte(ByRef frm As Access.Form)
    With frm
        !Text72.ForeColor = 32768
'usw.


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

dedidado

@ekkehard
ich nutze CodeContextObject in wirklich unzähligen Funktionen einer Anwendung die schon über 15 Jahre läuft und hab damit noch nie Probleme gehabt!
Gruß Dieter

Carl