[GELÖST] Verwende ! anstatt .

Moderator: ModerationP

[GELÖST] Verwende ! anstatt .

Beitragvon Dieterlem » 01. Dez 2017, 12:50

Hallo ACCESS Freunde,

ich habe irgendwo gelesen dass ich ! anstatt einen . verwenden soll:

Me.Textfeld => Me!Textfeld oder Me.Kombibox => Me!Kombibox oder Forms.Formularname.Textfeld => Forms!Formularname!Textfeld

Was ist der Vorteil, wenn ich die Ausrufezeichen verwende? Warum sollte ich es tun?


Gruß
Dieterlm
Zuletzt geändert von Dieterlem am 01. Dez 2017, 14:22, insgesamt 1-mal geändert.
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 178
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Verwende ! anstatt .

Beitragvon Bitsqueezer » 01. Dez 2017, 13:51

Hallo,

kurze Antwort: Vergiß das Ausrufezeichen und die Empfehlungen dazu (meine Meinung).

Da ich das Thema schon ausführlich beschrieben habe, hier die Links dazu zum Selberlesen:

http://www.office-loesung.de/ftopic334143_0_0_asc.php
http://www.office-loesung.de/ftopic508826_0_0_asc.php

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7166
Registriert: 21. Jun 2007, 12:17

[GELÖST]: Verwende ! anstatt .

Beitragvon Dieterlem » 01. Dez 2017, 14:21

Hallo,

Danke für die Aufklärung. Ich fühle mich mit den Punkten auch wohler. Bessere lesbarkeit und es fängt Fehler in der Schreibweise gleich ab.
Habe mich nur sehr gewundert, dass ich mit Rufyeichen oder Punkt arbeiten kann. Da wollte ich doch lieber mal die Profies fragen.

Gruß
Dieterlem
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 178
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: [GELÖST] Verwende ! anstatt .

Beitragvon Yaslaw » 01. Dez 2017, 14:35

So einfach ist es leider nicht.

. bei Aufzählungen/Containern bei denen VBA im Vorfeld die Elemente kennt.
Bei Formularen etc ist das so. Da ist das Feld hinterlegt und VBA erkennt das Element.

Wenn das Formular aber beim öffnen aufgebaut wird (Fleder per VBA hinzufügen), geht es nicht.

! um auf Elemente zuzugreifen, die mit dem Namen in einem Container hinterlegt sind. Auch solche, die nicht im Vorhinein kompiliert wurden.

Am besten hält man sich an folgende einfache Faustformel.
Alles was fixe Eigenschaften sind, mit einem .
Alles was über eine Auflistung erreichbar ist, mit einem !
Gilt auh in Formularen: Auflistung: Me.Controls("ID") oder Kurzform Me("ID")

Ein Beispiel mit einem Dictionary
Code: Alles auswählen
Dim dict As New Dictionary

dict.add "abc", 123
dict.add "def", 456

'Bekannte Eigenschaft des Objektes.
Debug.Print dict.count
'Gibt zwar kein Fehler, aber er findet kein Element mit dem Namen "count"
Debug.Print dict!count

'abc ist in einer Auflistung drin
Debug.Print dict.item("abc")
'Kurzform, da item() als Standardliste in dict definiert ist
Debug.Print dict("abc")

'Direkter Zugriff auf das Element ohne über einen String
'Funktioniert, gibt 123 zurück
Debug.Print dict!abc

'Erzeugt Fehler 483
Debug.Print dict.abc
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements sind formatierbar)
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
Benutzeravatar
Yaslaw
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2911
Registriert: 02. Jul 2014, 15:25
Wohnort: Winterthur

Re: [GELÖST] Verwende ! anstatt .

Beitragvon Nouba » 01. Dez 2017, 14:51

Dadurch, dass Steuerelemente im Formularmodul (quasi als Resource) integriert sind (siehe Objektkatalog oder verwende die versteckte Methode SaveAsText, um die Resource in einem Editor zu betrachten), kann mit dem Punkt-Operator auf eingefügte Steuerelemente in Formularen oder Berichten zugegriffen werden (das gilt auch für VB-Classic und die Microsoft Forms). Mit dem Punkt-Operator greift man aber nicht auf eine als Standardeigenschaft deklarierte Auflistung einer Klasse zu, wie das beim Bang-Operator (!) der Fall ist, sondern direkt auf die Resource.

Mit Kompilieren hat das IMHO gar nichts zu tun.
mit freundlichen Grüssen Nouba

Wenn beim Lesen eines Beitrags der Eindruck entsteht, dass sich der Fragesteller wenig Mühe gegeben hat, so erhöht das nicht unbedingt die Motivation, eine Antwort zu verfassen.
Nouba
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17403
Registriert: 13. Mär 2006, 12:55
Wohnort: Berlin

Re: [GELÖST] Verwende ! anstatt .

Beitragvon Gast » 02. Dez 2017, 10:53

Code: Alles auswählen
'Direkter Zugriff auf das Element ohne über einen String
'Funktioniert, gibt 123 zurück
Debug.Print dict!abc

Denkfrage:
Ist eine verkürzte Schreibweise und ein Direktzugriff auf das Item das Gleiche?
Oder muss bei einer verkürzten Ausdruck nicht Access/VBA selber in der Auflistung nachschlagen, was denn nun gemeint ist?
Gast
 

Re: [GELÖST] Verwende ! anstatt .

Beitragvon Nouba » 02. Dez 2017, 11:32

