Mai 16, 2021, 23:54:37

Neuigkeiten:

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


Formular für verschiedene Zwecke

Begonnen von crystal, April 16, 2021, 13:17:30

⏪ vorheriges - nächstes ⏩

crystal

Hallo,

ich habe ein recht komplexes Formular zur Pflege von Kundendaten. Im Kunden-Bearbeitungs-Modus (Standalone-Modus) hat dieses Formular die üblichen eingebauten Steuerelemente (Navigationleiste, gehe zu, Neu, Löschen, Filtern, Min/Max etc.).

Nun möchte ich dieses Formular fast 1:1 an anderer Stelle benutzen, z. B. bei der Auftrags-Bearbeitung: über einen Button "Bearbeiten" soll es möglich sein, das Formular aufzurufen und zwar mit genau dem vorher zum Auftrag eingegebenen Kunden (Recordsource anpassen). Dabei sollen einige Funktionen abgeschaltet werden (Navigation, Neu, Löschen, aber auch einige eigene Buttons, Textfelder etc.).

Im Form_Load-Event geht das nicht (mehr?).

In welchem Form-Event, der sowohl im Standalone-Modus als auch im Aufruf via Button durchlaufen wird, kann ich das machen?

Danke für eure Hilfe,

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

@crystal
Abgesehen davon dass ich es anders herum bevorzuge, also die
Auftragsbearbeitung/-anlage vom Kunden-Formular starte, kannst
du, wenn nicht anders in Verwendung, mit dem Parameter "OpenArgs"
das Startverhalten eines Forms beeinflussen.
Habe ich gerade selber so gemacht für die Verwaltung und Reservierung
unserer Billardtische. Bei der Verwaltung ist das UFo für die Reser-
vierungen "abgeschaltet", und bei der Reservierung sind die Felder
für die Verwaltung (inkl. Navi-Buttons) unsichtbar. So kann ich über
Listfelder (aufgeteilt nach Arten der Tische, - Pool, Snooker, Karambol)
einen Tisch im HFo aussuchen, und im UFo eine Reservierung dafür anlegen,
ohne an den Tischen "herummachen" zu können.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

crystal

April 16, 2021, 20:54:26 #2 Letzte Bearbeitung: April 16, 2021, 21:12:03 von crystal
@Beaker s.a.
Hallo!
Ja - mit openargs habe ich so manches auch hinbekommen im Form_Open-Event.
Leider geht das
.CloseButton = False
nicht - auch nicht in Form_Load.
FM etwa: ...im Entwurfsmode öffnen...

Also muss eine globale Funktion her, die in Form_Open aufgerufen wird (Luftcode vermutlich mit Syntax-Fehlern):
Private Sub Form_Open(Cancel As Integer)
...
if left(openargs,11) = "Bearbeiten=" then
'                       12345678901
   Call Toggle_Form(me.form.name, openargs)
   '^^^ dadurch wird dieses Formular geschlossen, bearbeitet, wieder geöffnet und der Code läuft hier
   'hin:
   'vvv
