mreske
Goto Top

Name des angeklickten Labels (Bezeichnungsfeld) in Msgbox anzeigen

Hallo,

ich habe in einem Access-Formular verschiedene ungebundene Bezeichnungsfelder (Labels).
Nun möchte ich mir per Doppelclick den Namen des Labels in einer Msgbox anzeigen lassen.

Bei dieser Prozedur wird mir aber immer nur der Name des aktiven Steuerelements (z.B. Textfeldes) angezeigt.
Private Sub Bezeichnungsfeld18_DblClick(Cancel As Integer)
Dim AktSteuerelement As Control
Set AktSteuerelement = Screen.ActiveControl
MsgBox AktSteuerelement.Name
End Sub

Ich möchte aber, dass mir "Bezeichnungsfeld18" in einer Msbox ausgegeben wird.

Hat jemand eine Idee, wie man das bewerkstelligen kann?

Alternativ würde mir auch reichen, wenn ich den Namen der gerade laufenden Prozedur (also Sub "Bezeichnungsfeld18") auslesen könnte.

Danke im Voraus
Gruß

Content-Key: 443587

Url: https://administrator.de/contentid/443587

Printed on: May 9, 2024 at 15:05 o'clock

Member: emeriks
emeriks Apr 24, 2019 at 05:33:02 (UTC)
Goto Top
Hi,
diese Ereignis-Prozedur wird direkt nur für dieses Control erstellt. Also kannst Du es da auch direkt ansprechen.

Private Sub Bezeichnungsfeld18_DblClick(Cancel As Integer)
  Dim AktSteuerelement As Control
  Set AktSteuerelement = Bezeichnungsfeld18
  MsgBox AktSteuerelement.Name
End Sub

E.
Member: SlainteMhath
SlainteMhath Apr 24, 2019 at 06:59:31 (UTC)
Goto Top
Moin,

hab den Code etwas optimiert face-smile
Private Sub Bezeichnungsfeld18_DblClick(Cancel As Integer)
  MsgBox Bezeichnungsfeld18.Name
End Sub

lg,
Slainte
Mitglied: 139374
139374 Apr 24, 2019 updated at 07:16:20 (UTC)
Goto Top
Zitat von @SlainteMhath:

Moin,

hab den Code etwas optimiert face-smile
> Private Sub Bezeichnungsfeld18_DblClick(Cancel As Integer)
>   MsgBox Bezeichnungsfeld18.Name
> End Sub
> 
Dann kannst du ja gleich
MsgBox "Bezeichnungsfeld18"  
schreiben. face-smile, oder wenn der Sender des Events automatisiert ermittelt werden soll gibt's noch
Application.Caller
Im Event aufgerufen liefert das den Namen des Controls als String.

Wenn's hier um viele Labels geht würde ich das sowieso nicht manuell für jedes Control erstellen sondern für jeden Label über eine Klasse das Event daran binden dann braucht man das nicht manuell für jeden Label erstellen..
Member: mreske
mreske Apr 24, 2019 at 19:51:25 (UTC)
Goto Top
Hallo,
erst mal vielen Dank für die Antworten!

Ich möchte nicht für jedes Control manuell ein Ereignis-Feld erstellen.
Die Lösung mit Application.Caller wäre hier viel besser.

Private Sub Bezeichnungsfeld18_DblClick(Cancel As Integer)
MsgBox Application.Caller
End Sub

Leider bekomme ich hier immer die Fehlermeldung:
Fehler beim Kompilieren. Methode oder Datenobjekt nicht gefunden.

Was mache ich falsch?