Die Ausdrücke
Code: Alles auswählen
   dict!abc
   dict("abc")
   dict.item("abc")
sollten alle den selben Code verwenden. Abhängig davon, ob dict als Object (verwendet dann das IDispatch-Interface) oder über eine TypeLib (verwendet dann das IDual- oder das IAutomation-Interface - mehr dazu unter Component Object Model) deklariert ist, kann dieser Code jedoch unterschiedlich ausfallen.
mit freundlichen Grüssen Nouba

Wenn beim Lesen eines Beitrags der Eindruck entsteht, dass sich der Fragesteller wenig Mühe gegeben hat, so erhöht das nicht unbedingt die Motivation, eine Antwort zu verfassen.
Nouba
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17403
Registriert: 13. Mär 2006, 12:55
Wohnort: Berlin

Re: [GELÖST] Verwende ! anstatt .

Beitragvon ComputerVersteher » 04. Dez 2017, 22:57

Hi,

hier noch ein Link der den Bang-Operator erklärt (allerdings auf Englisch) The Bang! (Exclamation Operator) in VBA und Anwendungsfälle außerhalb von Collections zeigt.

@Yaslaw:
Yaslaw hat geschrieben:Wenn das Formular aber beim öffnen aufgebaut wird (Fleder per VBA hinzufügen), geht es nicht.
Wenn Du Accde/Mde's verteilst stellt sich das Problem nicht. Bei dynamischen Formularen muss man die Controls dann zwar ausblenden, bis man sie braucht (kostet natürlich Resourcen), aber dann hast Du auch die entsprechen Eigenschaften zur Verfügung.

Yaslaw hat geschrieben:Auch solche, die nicht im Vorhinein kompiliert wurden.
Auf die greifst Du dann aber doch über eine Variable zu und das geht nicht mit dem Bang.

Yaslaw hat geschrieben:'Erzeugt Fehler 483
Debug.Print dict.abc
Man kann halt nicht alles haben. Die Eigenschaften die auf die Controls (und auch Recordset Felder?) verweisen sind ein Bonus, den man nicht überall hat, aber immer noch besser als kein Bonus.

Man kann natürlich auch mit dem Bang Operator gut arbeiten, sollte aber wissen was man tut und wo die Fallgruben sind. Hab ich bis jetzt auch meist gemacht (auch auf Rat vom Don Karl ;-) ), aber ich denke das Nutzen der Eigenschaften hat Vorteile die man nicht ungenutzt lassen sollte.

BTW: Kennt jemand ein Addin, das Controls und RS-Felder unterschiedlich benennt beim Einfügen per "Vorhandene Felder hinzufügen"? Das manuelle Umbennen ist ja irgendwie unschön ;-)

Gruß CV
"Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."
Benutzeravatar
ComputerVersteher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 360
Registriert: 23. Jul 2016, 18:17

Re: [GELÖST] Verwende ! anstatt .

Beitragvon Bitsqueezer » 05. Dez 2017, 07:48

Hallo Computerversteher,

ich habe dafür ein kleines Skript in VBA, das mir meine Namenskonventionen umsetzt. Es benennt alle Controls und zugehörige Labels um, die an ein Datenbankfeld gebunden sind.

Code: Alles auswählen
Public Sub RenameObjects(strForm As String)
    Dim ctl As Access.control
    Dim frm As Access.Form
    Dim strCaption As String
   
    DoCmd.OpenForm strForm, acDesign
    Set frm = Forms(strForm).Form
    For Each ctl In frm.Controls
        If TypeOf ctl Is Access.TextBox Or TypeOf ctl Is Access.ComboBox Then
            If ctl.ControlSource <> "" Then
                ctl.Name = "ctl_" & ctl.ControlSource
            End If
        ElseIf TypeOf ctl Is Access.label Then
            If InStr(ctl.Caption, "_") > 0 Then
                If Right(ctl.Caption, 1) = ":" Then
                    strCaption = Left(ctl.Caption, Len(ctl.Caption) - 1)
                Else
                    strCaption = ctl.Caption
                End If
                ctl.Name = "lbl_" & strCaption
                ctl.Caption = Mid(ctl.Caption, InStr(ctl.Caption, "_") + 1)
                ctl.Caption = Replace(ctl.Caption, "_", " ")
            End If
            If ctl.Caption = "Auto_Title0" Then
                ctl.Caption = "lbl_Title_" & frm.Name
            End If
        End If
    Next
End Sub


Da meine Feldnamen alle in der Form "X_Name" (X= A/F/ID/C) aufgebaut sind, funktioniert das eigentlich immer. Controls (Textbox/Kombobox) werden in "ctl_Name" umbenannt und Labels in "lbl_Name".
Das "Auto_Title0"-Label wird außerdem automatisch in "lbl_Title_Formularname" umbenannt.

Das kannst Du Dir ja beliebig anpassen.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7166
Registriert: 21. Jun 2007, 12:17

Re: [GELÖST] Verwende ! anstatt .

Beitragvon ComputerVersteher » 05. Dez 2017, 10:00

Dank Dir Bitsqueezer,

Ähnliches hab ich auch im Netz gefunden. Aber leider kein Add-In das gleich beim Einfügen die Namen anpasst. Das könnte ein schönes Projekt für nächstes Jahr werden um meinen programmier Horizont zu erweitern.

Gruß CV
"Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."
Benutzeravatar
ComputerVersteher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 360
Registriert: 23. Jul 2016, 18:17


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste