Office: (Office 2016) Form.Controls-Auflistung

Helfe beim Thema Form.Controls-Auflistung in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; von drambeldier Hm. Und wo wären die Eigenschaften der Controls hinterlegt? In den jeweiligen Binary-Data-Streams der einzelnen Objekte innerhalb... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von User, 22. Februar 2016.

  1. Form.Controls-Auflistung


    In den jeweiligen Binary-Data-Streams der einzelnen Objekte innerhalb der mdb/accdb-Datei. Das interne Datenformat von Access ist von Microsoft bisher leider nicht offengelegt. Die wenigen Leute, die es (zumindest teilweise) reverse-engineered haben, behalten es auch für sich, weil Ihr Geschäftsmodel darauf basiert...
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
  2. Liebe Leute,

    nur die Ruhe.
    1. Felder über ihren controls-Index anzusprechen ist m. E. eleganter, da ich den Namen nicht erst zusammenbasteln muss und so nicht unnötiger Stringmüll entsteht (garbage collection); Access muss dann auch nicht erst danach suchen, selbst wenn die Namen in einem binary tree gespeichert sind. Ich hatte vor Jahren (acc2000) mal einen Test mit ca. 300 Feldern gemacht und die Performance war per Index einfach besser.
    2. Was ist ein Recordset anderes als ein Array und eben ein set of records (Plural)? Wenn ich meine Daten also komplett als RS lade, kann ich einfach auf sie zugreifen, sie verändern/kombinieren, in meine GUI-Felder schreiben und aus ihnen wieder zurück in meine DB-Tabelle.
    3. Ein Problem von UFOs sind ungebundene Felder. Gebe ich z.B. in ein ungebundenes Feld eines Endlos-Ufos einen Wert ein, wird dieser Wert in allen 'geklonten' Ufos angezeigt. Ich habe bisher nicht herausgefunden, wie ich den scope auf genau ein Ufo beschränken kann.
    4. Ich habe jetzt eine Referenztabelle gebaut, die mir die Controls-Indizes in ein schlankes Integer-Array liest (das dauert bei 450 Feldern kaum eine Sekunde).
    5. Den Controls-Index zu nutzen, weil es ihn gibt, ist für mich genau so selbstverständlich, wie die Font-Eigenschaft zu nutzen, weil es sie gibt.
    6. Ich habe meine Felder nach dem Schema FFnnn benannt (natürlich per VBA). Was ist nun eleganter (Luftcode)
    for i = 1 to max
    feldname = "FF" & rechts(str$(i+1000),3)
    me.controls(feldname) = "Otto"
    next

    oder

    for i = 1 to max
    me.controls(referenztabelle(i)) = "Otto"
    next
    7. Ich bin nicht der Ansicht, dass meine Beschreibung kompliziert ist.
    8. Letztlich will ich sogar Daten aus 3 Tabellen in meinen Feldern kompakt darstellen. Jeder Tabellen-Auszug enthält jeweils genau 450 Zeilen mit je ca. 3 bis 5 Werten. Es erscheint mir einfacher, diese Daten als Recordsets zu laden, meine Berechnungen anzustellen und die Ergebnisse in meine (ungebundenen) Felder zu schreiben. Und Access braucht sich nicht darum zu kümmern... Erst wenn ich fertig bin, werden veränderte Daten per Code in die zugrunde liegenden Tabellen zurück geschrieben. Dies käme durchaus auch einer asynchronen Verarbeitung in einem .Net-Projekt nahe. Ich will Access einfach nur als GUI nutzen, das Interagieren mit der Datenbank mache ich selbst. Ist das sooo abwegig?

    @josef P.
    Das wäre ja durchaus ein interessanter Ansatz. Aber mit meiner Ref-Tabelle klappt es auch so. Ich glaube, dass ich so etwas früher schon gemacht habe, insbes. in VB.Net. Ich habe damals einfach ein Feld als Layout-Quelle definiert und es dann per Code geklont. War sehr elegant und ich habe mir viel 'Fitzelei' im Form-Editor gespart.

    @Maggie_may
    Ich möchte hier niemand von irgendwas überzeugen, also bitte Ruhe bewahren. Mein Ansatz ist sicher nicht so falsch, denn es geht um Ergonomie für den Anwender.
    Die Darstellung von 450 Feldern in einer einzigen Form, noch dazu mit 3 Tabellen als Quelle - wie willst du das ergonomisch und elegant gestalten, auch aus Programmiere-Sicht?
    Natürlich kann man Daten in System-Tabellen ändern, denn in ihnen gespeicherte Daten entstammen ja Eingaben und Änderungen über die Access-Oberfläche. Access benutzt sich selbst, um z. B. Forms zu speichern. Alles kein Hexenwerk und durchaus strukturiert.

    Wenn ich soweit bin, werde ich gern ein Beispiel hier hochladen. Im Moment halte ich das allerdings für verfrüht und nicht sinnvoll.

    Liebe Grüße,
    Dinkel
     
  3. Nur gut, dass ich das nicht wusste, sonst wäre ich nie auf die Idee gekommen, mir eine Routine zu schreiben, die mir die Eigenschaften der Controls zeigt.

    Im Modul ShellExecute steckt die Prozedur tt, die macht genau das. Bitte die Db nicht weiter anschauen, ist schlicht zum Ausprobieren.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    drambeldier, 25. Februar 2016
    #18
  4. Form.Controls-Auflistung

    Warum? Dass irgendwas in einem schwer verständlichen internen Format gespeichert ist, heißt ja nicht, dass du nicht auch durch eine einfache, dokumentiere API (in diesem Fall das Access-Objektmodell) darauf zugreifen kannst.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
  5. Für sich gesehen ist die zweite Variante in meinem Empfinden durchaus eleganter. Den weniger eleganten Code hast du dann aber beim Aufbau deiner Referenztabelle genauso wie in der ersten Variante.
    Daher bleibe ich bei meiner Auffassung, dass die erste Variante insgesamt weniger komplex und einfacher zu verstehen ist.

    Ob es von der Performance her einen Unterschied macht, möchte ich weiterhin bezweifeln. Probier es doch einfach mal aus und poste dann mal die Vergleichsergebnisse hier.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
  6. Schon einmal daran gedacht ein ado recordset zu verwenden.
    Entweder das Recordset mit den berechneten Daten öffnen, oder falls nicht möglich die restlichen Berechnungen selbst durchführen und in das recordset schreiben.
    Dann kannst du das fertige Recordset dem UF zuweisen.
    Der User führt die Änderungen durch und du kannst sofort bei jedem Update die Änderungen wie erforderlich in die Original Tabellen zurückschreiben.
    Das würde eine ganze Menge unnötigen Aufwand ersparen, und die Performance wäre auch viel besser.

    LG Markus
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    markusxy, 25. Februar 2016
    #21
  7. \@Dinkel:
    Ja eben, über die Oberfläche.
    Welche Systemtabelle dir bei diesem Projekt helfen könnte bleibt unklar. Klar ist lediglich, dass Systemtabellen generell nicht (von außen) änderbar sind. Änderst du den Namen eines Formulars, schlägt sich das natürlich auch in der Systemtabelle nieder, aber niemals kannst du dort selbst einen Eintrag direkt in der Tabelle ändern.
    Die Formulare findet man wie alle anderen Objekte in der MSysObjects, aber nur den Namen und ein paar Attribute. Den Inhalt eines Formulars, seine Steuerelemente und deren Eigenschaften findest du in keiner Systemtabelle, diese Definitionen stecken im Formular selbst. Exportiere mal ein Formular mit der SaveAsText-Methode, dann bekommst du eine ungefähre Vorstellung davon.
    Natürlich ist es mit der Referenztabelle eleganter, aber von deren Existenz war anfangs ja noch nicht die Rede. Außerdem muss sie erstmal erstellt und auch gepflegt (!) werden.

    BTW:
    Führende Nullen erzeugt man ganz einfach mit der Format-Funktion.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    MaggieMay, 25. Februar 2016
    #22
  8. Form.Controls-Auflistung

    \@Maggie
    Dank für deine Erläuterungen.
    OK - von einer solchen Referenz-Tabelle war in meiner initialen Post nicht die Rede. Die Idee dazu kam mir erst später...

    Prima. Natürlich. Ich denke nur, dass die Format-Funktion für so eine Aufgabe einfach zu mächtig ist, da sie ja immer interpretativ arbeiten muss. Mein simpler Trick mit einer Integer-Addition ist bestimmt schneller, denn während format den Format-String im eigenen Parser noch auf mögliche Inhalte analysiert, bin ich vermutlich schon fertig.

    Sorry, aber ich komme aus einer Zeit, in der es noch wichtig war, Code zu optimieren, Rechenzeit einzusparen und String-Operationen möglichst zu vermeiden (garbage-collection). Mächtige Funktionen (wie hier Format) aufzurufen, ist vielleicht generell einfacher, aber mit meinem simplen Trick geht's eben auch und ich brauche nicht den gesamten internen Format-Overhead zu bemühen (Instanziieren, Daten laden, parsen, String zusammenbasteln, destructen, Heap aufräumen, Speicher freigeben...)

    Du kannst ja mal einen kleinen Test bauen und die Ergebnisse hier posten.

    Ich könnte meine 450 Felder vielleicht auch mit geschachtelten "wenn()" und mehreren bedingten Formatierungen zusammenschustern. Aber wo bleibt dann die Übersicht? Ich müsste für jedes einzelne Feld meiner form all das wiederholen. Da ist es doch mit absoluter Sicherheit besser, dies im VBA-Code zu tun, denn dann sehe ich, was passiert oder passieren soll und ich kann auch debuggen.

    Eine kleine Aufgabe hätte ich da als Beispiel:
    Ich habe in einer Tabelle sagen wir 30 Attribute als Wahr/Falsch-Felder. Diese Felder sollen in einem Formular als grüne oder rote Rechtecke dargestellt werden, jedes 0,2cm breit und alle in einer Zeile nebeneinander. Ich möchte in diesen Feldern aber keine abgeschnittenen Texte (Wahr oder Falsch) sehen, sondern einfach nur die Farben Rot oder Grün.
    Wie würdest du das lösen?

    Bin gespannt.
     
  9. Hallo!

    Als erstes würde ich überlegen, ob ich vielleicht einen Normalierungsschritt vergessen habe.
    Falls ich das ausschließen kann, würde ich 30 Textfelder nutzen, und die Farbe über bedingte Formatierung einstellen. Über die Format-Eigenschaft der Textbox würde ich verhindern, dass ein Text angezeigt wird.
    Ein Problem gibt es aber: das ist alles mit Access-Bordmitteln ohne VBA einstellbar. *wink.gif*


    Falls ich es komplizierter machen wollte:
    Eine Klasse für die Steuerelementformatierung und eine Container-Klasse die alle Steuerelemente aufnimmt. Im Formular wird dann über die Container-Klasse eine Instanz der Steuerelement-Formatierungs-Klasse erzeugt und die passende Textfeld-Referenz übergeben.
    ... das ist zwar im Vergleich zur Variante mit der bedingten Formatierung um einiges aufwendiger, aber dafür eine schöne Übung zum Gestalten von Klassen, wenn man die Schnittstelle sauber gestalten möchte.

    mfg
    Josef
     
    Josef P., 25. Februar 2016
    #24
  10. Hallo,
    das darf es in einer normalisierten Datenbank gar nicht geben.
     
    gpswanderer, 25. Februar 2016
    #25
  11. \@Josef
    Danke für deine Antwort.
    Einen Normalisierungsschritt habe ich dabei bestimmt nicht vergessen. Ein Beispiel könnte ein Fragebogen sein oder vielleicht der DNA-Vergleich zweier Probanden oder die sensitive Beurteilung eines Produkts...
    Textfelder zu nutzen ist schon mal gut, weil man sie auch an die Daten binden kann. Bei der bedingten Formatierung habe zumindest ich leichte Probleme, denn ich kriege den Text nich weg.

    Also warte ich noch auf eine weitere Idee.
     
  12. Hallo,
    das sind aber eher Beispiele für klassische n:m Beziehungen und nicht für die Notwendigkeit von Ja/Nein Feldern.
    Die sensitive Beurteilung eines Produkts über Ja/Nein Felder ist mit Sicherheit der falsch Weg. Wenn Du was anhakst hast Du ja eine feste Vorgabe zum Anhaken.
    Demzufolge ist das eine n:m Beziehung mit 3 Tabellen.
    - Produkt
    - Eigenschaften (alle die möglich sind)
    - Produkt_Eigenschaft (jeweils ein Datensatz, mit den zutreffenden Eigenschaften)

    Kannst Du mal ein Bild der Beziehungen Deiner DB posten.
     
    gpswanderer, 25. Februar 2016
    #27
  13. Form.Controls-Auflistung

    \@gpswanderer
    OK - ich könnte in meinem gedachten Beispiel die 30 Felder auch sequentiell in einer zweiten Tabelle speichern. Dann wäre der Normalisierung genüge getan.
    Aber ich möchte diese 30 Felder nebeneinander in einer Zeile darstellen. Und siehe da macht mir die strikte Normalisierung Probleme an der Darstellungs-Oberfläche.
    Da ist es doch einfacher, die 30 Felder als Attribute in meiner Tabelle zu halten, weil sie dann schon 'horizontal' sind, oder?

    Normalisierung ist OK, aber man muss dabei auch Möglichkeiten, Grenzen und Konsequenzen berücksichtigen.
     
  14. \@gpswanderer
    Auf den ersten Blick magst du ja recht haben. Aber wenn du dir vorstellst, dass bei einer Analyse immer genau 30 Parameter ja-nein-geprüft werden, ist es m. E. doch erheblich einfacher, diese Prüfungen un-normalisiert in der Tabelle zu speichern.
     
  15. Darum schrieb ich, dass ich den Text mit der Format-Eigenschaft entfernen würde.

    mfg
    Josef
     
    Josef P., 25. Februar 2016
    #30