elseif left(openargs,12) = "XBearbeiten=" then
   lngKunde=clng(mid(openargs(13))
...

---------
Und in einem Modul:
---------

Public Function Toggle_Form(strForm as string, strOpenargs as string)
'erstmal aufrufendes formular schließen
   docmd.close acform,strForm
'jetzt dasselbe formular im designmode öffnen und gew. änderungen machen
   DoCmd.OpenForm strForm, acDesign
   with strform
      if stropenargs="Bearbeiten" then   
         .CloseButton=False
         ...
      else
         .CloseButton=True
         ...
      end if
   end with
'dann das formular schließen und gleich wieder normal öffnen,
'die originalen Openargs mit vorangestelltem X übergeben
   DoCmd.Close acForm, strForm, acSaveYes
   DoCmd.OpenForm strForm, acNormal, "X" & strOpenargs
end function

Etwas sehr mühsam und auch erst die halbe Miete (man müsste sich wohl noch im Formular selbst merken, in welchem Modus es gerade vorliegt. z. B. in btnDummy.Tag).

Von der Logik her müsste es doch so klappen - oder gibt es eine bessere Idee??? Ich möchte das Formular ungern duplizieren (enthält viel Code) und dann müsste ich Änderungen ja immer in beiden Formularen machen.

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

@crystal
Verstehe ich alles nicht. Um die Eigenschaften "visible" und/oder "enabled"
einer Schaltfläche zu verändern brauche ich doch keine Entwurfsansicht. Das
funzt doch per VBA temporär auch in der normalen Formularansicht. Diese
Eigenschaften werden dabei eben entweder auf True oder False gesetzt.
Das geht auch kürzer als mit einem If ... Then ... wenn du per OpenArgs gleich
den Wahrheitswert mit übergibst (0 = False, -1 = True). Obwohl OpenArgs nur
einen String übergibt sorgt die implizite Typumwandlung von VBA dafür, dass
es funzt
Me.CloseButton.Visible = Me.OpenArgs(oder .Enabled)
Wenn du, wie es aussieht mehrere Argumente mit OpenArgs übergeben willst,
würde ich die mit einem Trennzeichen (ich bevorzuge die |) übergeben, und
beim Öffnen in ein Array splitten anstatt es mit Mid und Konsorten ausein-
ander zu nehmen.
Warum übergibst du i.Ü. eine KundenID per OpenArgs? Um beim Öffnen eines
Forms zu filtern gibt es doch den Parameter "WhereCondition" bei
DoCmd.OpenForm ...Der ist doch dazu da.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

crystal

@Beaker s.a.
Hallo Ekkehard,
Nein - es geht nicht um ein paar einfache Buttons im Formular. Die ein/aus zu schalten ist trivial.

Es geht darum, gewisse FORMULAR-Eigenschaften zu setzen, die man eben im Dialog-Modus NICHT ändern kann, z. B. Form.CloseButton. Diese Eigenschaft kann NUR im Entwurfs-Modus geändert werden! Das habe ich m. E. auch klar so beschrieben.

Einen Filter statt eines zu interpretierenden Strings bei OpenForm zu nutzen, ist natürlich auch möglich. Ich benutze hier lieber einen String, dem ich in der globalen Funktion noch ein "X" voranstelle, damit beim 2. Öffnen des Formulars nicht dieselbe Funktion wieder aufgerufen wird (s. Kommentar im Luftcode).

Insofern gehen deine Antworten leider an meiner Fragestellung vorbei.

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

@crystal
ZitatNICHT ändern kann, z. B. Form.CloseButton
Ich hab's jetzt nicht getestet, aber die OH lässt mich etwas anderes vermuten
ZitatGibt an, ob die Schaltfläche Schließen in einem Formular (Formular: Ein Access-Datenbankobjekt, in das Sie Steuerelemente für die Ausführung bestimmter Aktionen oder für die Eingabe, Anzeige und Bearbeitung von Daten in Feldern platzieren.) aktiviert ist. Boolean-Wert mit Lese-/Schreibzugriff.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

crystal

@Beaker s.a.
Hallo Ekkehard,

zunächst mal: es geht NICHT allein um den Close-Button, sondern auch um andere Eigenschaften eines Formulars, die nur im Entwurfsmodus geändert werden können.

In deinem OH-Zitat unterschlägst du die entscheidende Aussage, die unmittelbar nach dem Zitat steht! Da nützt deine vorschnelle Unterstreichung auch nichts. Schau mal selbst und als Tipp: immer erst vollständig lesen, was nicht nur für die OH gilt, sondern z. B. auch für Threads und Posts  ;) !

Zum Thema fand ich folgendes (Antwort #8):
https://www.ms-office-forum.net/forum/showthread.php?t=255844

und (Antwort von ADezii):
https://bytes.com/topic/access/answers/967464-disabling-close-button-temporarily

Also ist mein Ansatz schon richtig... Ich werde es dann mal so probieren.

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

crystal

Ich probier jetzt mal die Checkbox "Thema schließen" unter "Attachements and other options".
Sorry, Ekkehard, falls du dann nicht mehr antworten kannst.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...