Danke und schönen Abend noch
Member: emeriks
emeriks Apr 25, 2019 at 06:22:50 (UTC)
Goto Top
Application.Caller bezieht sich nicht auf Controls sondern auf Elemente des Dokuments.
Mitglied: 139374
Solution 139374 Apr 25, 2019 updated at 10:05:54 (UTC)
Goto Top
Fehler beim Kompilieren. Methode oder Datenobjekt nicht gefunden.
Ups, ist ja Access, dort geht das damit nicht.
Ich möchte nicht für jedes Control manuell ein Ereignis-Feld erstellen.
Dann machst du jetzt folgendes (oder lädst die Beispiel-Datenbank hier runter: https://we.tl/t-sHBngw5fJU):

In deiner Form wo die Label's liegen fügst du den nachstehenden Code ein
(In dem Beispiel werden alle Label-Controls mit der Event-Klasse verbunden, kannst du ja in der IF-Abfrage anpassen)
Option Compare Database
Dim lblControlCollection() As New lblEventClass

Private Sub Form_Load()
 Dim c As control, cnt As Integer
    cnt = 0
    For Each c In Me.Controls
        If c.ControlType = acLabel Then
            cnt = cnt + 1
            ReDim Preserve lblControlCollection(1 To cnt)
            lblControlCollection(cnt).SetLabel c
        End If
    Next
End Sub
Dann erstellst du im VBA-Editor ein neues Klassenmodul über Einfügen -> Klassenmodul, benennst die Klasse lblEventClass und fügst dort folgenden Code ein:
Private WithEvents lbl As label

Private Sub lbl_Click()
    MsgBox lbl.Name
End Sub

Public Sub SetLabel(l As label)
    Set lbl = l
    lbl.OnClick = "[Event Procedure]"  
End Sub
Nun die Form schließen und neu öffnen, et voilà für jeden Label öffnet sich deine Messagebox ... single event procedure for multiple controls

Done. Ciao.
Member: mreske
mreske Apr 25, 2019 at 15:21:59 (UTC)
Goto Top
Hallo timeout,

das ist haargenau das, was ich gesucht hatte.

Habe den Code und das Klassenmodul genauso, wie du es beschreibst, eingefügt,
und es klappt auf Anhieb.

Tausend Dank für die Hilfe!

Gruß und einen schönen Abend!
Mitglied: 139374
139374 Apr 25, 2019 at 15:39:56 (UTC)
Goto Top
Schön wenn's hilft. Ebenso schönen Abend.
Member: mreske
mreske Apr 27, 2019 at 11:38:44 (UTC)
Goto Top
Hallo

die von timout beschriebene Lösung funktioniert aber nur bei ungebundenen Controls.

D.h, dass man die Bindung des Bezeichnungsfeldes erst aufheben muss, damit die Ereignisprozedur funktioniert.
Bindung aufheben:
Markieren des gebundenen Bezeichnungsfeldes
STRG+X
STRG+V

Gruß
Mitglied: 139374
139374 Apr 27, 2019 updated at 11:56:15 (UTC)
Goto Top
Zitat von @mreske:
die von timout beschriebene Lösung funktioniert aber nur bei ungebundenen Controls.
Klar, der Grund ist das die gebundenen Label ja keine Events haben, was man auch sieht wenn man die Eigenschaften des Labels aufruft.

screenshot
Member: mreske
mreske Apr 27, 2019 at 12:51:58 (UTC)
Goto Top
eine Frage hätte ich aber noch:

wie kann man der lblEventClass noch weitere Variablen (z.B. den Formularnamen, in dem sich das Label befindet) übergeben?

z.B. in einer zweiten Msgbox den Formularnamen anzeigen?

Danke und Gruß
Mitglied: 139374
139374 Apr 27, 2019 updated at 13:31:40 (UTC)
Goto Top
Zitat von @mreske:

eine Frage hätte ich aber noch:

wie kann man der lblEventClass noch weitere Variablen (z.B. den Formularnamen, in dem sich das Label befindet) übergeben?
Entweder du deklarierst in der Klasse weitere Public Variables denen du dann den Wert in deiner Form zuweist, oder du machst es so wie ich es oben mit einer Public Function mit Parameter gemacht habe die den Parameter einer privaten Variable der Klasse zuweist.
Alternativ kannst du natürlich auch über die Parent-Property des Labels abfragen in welcher Form das Control liegt und dich so zur Property hangeln.
Member: mreske
mreske Apr 27, 2019 at 15:59:08 (UTC)
Goto Top
Hallo timeout,
vielen Dank für den Tipp mit der Parent-Property.

Ich habe jetzt lediglich das Klassenmodul so erweitert, dass folgendes passiert:
01. nach dem Klick auf ein Label öffnet sich das Formular "frm_LabelControl"
02. In einer Msgbox wird angezeigt: der Name des LABELS
03. Dieser Name wird dann übergeben an das Textfeld "txtLabelName"
04. In einer Msgbox wird angezeigt: der Name des FORMULARS
05. Der Formularname wird dann übergeben an das Textfeld "txtFormName"

Private Sub lbl_Click()
Dim MyControl As Object
Dim MyParent As Object
        
Set MyControl = lbl
Set MyParent = MyControl.Parent

 '01.  nach dem Klick auf ein Label öffnet sich das Formular "frm_LabelControl"  
DoCmd.OpenForm "frm_LabelControl"  

'02. In einer Msgbox wird angezeigt: der Name des LABELS  
MsgBox lbl.Name

'03. Dieser Name wird dann übergeben an das Textfeld "txtLabelName"  
Forms!frm_LabelControl!txtLabelName = lbl.Name

'04.  In einer Msgbox wird angezeigt: der Name des FORMULARS  
MsgBox MyParent.Name

'05. Der Formularname wird dann übergeben an das Textfeld "txtFormName"   
Forms!frm_LabelControl!txtFormName = MyParent.Name

End Sub

Besten Dank