Thema:

Form.Controls-Auflistung

Die Seite wird geladen...
  1. Form.Controls-Auflistung - Similar Threads - Form Controls Auflistung

  2. User form Drucken Position

    in Microsoft Excel Hilfe
    User form Drucken Position: Hallo Leute Habe den Code für das Ausdrucken einer User Form.. Die User Form wird im A4 Blatt gedruckt habe aber links nur einen Abstand von einem 1 cm zum Blattrand. Wie kann ich den Abstand vom...
  3. User Form

    in Microsoft Excel Hilfe
    User Form: Hallo Leute Habe ine User form dort kann ich Daten aus Tabelle Januar füllen. Habe jetzt noch 11 Tabellanblätter eingefügt Februar bis Dezember. Ist es möglich mit der gleichen User form auf...
  4. Gruppieren von Formen und Bildern in Word 2016

    in Microsoft Word Hilfe
    Gruppieren von Formen und Bildern in Word 2016: Hallo! Ich versuche gerade in Word 2016 ein Bild mit einer Form zu gruppieren. Ich möchte, dass das rote Viereck mit dem Bild gruppiert wird, so dass sie zusammen gehören. Mit Strg+Mausklick...
  5. Daten in neue Form umsortieren

    in Microsoft Excel Hilfe
    Daten in neue Form umsortieren: Muss eine vorhandene Excel Datei komplett neu strukturieren, und komme auf keinen grünen Zweig.
  6. Tägliche automatische Verschiebung eines Rechtecks

    in Microsoft Excel Hilfe
    Tägliche automatische Verschiebung eines Rechtecks: Hallo zusammen, ich habe folgendes Anliegen und hoffe jemand kann mir dabei helfen. Wie kann ich das rote Rechteck (siehe Anhang) automatisch am jeweiligen Tag beim erstmaligen Öffnen auf den...
  7. Excel Tabelle Spesen mit Formes nach Tagen

    in Microsoft Excel Hilfe
    Excel Tabelle Spesen mit Formes nach Tagen: [ATTACH] Hallo zusammen, nachdem ich beim letzten Mal so gut geholfen bekommen habe, versuche ich es nochmal mit einem neuen Thema. Mir fehlt auch etwas die Inspiration wie die Tabelle überhaubt...
  8. Bild in Form einfügen, druckt mit "hintergrund"

    in Microsoft Word Hilfe
    Bild in Form einfügen, druckt mit "hintergrund": Bei der Ansicht sieht alles normal aus, aber wenn ich drucke habe ich bei den Bildern einen "Hintergrund". Habe die Bilder auch schon als .png, .jpeg abgespeichert und versucht. Auch mit der...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden