"Crash-Kurs BASIC und Dialoge"?

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: "Crash-Kurs BASIC und Dialoge"?

Re: "Crash-Kurs BASIC und Dialoge"?

von pcdirk91 » Mo, 17.02.2020 21:30

Schönen Abend Marcel,
wollte mich nur kurz melden und Dir einen Teilvorschlag unterbreiten. Habe heute etwas Zeit gehabt und versucht einen Anfang deiner Anmerkungen in die Tat umzusetzen. Wundere Dich nicht wegen des Functionsnamen ist noch ein Test,. ich hoffe so bist Du zufriedener.
Was ich nicht verstehe und nachvollziehen kan ist wieso das Array A_TabBereich nicht als Integer sondern als Variant definiert werden muss ??? es besteht doch ausschliesslich aus Integer werten ??? Oder kann man das so lassen????

Schnell noch ne Frage Hast Du meine Mail Bekommen?? Wolte das nicht im Chat schreiben. Ich hoffe Dir geht es Gut und alles ist Ok Bei Dir.

Code: Alles auswählen

Option Explicit
Global oDoc As Object,oLib As Object,oView As Object,oWin As Object													' Die Globalen Object var. "oDoc","oLib","oView" und "oWin"werden deklariert
Global BildX As Long,BildY As Long,BildBr As Long,BildHo As Long													' Die Globalen Long Var. "BildX","BildY","BildBr" und "BildHo"werden deklariert

Global Const vonSpalte as Integer =1
Global Const vonZeile  As Integer =3

Sub Start																											' Prozedur "Start"  legt duverse Globale Var. fest und wird beim Öffnen dieser Datei ausgeführt
 oDoc   = ThisComponent																								' Die Object Var. "oDoc"  mit "ThisComponent" belegen
 oLib   = DialogLibraries.getbyname("ErstellungHexaeder")															' Die Object Var. "oLib"  mit der Bibliothek für die Dialoge belegen
 oView  = thiscomponent.CurrentController																			' Die Object Var. "oView" mit dem Controller für diese Datei belegen
 oWin = StarDesktop.getCurrentFrame().getContainerWindow() 															' Den WindowsContainer in die Var oWin als Object aufnehmen oWin = StarDesktop.getCurrentFrame().getContainerWindow()
 BildX oWin.PosSize.x																								' Die x-Position der Anwendung ermitteln und in die Globale Var. "Bildx" aufnehmen
 BildY oWin.PosSize.y																								' Die y-Position der Anwendung ermitteln und in die Globale Var. "Bildx" aufnehmen
 BildBr = oWin.Size.Width																							' Die Bildbreite der Anwendung ermitteln und in die Globale Var. "BildBr" aufnehmen
 BildHo = oWin.Size.Height																							' Die BildHoehe  der Anwendung ermitteln und in die Globale Var. "BildBr" aufnehmen
 BasicLibraries.LoadLibrary("ErstellungHexaeder")																	' Die Bibliothek "ErstellungHexaeder" (Prozeduren für die Anwendung) laden

End Sub


Code: Alles auswählen

Option Explicit
Public oBlatt as Object
' Die Integer Var. deklarieren
Public anzDat as Integer
' Die Arrays Deklarieren
Public A_TabBereich as Variant


Sub Anlegen																																									
 'Den Dialog  "Menue" ausblenden 
' odlg_Menue.setVisible(False)																																					
 ' Die BlattindexNr. in die Var. oBlatt aufnehmen
 oBlatt= odoc.Sheets.getByIndex(2)
 'Das Blatt "Hintergrund" aktivieren
 oView.setActiveSheet(oDoc.Sheets.getByName("Hintergrund"))
 'Die Funktion F_Test zum erzeugen des Arrays "A_TabBereich" mit ÜbergabeParameter sind bisSpalte und Prozedurart ausführen
 F_Test(4,"anlegen")
' Weitere Befehle

End Sub




Function F_Test(bisSpalte as Integer,Prozart as String)
 Dim oObj1 as Object,oFunctionAccess As Object						
 Dim bisZeile  As Integer

 'Den Cursor im aktivierten Blatt in die Var. oObj1
 oObj1 = oBlatt.createCursor()
 ' Die letzte belegte Zelle im aktivierten Blatt ermitteln
 oObj1.gotoEndOfUsedArea(False)
 'Wenn die letzte Zeile (Index) < 3 die Var. "bisZeile" mit dem Wert 3 belegen sonst mit dem Index der Letzten belegten Zeile   	
 If oObj1.getRangeAddress().StartRow >=3 Then bisZeile = oObj1.getRangeAddress().EndRow : Else bisZeile= 3
 'Den funktionsserviec in die Var "oFunctionAcess" aufnehmen
 oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
 Dim args( 1 ) As Variant													
 'Den zu durchsuchenden Bereich im Agrgument Agrs(0) festelegen
 args(0) = oBlatt.getCellRangeByPosition(vonSpalte,vonZeile,vonSpalte,bisZeile)
 args(1) = ">0"
 'Die Var. "AnzDat" aus der Anzahl der bisher angelegten Datzensätze des aktiven Blattes ermitteln	
 anzDat = oFunctionAccess.callFunction( "COUNTIF", args() )
 'Das Array A_TabBereich bilden
 A_TabBereich = Array(vonSpalte,vonZeile,bisSpalte,bisZeile)
 'Wenn die Var. "Prozart" anlegen ist die Var. AnzDat um den Wert "1" erhöhen
 If Prozart = "anlegen" then  anzDat= AnzDat+1
End Function

Gruss Dirk

Re: "Crash-Kurs BASIC und Dialoge"?

von pcdirk91 » Mo, 17.02.2020 00:20

Hi Marcel,

Fein das Du dich meldest. Habe dir gerade ne Mail geschickt um einiges Dir zu erklären. Ich hoffe das ist ok-für Dich

kann leider noch nicht auff alle Deine Punkte eingehen. Aber ich wollte mich wenigstens bei dir melden.
Programmcode sollte grundlegend nicht über einen Bildschirm (1000/1200 Pixel) hinaus geschrieben werden, da er während des Scrollens lesbar sein muss und z.B. auch nicht wenige Entwickler nur einen kleinen Monitor (z.B. mittels Note-/Netbook) benutzen.
Das mit den Kommentaren ist mir schon bewußte gewesen dachte nur wenn ich erst kommentiere und dann die Code Zeile darunter setze wird es zu unübersichtlich.
Das mit den 1000/1200 Pixel leuchte mir ein verstehe ich aber nicht. Kannst du mir mal ein Beispiel Senden?? SO 2-4 Zeilen mit max Breite . Dann abrebeite ich das um
Warum sind in jedem Modul identische Variablen (oOk, oAb, oTAn...) deklariert? Einmal global reicht nicht aus?

Bezeichner können praktisch 255 Zeichen enthalten und dies sollte man auch unbedingt ausnutzen. Den Kontext zu kurzen Bezeichnungen wie z.B. oTAn hast Du in einem halben Jahr nach Abschluss deiner App sicherlich vergessen.
Als Wir uns kennengelernt haben hast du mir mal geschrieben, das die Deklariung der Variablen zu umfangreich ist. (so hatte ich das zumindestens verstanden). Und hier im Forum habe ich in einigen Threads geleden frei zitiert um Gottes willen keine(zuviele) Globale Variable. Das ist der Grund warum ich das mit (oOK,oAB,OTAn....) so geachst habe . Aber wenn das so nicht richtig oder umständlich ist sollte ich das vielleicht wieder andern. Das mit dem Bezeichner der Var. und seinen möglichen 255 Zeichen ist klar nur dachte ich in der Kürze liegt die Würze , und ich wollte ja am Ende sowieso eine Beschreibund des ganzen Codes erstellen.
Function F_KeyListener_Load(anzTab as Integer)
...
Zu dieser Funktion muss ich gestehen habe ich gegoogelt. Du weisst das ich am Anfang nicht den Key listener benutzt habe sondern das Mit dem Event-Ergenis versucht hatt aber damit in eine Sackgasse kam. Im Forum habe ich dann eine Lösung gefunden und Sie für mich abgeändert.
Die letzte Version die Ich hier eingestellt hbe hatte noch Fehler drinnen. Die Version die ich momentan in der Mangel habe (Aufbau des Menüs in mehrseitige Dialoge) habe ich einiges anders gemacht und auch schon etliches getetstet. Bin aber noch nicht ganz fertig damit. MUss erst mal schauen wie es dort ist. Ich dachte es müssen alle Controls (AnzTab) benutzt werden um den Key-Listener laden zu können. SOrry mein Fehler
Function F_AnzDatensatz(...)
oCell = oBlatt.getCellRangeByName("B4:B1048576")
...

Dies wird einen Laufzeitfehler bei niedrigeren OO-Versionen verursachen, da vor nicht allzu langer Zeit noch mit 16 Bit, also nur 65k Zeilen gearbeitet wurde und der Zellenindex somit nicht existiert. Eine effektive Lösung für Zellabfragen mit Unbekannten hatten wir doch aber eigentlich auch hier schon mal diskutiert?
Ich weiss das wir dort darüber gesprochen haben. Ich wollte halt in der Spalte B den letzten Eintrag herausfinden . Das war die Function ZähleWenn() im Tabellenblatt. Da Balu im o.g. Thread aber meinte die Zugriffe auf meine Tabellen und das anschliessende berechen und dann der neue Zugriff dauert zu viel Zeit Habe ich ja in allen Tabellen alle Berechnung heraus genommen und auch die Tabelle anders aufgebaut. An die 16 bit-Variante habe ich da garnicht gedacht mein Fehler. Ich werde das mir nochmal ansehen und die von mikeleb vorgeschlagene Lösung mir genauer ansehen.
Warum benutzt Du für die Sichtbarkeit von Objekten eigentlich die Eigenschaft .Model.enableVisible und nicht einfach .visible?
.enableVisible setzt nicht die Sichtbarkeit, sondern die Option, Änderungen an ihr vornehmen zu können.

Code: Alles auswählen

oOk.Label = "Material ä"& chr(126) & "ndern"
Zu diesem Punktes ist folgendes zu sagen. Ich habe es mit . visible versucht aber eine Fehlermeldung bekommen. mit .enableVisible hat es geklappt und da dachte ich es ist so richtig. "Du weisst doch Denken sollte Mann den Pferden überlassen. DIe haben den grösseren Kopf". Ich schaue mir das nochmal an.
Was bedeutet diese Zeile bzw. was ist ihr Zweck?

Code: Alles auswählen

Dim Titel As String : Titel = A_Dlg(0)
odlg_Dialog.model.Title = Titel
Du hast recht mit deiner Aussage -ich hatte dich neulich aber so verstanden das du gemeint hast das Array wird am Anfang definiert und dann irgendwo benutzt und das es besser sei dann einen eindeutigen Namen zu haben. WIeder flasch gedacht :mrgreen: Mist grummel Grummel
Aber ich denke das war das was Du oben mit dem Kommentaren gemeint hast.
!!! Wenn diese Prozedur aufgerufen wird Kommt in Modul Datensatz Zeile 205 eine Fehlermeldung !!!
' F_DatensatzFarbe
Haste recht habe ich übersehen . wird geändert.
'* DAS 2.GRID IST FÜR DEN MATERIAL-BEREICH NICHT NÖTIG ALLERDINGS VIELLEICHT FÜR ANDERE BEREICHE
'* DIE GRÖ?E DES DIALOGES DIALOG_AUSWAHLDATENSATZ ÄNDERT DANN SEINE HÖHE
Das war keine Frage dazu sondern nur ein Hinweis. Aber in dem Mouse-Listener habe ich einen Fehler entdeckt bezüglich des 2. Grids. habe ich aber bereits geändert in der neuen Version. Das gabze ist für meine Begriffe ja jetzt so aufgebaut das die Diologe für alle Module verwendet werden können. und Im Material-Modul sind es nur 2 EIngabefelder. Im kommenden Benutzer-Modul aber ich glaube 25 felder und da brauche ich dann das 2. Grid in dem Dialog AuswahlDatensatz.

Zu guterletzt für Heute. Ich weiss nicht ob ich mit dem ganzen nicht zu überfordert bin. Ich werde aber dennoch versuchen weiter zu machen.

Marcel ich Danke Dir zunächst für Deine Kritik und Deine Geduld. Ich will versuchen mich zu bessern. Leider merke ich das die Konzentration weg ist und ich ins Bett sollte.
Nicht böse sein aber wenn ich darf melde ich mich wieder bei Dir

Ich wünsche Dir a guats Nächtle und lass Dich von mir nicht zu sehr ärgen (Ich hoffe Dein Ärger geht auch wieder vorbei)

Gruss Dirk

Re: "Crash-Kurs BASIC und Dialoge"?

von marcel_at_work » Do, 13.02.2020 22:48

Hallöchen Dirk,

willkommen zurück. Dann geht's Dir jetzt wieder besser?

Man hat vor zwei Wochen meinen Roller gestohlen und ich musste mich erst einmal um ein Motorrad und einen neuen Führerschein bemühen. :shock:
... werd' jetzt aber wieder öfter da sein.

Ich habe mir die Datei jetzt eine halbe Stunde betrachtet, aber breche an dieser Stelle erst einmal ab.

Da der Code nun schon etwas komplexer geworden ist, kommt man um eine gute Dokumentation (Kommentare) nicht mehr herum - diese finde ich aber leider nicht in deiner Datei!
Die Kommentare der einzelnen Zeilen stehen außerhalb meines 22 Zoll Monitors. Es ist unfassbar anstrengend, jede Codezeile zwischen zwei Ansichten hin- und herzuwechseln. Selbst mit einem 50 Zoll Monitor ist zuviel Platz zwischen Code und Kommentar, sodass man ein Lineal ansetzen muss, um einen Kommentar der richtigen Zeile zuordnen zu können.

Programmcode sollte grundlegend nicht über einen Bildschirm (1000/1200 Pixel) hinaus geschrieben werden, da er während des Scrollens lesbar sein muss und z.B. auch nicht wenige Entwickler nur einen kleinen Monitor (z.B. mittels Note-/Netbook) benutzen. Die Kommentare gehören in einer vollen Zeile nicht daneben, sondern darüber - so ist auch schon vor einer Codeanalyse die potenzielle Funktion bekannt.

Warum sind in jedem Modul identische Variablen (oOk, oAb, oTAn...) deklariert? Einmal global reicht nicht aus?

Bezeichner können praktisch 255 Zeichen enthalten und dies sollte man auch unbedingt ausnutzen. Den Kontext zu kurzen Bezeichnungen wie z.B. oTAn hast Du in einem halben Jahr nach Abschluss deiner App sicherlich vergessen. In der OOME, Tom's Büchern, und ganz besonders der OpenOffice.org-API-Referenz, ist ganz wunderbar beschrieben, wie man Variablen richtig benennen sollte.
sPrüfeEintragAusDatenbankEvent sagt z.B. mehr aus, als pPEaDE. Dies gilt für Variablen- sowie auch für Funktionsnamen.

Code: Alles auswählen

Function F_KeyListener_Load(anzTab as Integer)
	...
Der Funktion wird die Nummer eines Dialog-Tabs übergeben, aber in der enthaltenen Schleife dann damit der Index von Steuerelementen referenziert, um eine Liste von Beobachtern zu (de)aktivieren? Was soll diese Funktion denn genau machen? Hattest du anfangs nicht schon eine korrekte Funktion geschrieben, die sämtliche Listener des aktuellen Dialoges umschaltet?

Code: Alles auswählen

Function F_MouseListener_MousePressed(oEvent)
	...
Erstellung eines Datenarrays bei jedem MousePressed-Event?

Code: Alles auswählen

Function F_AnzDatensatz(...)
	oCell = oBlatt.getCellRangeByName("B4:B1048576")
	...
Dies wird einen Laufzeitfehler bei niedrigeren OO-Versionen verursachen, da vor nicht allzu langer Zeit noch mit 16 Bit, also nur 65k Zeilen gearbeitet wurde und der Zellenindex somit nicht existiert. Eine effektive Lösung für Zellabfragen mit Unbekannten hatten wir doch aber eigentlich auch hier schon mal diskutiert?

Warum benutzt Du für die Sichtbarkeit von Objekten eigentlich die Eigenschaft .Model.enableVisible und nicht einfach .visible?
.enableVisible setzt nicht die Sichtbarkeit, sondern die Option, Änderungen an ihr vornehmen zu können.

Code: Alles auswählen

oOk.Label  = "Material ä"& chr(126) & "ndern"
Was bedeutet diese Zeile bzw. was ist ihr Zweck?

Code: Alles auswählen

Dim Titel As String : Titel = A_Dlg(0)
odlg_Dialog.model.Title = Titel
Warum wird hier eine Variable für den Titel deklariert, wenn doch der Wert des Titels schon in dem Array-Element vorhanden ist?
Im gesamten Code finden sich hundert solche Variablen, die keinen weiteren Zweck besitzen, als die Lesbarkeit zu verschlechtern und dadurch den Überblick zu verlieren. Jede Variable im Code bedeutet gegebenfalls auch zusätzliche Prüfmethoden, um diese zu validieren - man sollte es deshalb nicht damit übertreiben.
' !!! Wenn diese Prozedur aufgerufen wird Kommt in Modul Datensatz Zeile 205 eine Fehlermeldung !!!
' F_DatensatzFarbe
Du hast in der ersten Zeile des Moduls 'Option Explicit' gesetzt, deshalb musst Du jede Variable deklarieren. Vor der Zeile 205 wurde die Variable i nicht deklariert, was aber eigentlich in der auftretenden Fehlermeldung beschrieben sein sollte!?
'* DAS 2.GRID IST FÜR DEN MATERIAL-BEREICH NICHT NÖTIG ALLERDINGS VIELLEICHT FÜR ANDERE BEREICHE
'* DIE GRÖ?E DES DIALOGES DIALOG_AUSWAHLDATENSATZ ÄNDERT DANN SEINE HÖHE
Was genau ist deine Frage?
Die Deklaration der Arrays ist mir bei der Typ-Zuweisung auch nicht klar (viel versucht, aber nicht dahintergekommen).
Allgemein sind viele Deklarationen in der Datei inkorrekt. Hast Du dies in der Dokumentation nicht nachgelesen?

Eigentlich hatte ich gehofft, daß Du verstärkt Funktionen mit Parametern benutzt (um Dir das Leben zu erleichtern), aber die aktuelle Datei besteht fast ausschließlich aus Routinen, die auf hundert globale Variablen zugreifen, bei denen nicht immer sofort erklärt werden kann, wo deren Wert gerade definiert wurde.

Ein einfacheres Beispiel aus der Routine 'Loeschen':

Code: Alles auswählen

F_AnzDatensatz 
bZe   = vZe + anzDat-1
In der Routine F_AnzDatensatz (die Du als Funktion deklariert hast) wird die globale Variable 'anzDat' definiert, um dann mit dieser extern weiterzurechnen. Diese Variable gehört als Rückgabewert in die Funktion F_AnzDatensatz.
Gibt es denn zum Thema Funktionen noch Unklarheiten? Bist Du Dir über den Ausdruck Rückgabewert bewusst?

Ich hoffe, dies war jetzt nicht schon zuviel des Guten, aber Du freust Dich ja stets über konstruktive Kritik. 8)
Vielleicht kannst du zumindest mal deine Kommentare ändern, Du hast damit doch bestimmt auch selbst so deine Probleme?

Noch zwei Bemerkungen zum Schluss:
Die Kommentare in deinem Code waren wirklich Fleißarbeit, aber bedenke bitte, daß ihr einziger Nutzen darin liegt, zu erklären, was im korrelierenden Code-Abschnitt genau passiert - dies fehlt teilweise gänzlich. Ein Kommentar, der besagt, daß eine Variable belegt wird, wäre unter Umständen völlig sinnfrei, da man dies auch an der Variablenzuweisung im Code schon sieht. Interessant für den Analysten wären aber z.B. der Wert/die Art, die Herkunft oder die weitere Verwendung des Variableninhalts.
Wenn Routinen auf unzählige extern definierte Variablen angewiesen sind, sinkt die Lesbarkeit des Codes, was die Fehlerquote zugleich erhöht.
Es wäre wirklich der bessere Weg, vermehrt Funktionen einzusetzen und diese vielen Redundanzen im Code zu vermeiden.


Wie lang hast Du damals eigentlich mit MS Office gearbeitet und was damit gemacht?

Bin dann erst mal wieder weg.

Liebe Grüße,

Marcel

Re: "Crash-Kurs BASIC und Dialoge"?

von pcdirk91 » Do, 30.01.2020 21:25

Hi Marcel. Hi Balu , Hi Leute,
sorry das ich mich jetzt erst melde. Ich hatte Probleme mit der Gesundheit und in Sachen Hexaeder "Mann Sieht den Wald vor lauter Bäumen nicht"-Effekt.
Aber nun zum einzelnen:
1. Option Explicit überall eingebaut
2. Die gesamte Datei neu aufgebaut( villeicht ist damit das Problem mit "abgesicherter Modus " bei Marcel behoben.
3. Soweit ich sehe die Fertigstellung (mit einer kleinen Ausnahme) des Mat Moduls
4. In den Tabellenblättern wird nun nichts mehr berechnet(Hoffe ich habe da Balu's Rat angenommen)
5. Hausaufgaben von Marcel ( Viel gelesen und auch einiges verstanden aber nicht alles) DIe Variablen Deklaration ist mir noch teilweise unklar
6. Bin jetzt mal dabei das Dialog-Menü (das derzeit nicht dabei ist) in mehrseitige DIaloge zu ändern(War ne Anregung von Marcel und Balu)

Der Einfachhalthalber setze ich die gesamte Datei in den Beitrag
Wenn Irgenwo Probleme auftreten habe ich Sie auskommentiert)

Was ich nicht verstehe ist die Prozedur (Funktion) F_DatensatzFarbe . Wieso läuft die im Anlegen und ändern richtig ab ohne Fehler aber Beim Löschen kommt in Blatt Zeile 7 ("B8") zu einem Ausnahme Fehler . Hat das mit dem zellbereich löschen zu tun???? Habe ich aber auch auskommentiert
Ich weis ist jetzt viel Arbeit für Euch (und vielleicht auch zu öde aber ich...... hoffe mal

Die Deklaration der Arrays ist mir bei der Typ-Zuweisung auch nicht klar (viel versucht aber nicht dahintergekommen .
So ich hoffe ich verlange nicht zu viel von Euch und bin gespannt auf Eure Reaktionen

Gruss Dirk
Ps. @Marcel Dein Vorschlag wegen der Datenbank - hört sich gut an aber jetzt erstmal das hier in die Bahnen bringen
Dateianhänge
Grundaufbau für Hexaeder.ods
(41.94 KiB) 201-mal heruntergeladen

Re: Eingabefelder in Dialog

von marcel_at_work » Fr, 27.12.2019 18:40

Hallöchen Dirk, 8)
Das werde ich auch ändern. Ist sicher ein gutes Argument Deinerseits. ich hatte mir das so gedacht "o1..." für Object "i1...." für Integer "s1...." für String usw aber Dein Vorschlag ist besser
NICHT so voreilig, bitte... ich glaube, dies ist anders angekommen, als gedacht.
Variablenbezeichnungen werden auch bei mir mit Kennungen für den jeweiligen Typ erstellt. Das macht Entwicklung, Fehlersuche und Dokumentation sehr viel einfacher.
Direkte Typ-Deklarationen von Variablen sollten aus einem Grund gemacht werden:

Code: Alles auswählen

Dim a As Integer

a = 1
a = "Peter"
a = thisComponent
Zuweisung 2 + 3 würden bei Laufzeitberechnungen einen Fehler ergeben, der auch direkt bei der jeweiligen Wert-Zuweisung von der IDE so ausgegeben wird.

Wird aber auf die Typ-Zuweisung As Integer bei der Deklaration verzichtet, kann es vorkommen, daß z.B. ein Fehler aufgrund der Addition von zwei unterschiedlichen Typen (z.B. String + Integer) gar nicht oder an einer anderen Stelle angezeigt wird. Die Fehlersuche ist folglich eine Katastrophe.

Jede Deklaration von Variablen, Funktionen (wenn benötigt), etc. sollte somit der Syntax folgen: Bezeichner As Typ

Und diesem Punkt folgt schließlich auch direkt die nächste Frage...
Tja die "Option Explicit" . Da hatte ich am Anfang schwierigkeiten (Sprich habe den SInn zwar verstanden aber nicht die Geduld das umzusetzen) . DIes wird wohl viel Arbeit für mich sein aber wird gemacht .Punkt aus Mickey Maus.
Die spätere Fehlersuche nimmt potenziell mehr Zeit in Anspruch...
Starte dein Programm und teste alle Funktionen einmal. Sobald der Fehler erscheint "Variable... nicht deklariert/definiert", die benannte Variable im Code suchen und davor, an einer sinnvollen und geeigneten Stelle, zusammen mit dem erwarteten Typ deklarieren.
Ist est jetz sInnvoller jedes EingabeFeld als Globale Variablee zu deklarieren, oder aus der "odlg_DIalog" abzuleiten ??.
Der Grund für die Frage ist der: ich brauche ja mindestens 7 (ich nenne das erfassungs-Dialoge) und jeder hat mehere Eingabefelder .ergo gibt es natürlich auch entsprechend viele Variablen.
Vielleicht kannst du mir da mal einen Klapp auf den Hinterkopf geben.
Ich persönlich arbeite z.B. stets mit einem mehrseitigen Dialog und erstelle pro Dialog-TAB stets ein eigenes Modul mit Initialisierungs-Routine, die sämtliche Objektzuweisungen beinhaltet. Diese Objekte werden als public deklariert und sind somit nur aus dem jeweiligen Modul erreichbar.

Wie genau du dies umsetzen magst, hängt u.a. davon ab,...
- wie oft du diese Objekte benötigst,
- wie viel du in der IDE tippen möchtest und
- von wo du darauf zugreifen musst.
Und ganz zum Schluß aus Deiner SIcht sicherlich eine blöde Frage aber mir im Moment der klare Gedanke.
was ist besser ??
In den vorherigen Antworten habe ich dir aufgezeigt, welche Überlegungen für die Variablendeklaration überhaupt entscheidend sind.
Ich habe leider keine Ahnung, wie sich dein Code weiterentwickeln wird - entscheide deshalb selbst. Du schaffst das! 8)

Einen wundervollen Abend noch,

Marcel

Ps.: Vielleicht ändern wir den Titel des Threads mal in "Crash-Kurs BASIC und Dialoge"? :lol:

Re: Eingabefelder in Dialog

von pcdirk91 » Mi, 25.12.2019 13:11

Hi Marcel,
Erstmal Danke, für Deine Wünsche Ich wünsche Dir auch schöne Feiertage und einen sehr guten Start ins Neue Jahr. Bin derzeit bei meiner Mutter, Naja Weihnachten ist halt das Fest der Familie.
Aber der Reihe Nach:
Es enttäuscht mich gerade zutiefst, daß gerade ein Schreinermeister mit gebundenen, bedruckten Blättern aus verdichteten Holzfasern gar nichts anfangen an?!
Wieso entäuscht dich das?? Siehe es malk so: Das holz was in die Gebundene (Papierindustrie) geht steht dem Schreiner nicht zur verfügung *grins. Und dem Holzwurm sin nunmal Platten und Furnier und die daraus resultierenden schöööööööööönen Mööbel wichtiger als oll Bücher (die eh niemand liest) *gröhl. Nein Ich gebe DIr ja recht, aber ich Stand wie bei sovielen Sachen etwas auf der Leitung. Ich konnte es mir einfach nicht so vorstellen.

WIe üblich muss ich mich fürs Kopf waschen bedanken :lol: . Aber du hast *leider wieder einmal Recht. Ich werde versuchen Deine Anregungen über die Feitertage zu verinnerlichen und zu ändern.
# Tipp) Du erstellst hier für jeden Text eine eigene Variable, nur um diese dann in ein Array zu laden?!
Erstelle doch gleich zwei Arrays mit allen Texten - dann ersparst du dir auf einmal 26 Variablen? Ist nur eine Möglichkeit...
Warum ich es so gemacht habe?? Keine Ahnung . Ich nenne es mal so "BetriebsBlindheit" . erst dachte ich es wäre übersichtlicher, aber jetzt naja sagen wir mal blödsinnig. WIrd sofort umgesetzt.
# Tipp) In Funktionsköpfen bedienst du dich keiner Variablendeklaration...
# Tipp) In deinem Code werden immer noch viel zu viele Variablen erstellt, die unnötig sind und zu Verwirrung führen (können)...
Das werde ich auch ändern. Ist sicher ein gutes Argument Deinerseits. ich hatte mir das so gedacht "o1..." für Object "i1...." für Integer "s1...." für String usw aber Dein Vorschlag ist besser

Tja die "Option Explicit" . Da hatte ich am Anfang schwierigkeiten (Sprich habe den SInn zwar verstanden aber nicht die Geduld das umzusetzen) . DIes wird wohl viel Arbeit für mich sein aber wird gemacht .Punkt aus Mickey Maus.
Hier wird eine Variable (TbHin) für einen String erstellt, welcher ausschliesslich und einmalig für die Objektzuweisung (oTbHin) dient. Es existiert somit eine Variable, die niemals mehr irgendjemand benötigt.
Die direkte Referenzierung: oTbHin = oDoc.Sheets.getByName("Einstellungen") genügt vollkommen und man muss zudem nicht erst noch nach dem Wert von TbHin recherchieren.
Das kommt noch von meinen Anfängen. Wurde jetzt immer übernommen aber heute sehe ich keinen Sinn mehr darin. Wird also geändert.
Beim Anlegen eines neuen Benutzerdatensatzes muss der Benutzer in jedem der 13 Felder mindestens ein Leerzeichen setzen? Warum nicht einfach NICHTS, wie man das sonst so gewohnt ist?
Was mich da geritten hat weis ich heute auch nicht mehr. Falscher Denkansatz. Ich wollte einfach mindestems eine Eingabe erzwingen. Aber ist wie Dur richtig bemämgelt hast Unsinnig. Wird ebenfalls geämdert.

zuguterletzt leider noch eine Nachfrage zu:
Hier wird z.B. ein Objekt referenziert, welches sich während der gesamten Laufzeit des Programms nicht mehr verändern wird - wobei dies jedesmal geschieht, wenn man im Dialog eine Taste betätigt. Zumal eine Objektzuweisung ja schon geschehen sollte, wenn der zugehörige Dialog geladen wird (analog zu deinen Listenern).
Mittlerweile rufe ich ja aus meheren Modulen die Initalisierung der Dialoge heraus auf ,also aus dem , Modul "Benutzer" das Modul DIalog mit deer Proz "DialogAnAeLoe" oder aus dem Modul "Material" das Modul DIalog mit der Proz "DialogAnAeLoe" wobei der Benutzer ein anderen DIalog hat als das Material. es existiert num eine Globale Variable "odlg_DIalog" die die Eingabe felder sind ja unterschieldich.
Ist est jetz sInnvoller jedes EingabeFeld als Globale Variablee zu deklarieren, oder aus der "odlg_DIalog" abzuleiten ??.
Der Grund für die Frage ist der: ich brauche ja mindestens 7 (ich nenne das erfassungs-Dialoge) und jeder hat mehere Eingabefelder .ergo gibt es natürlich auch entsprechend viele Variablen.
Vielleicht kannst du mir da mal einen Klapp auf den Hinterkopf geben .
Und ganz zum Schluß aus Deiner SIcht sicherlich eine blöde Frage aber mir im Moment der klare Gedanke.
was ist besser ??

Code: Alles auswählen

 Sub P_MatAnlegen
 Dim oMatBez as Object  : oMatBez = oTbEin.getCellByPosition( 4,11)		
'....

oMatBez.String = oDlg_Dialog.getControl("MatBez").Text

oder :

Code: Alles auswählen

 Sub P_MatAnlegen
'....
oTbEin.getCellByPosition( 4,11) =oDlg_Dialog.getControl("MatBez").Text
1. Beispiel bedeutet ja eine Variable Mehr oder??

Sorry für diie Anfänger-Fragen aber ich versuche es ja zu lernen * Und Holzwurm hat bekanntlich ein kleineres Gehirn *lach

So nun aber Schluss mit Fragerei. Ich wümsche Dir viel <Erfolg bei Deinem Project und geniesse Weihnachten.
Verziehe mich an meine Rechner und fange an zu ämderm

Gruss Dirk

Re: Eingabefelder in Dialog

von marcel_at_work » Mo, 23.12.2019 22:27

Hallöchen Dirk,
Ganz am Anfang unseres Kontaktes habe ich dich so verstanden, dass ich die Deklaration der Variablen im Modulkopf zu ausführlich gemacht habe.
Dies trifft nicht ganz zu. Dein Programmcode war anfangs äußerst unübersichtlich, weshalb ähnliche bzw. identische Routinen mehrfach vorkamen und unnötige Variablen deklariert werden mussten.
Ist die ANzahl dieser Variablen wichtig (* jeder var bedutet doch Speicherplatz) Vin früher her war das immer ein Arbeitsspeicherproblem (*Aussage meines Onkels der Programmierer war).
1) Anders, als vielleicht dein Onkel, solltest du heute keine Speicherprobleme mehr haben.
Eine Integer-Variable verbraucht z.B., je nach System, 2 - 4 Byte und gute RAMs haben heute 16 - 32 GB (macht mind. 4 Mio. Variablen im RAM, exkl. SSD), da ist also viel Platz nach oben... :lol:

2) Das KeyEvent o.ä. wird bei jedem Tastendruck erneut aufgerufen. Wenn dann im Event-Handler zig Variablen deklariert sind, die zwar ihren Wert nie ändern, aber stets wieder geladen werden müssen, verliert man dadurch wertvolle Prozess-Zeit. Die Bereitstellung eines neuen Speicherplatzes nimmt mehr Zeit in Anspruch als nur der einfache Zugriff per Pointer auf eine Speichereinheit. Dies kann man z.B. durch eine Initialisierungs-Routine ändern, die nur bei Start des Programms durchlaufen werden muss.
Desweiteren gäbe es auch die Möglichkeit mit globalen Konstanten (also Werte, die vom gesamten Programm immer wieder genutzt und direkt im ersten Modulkopf definiert werden). Dies ist z.B. sehr gut in der OpenOffice-Bibliothek Access2Base zu sehen, welche mit Open-/LibreOffice ausgeliefert wird.

3) Eine grundsätzliche Überlegung sollte im Idealfall stets in einem Verstehen darüber enden, wann, wo und wie der Zugriff auf einen Wert in einer Variable am effektivsten vollzogen werden kann.
Ich werde wohl diese Bariablen FText01....Ftext15 usw als Globale Variablen definieren (*Mein derzeituger Gedanke) .
Genau das meinte ich - super. 8)

Code: Alles auswählen

Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")	
Hier wird z.B. ein Objekt referenziert, welches sich während der gesamten Laufzeit des Programms nicht mehr verändern wird - wobei dies jedesmal geschieht, wenn man im Dialog eine Taste betätigt. Zumal eine Objektzuweisung ja schon geschehen sollte, wenn der zugehörige Dialog geladen wird (analog zu deinen Listenern).

# Tipp) Schreibe in jedes Modul als erste Zeile:

Code: Alles auswählen

Option Explicit
... und dann teste dein Programm noch einmal. Wahrscheinlich wirst du noch einige Variablen deklarieren müssen. Dieses Verfahren schützt dich vor unnötiger Fehlersuche zwecks fehlender Variablendeklarationen. Schau dir dazu auch noch einmal OOME an.

# Tipp) Du erstellst hier für jeden Text eine eigene Variable, nur um diese dann in ein Array zu laden?!

Code: Alles auswählen

 HText01 = "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."
 HText02 = "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & "."
 HText03 = "Geben Sie den Nachnamen ein, und bestätigen Sie mit " & HText & "."
...
 Hilfe  = Array(Htext00,Htext01,Htext02,Htext03,Htext04,Htext05,Htext06,Htext07,_
				Htext08,Htext09,Htext10,Htext11,Htext12,Htext13)	
Erstelle doch gleich zwei Arrays mit allen Texten - dann ersparst du dir auf einmal 26 Variablen? Ist nur eine Möglichkeit...

Code: Alles auswählen

Array("Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & ".",_
      "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & ".")
... oder....

Code: Alles auswählen

Array(1, "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & ".",_
      2, "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & ".")
# Tipp) In Funktionsköpfen bedienst du dich keiner Variablendeklaration...

Code: Alles auswählen

Public Function SetF_VarErstellen(o1)	
Um einer Fehlersuche aufgrund falsch zugewiesener Variablen zu entgehen, stets den Typ der zu erwartenden Variable angeben...

Code: Alles auswählen

Public Function SetF_VarErstellen(o1 As Object)	
# Tipp) In deinem Code werden immer noch viel zu viele Variablen erstellt, die unnötig sind und zu Verwirrung führen (können)...

Code: Alles auswählen

 Dim oTbHin as Object
 Dim TbHin  as String : TbHin  = "Hintergrund"
 oTbHin  = oDoc.Sheets.getByName(TbHin)	
Hier wird eine Variable (TbHin) für einen String erstellt, welcher ausschliesslich und einmalig für die Objektzuweisung (oTbHin) dient. Es existiert somit eine Variable, die niemals mehr irgendjemand benötigt.
Die direkte Referenzierung: oTbHin = oDoc.Sheets.getByName("Einstellungen") genügt vollkommen und man muss zudem nicht erst noch nach dem Wert von TbHin recherchieren.

Bemerkung: "Variablen dienen zur Zwischenspeicherung von Werten, die zur Laufzeit wiederverwendet werden."

Du könntest, ohne Weiteres, auf 40 - 50 Variablen in deinem letzten Code verzichten, weshalb durch die nicht mehr benötigten Definitionen etwa die Hälfte deines Codes gelöscht werden könnte.

> Nur aus Neugier...

Code: Alles auswählen

"Geben Sie die Telefax-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."
Beim Anlegen eines neuen Benutzerdatensatzes muss der Benutzer in jedem der 13 Felder mindestens ein Leerzeichen setzen? Warum nicht einfach NICHTS, wie man das sonst so gewohnt ist?
Jetzt aber zu Deiner , wie sagtest Du , "spontaner Idee ... zu dugitalisieren????? Ähm ich dachte Bibliotheken werden am Rechner entwickelt und Rechner = Digital??? oder schreibst du das erst auf Papier???
Es enttäuscht mich gerade zutiefst, daß gerade ein Schreinermeister mit gebundenen, bedruckten Blättern aus verdichteten Holzfasern gar nichts anfangen an?! :lol:
Ich meinte natürlich eine analoge Bibliothek - aus Büchern. 8)

Falls man sich nicht mehr liest, ein besinnliches Fest und einen grandiosen Start im neuen Jahr!

Viele Grüße,

Marcel

Re: Eingabefelder in Dialog

von pcdirk91 » So, 15.12.2019 15:46

Hi Marcek,
habe jetzt erst gesehen das du geschrieben hast. Das mit dem Profi sehe ich bei weiten noch nicht. oder wolltest Du mich auf den Arm nehmen???
Na ich versuche halt zu lernen :)
Bin jetzt etwas verwirrt. Ganz am Anfang unseres Kontaktes habe ich dich so verstanden, dass ich die Deklaration der Variablen im Modulkopf zu ausführlich gemacht habe. Es waren mal 41 Variablen. Derzeit sind es nur noch 15. Dadurch sind im Bereich:

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)									' Die Object Var. "oOk"  mit dem CommandButton1 belegen
 Dim oOk1   as Object  : oOk1   = odlg_Dialog.getControl("CommandButton1")								' Die Object Var. "oOk1"  mit dem CommandButton1 belegen
 Dim oAb    as Object  : oAb    = odlg_Dialog.model.controlModels(1)									' Die Object Var. "oAb"  mit dem CommandButton1 belegen
 Dim Bez    as Object  : Bez    = odlg_Dialog.getControl("MatBez")										' Die Object Var. "Bez"  mit dem EingabeFeld "MatBez" belegen
 Dim St     as Object  : St     = odlg_Dialog.getControl("MatSt")										' Die Object Var. "St"   mit dem EingabeFeld "MatSt"  belegen
 Dim Nr     as Object  : Nr     = odlg_Dialog.getControl("MatNr")										' Die Object Var. "Nr"   mit dem Eingabefeld "MatNr"  belegen
 Dim F1     as Object  : F1     = odlg_Dialog.getControl("oTextFehler")									' Die Object Var. "F1"   mit dem Labelfeld "oTextFehler"  belegen
 Dim A1     as Object  : A1     = odlg_Dialog.getControl("oTextAnweisg")								' Die Object Var. "A1"   mit dem Labelfeld "oTextAnweisg" belegen
 Dim TSt    as Object  : TSt    = odlg_Dialog.getControl("oTextSt")										' Die Object-Var. "oTextSt"       mit dem Labeldfeld "oTextSt"       belegen
 Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")								' Die Object-Var. "oTextEinheit"  mit dem Labeldfeld "oTextEinheit"  belegen
 Dim TNr    as Object  : TNr    = odlg_Dialog.getControl("oTextNr")										' Die Object-Var. "oTextNr"       mit dem Labeldfeld "oTextNr"       belegen
 Dim oDatNr as Object  : oDatNr = oTbEin.getCellByPosition( 3,5)  										' Die Adresse der Object Var. "DatNr" mit Zelle "Einstellungen!K6" belegen
 Dim Feld   as String  : Feld   = oEvt.source.Model.Name												' Die Object Var. "Feld"   mit dem Object "oEvt.Source.Name" belegen					
 Dim GM     as String  : GM     = oTbEin.getCellByPosition( 4,24).String								' Die String Var. "Gmenu" mit der Prozedur die gestartet wurde belegen
 Dim anzMat as Integer : anzMat = oTbEin.getCellByPosition(12,24).Value -1								' Die Integer Var. "anzMat" mit der Ssumme aller angelegten Materialien minus dem Wert "1" belegen
 Dim ZNrID  as Integer : ZNrID  = oTbEin.getCellByPosition(13,24).Value									' Die Integer Var. "ZNrID"  mit dem Wert der 1. blegten Zeilennummer asl Index belegen
 Dim LfdNr1 as Integer : LfdNr1 = oTbEin.getCellByPosition(12,24).Value+1								' Die Integer Var. "LfdNr1" mit dem Wert (aller angelegten Materialien + dem Wert "1") belegen
 Dim LfdNr2 as Integer : LfdNr2 = oTbEin.getCellByPosition(11,24).Value									' Die Integer Var. "LfdNr1" mit dem Wert (Nr des ausgewählten Material-Datensatzes) belegen
so viele Definiert. Auf dIe Idee mit den globalen Variablen in der "Start" _Prozedur als Glpbal umzusetzen bin ich nicht gekommen. (Werde ich aber umsetzen). Stand derzeit:

Ich muss ja mehere Module entwickeln (zb. Material. Platten,Hexaeder usw) Durch Deine Mithilfe habe ich die Functionen nun in ein Modul gepackt und dabei ist mir aufgefallen, ich könnte ja aus jedem MOdul auf die Finctionen zugreifen (*bitte lach nicht. Ich weiss das ist Sinn von Functionen).Aber ich wusste nicht wie ichdas realisieren soll Ich habe auch das Blatt Einstellungen vollkommen umgemodelt. und bin jetzt am Testen ob meine Idee Funzt. Was mich jetzt wieder zu den Globalen Variablen bringt. Ist die ANzahl dieser Variablen wichtig (* jeder var bedutet doch Speicherplatz) Vin früher her war das immer ein Arbeitsspeicherproblem (*Aussage meines Onkels der Programmierer war).

Ich werde Dir mal den Code senden. Ist vielleicht einfacher

Code: Alles auswählen

'*******************************
'* Prozedur  zum Anlegen eines *
'*          Benutzers          *
'*******************************
 Sub P_BenAnlegen																									' Prozedur zum Anlegen eines neuen Benutzers
 Dim oTbHin as Object,oTbEin as Object,oTbBen as Object																' Die Object Var. "oTbHin", "oTbEin" und "oTbBen" deklarieren
 Dim Pos_x as Long,Pos_y as Long,BildBr as Long,BildHo as Long														' Die Long Var. "Pos_x", "Pos_y", "BildBr" und "BildHo" deklarieren
 Dim AnzFeld as Integer, AnzEing as Integer																			' Die Integer Var. "AnzFeld" und "AnzEing" deklarieren
 Dim Htext00 as Integer, Ftext00 as Integer																			' Die Integer Var. "HText00" und "FText00" deklarieren
 Dim DlgName as String,GM as String,DlgTit as String,Button1 as String												' Die String Var. "DlgName", "GM", "DlgTit" und "Button1" deklarieren
 Dim Button2 as String,TAweisg as String																			' Die String  Var. "Button2" und "TAweisg" deklarieren
 Dim HText as String,HText01 as String,HText02 as String,HText03 as String,HText04 as String						' Die String Var. "HText", "HText01", "HText02", "HText03" und "HText04" deklarieren
 Dim HText05 as String,HText06 as String,HText07 as String,HText08 as String,HText09 as String						' Die String Var. "HText05", "HText06", "HText07", "HText08" und "HText09" deklarieren
 Dim HText10 as String,HText11 as String,HText12 as String,HText13 as String,HText14 as String,HText15 as String	' Die String Var. "HText10", "HText11", "HText12", "HText13", "HText14" und "HText15" deklarieren
 Dim FText as String,FText01 as String,FText02 as String,FText03 as String,FText04 as String						' Die String Var. "FText", "FText01", "FText02", "FText03" und "FText04" deklarieren
 Dim FText05 as String,FText06 as String,FText07 as String,FText08 as String,FText09 as String						' Die String Var. "FText05", "FText06", "FText07", "FText08" und "FText09" deklarieren
 Dim FText10 as String,FText11 as String,FText12 as String,FText13 as String,FText14 as String,FText15 as String	' Die String Var. "FText10", "FText11", "FText12", "FText13", "FText14" und "FText15" deklarieren
 Dim TbHin  as String : TbHin  = "Hintergrund" 																		' Die String Var. "TbHin"  mit "Hintergrund"   belegen
 Dim TbEin  as String : TbEin  = "Einstellungen"																	' Die String Var. "TbEin"  mit "Einstellungen" belegen
 Dim TbBen  as String : TbBen  = "Benutzer"																			' Die String Var. "TbBen"  mit "Benutzer"      belegen

 'Das Blatt "Hintergrund" aktivieren
' oView.setActiveSheet(oDoc.Sheets.getByName(TbHin))																' Das Blatt Hintergrund aktivieren

 'Die benötigten Blätter für das Modul "Benutzer"
 oTbHin  = oDoc.Sheets.getByName(TbHin)																				' Die Object Var. "oTbHin"  mit dem Blatt "Hintergrund"   verknüpfen
 oTbEin  = oDoc.Sheets.getByName(TbEin)																				' Die Object Var. "oTbEin"  mit dem Blatt "Einstellungen" verknüpfen
 oTbBen  = oDoc.Sheets.getByName(TbBen)																				' Die Object Var. "oTbBen"  mit dem Blatt "Benutzer"      verknüpfen

 'Die Definition des benötigten Dialoges Start in Blatt "Einstellungen.$D25"
 Pos_x   = StarDesktop.getCurrentFrame().getContainerWindow().PosSize.x												' Die x-Position der Anwendung ermitteln
 Pos_y   = StarDesktop.getCurrentFrame().getContainerWindow().PosSize.y												' Die y-Position der Anwendung ermitteln
 BildBr  = StarDesktop.getCurrentFrame().getContainerWindow().Size.Width											' Die Bildbreite der Anwendung ermitteln
 BildHo  = StarDesktop.getCurrentFrame().getContainerWindow().Size.Height											' Die BildHoehe  der Anwendung ermitteln
 DSpalte =  3																										' Die Var. "DSpalte" mit dem Spalten-Index "3" belegen (die erste Spalte hat den Buchstaben "D")
 DZeile  = 24																										' Die Var. "DZeile"  mit dem Zeilen-Index "24" belegen (die erste Zeile hat die Ziffer "25")
 DlgName = "BenutzerAnAeLoe"																						' Die String Var. "DlgName" mit dem Namen des benötigten Dialoges belegen
 GM      = "Anlegen"																								' Die String Var. "Gm" mit dem Eigenschaft der gewählten Prozedur belegen
 DlgTit  = "Benutzer anlegen"																						' Die String Var. "DlgTit" mit dem Titel des gewählten DIaloges belegen
 Button1 = "Benutzer "& chr(126) & "anlegen"																		' Die String Var. "Button1" mit entsprechenden Beschriftung belegen
 Button2 = "A"& chr(126) & "bbrechen"																				' Die String Var. "Button2" mit entsprechenden Beschriftung belegen
 TAweisg = "Nehmen Sie die notwendigen Eingaben vor !!!"															' Die String Var. "TAnweisg" mit dem Text der Anweisung belegen
 AnzFeld = 16																										' Die Integer Var. "AnzFeld" mit der Anzahl der Felder des gwählten Dialoges belegen
 AnzEing = 13																										' Die Integer Var. "AnzEing" mit der Anzahl der EingabeFelder des gwählten Dialoges belegen

 ' Die Definition der Hilfstexte Start in Blatt "Einstellungen.$E39"
 HSpalte =  4																										' Die Var. "HSpalte" mit dem Spalten-Index "4" belegen (die erste Spalte hat den Buchstaben "E")
 HZeile  = 38																										' Die Var. "HZeile"  mit dem Zeilen-Index "38" belegen (die erste Zeile hat die Ziffer "39")
 HText   = chr(8222) & "ENTER" & chr(8220)     																		' Die String Var. "HText" aus den Zeichen "ENTER" bilden
 HText00 = 13																										' Die Anzahl der def. Hilfetexte  ins Blatt "Einstellungen" Zelle "E39" eintragen
 HText01 = "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext01 für das Feld "BenFir" ins Blatt "Einstellungen" Zelle "F39" eintragen 
 HText02 = "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & "."										' Den Hilfetext02 für das Feld "BenVor" ins Blatt "Einstellungen" Zelle "G39" eintragen
 HText03 = "Geben Sie den Nachnamen ein, und bestätigen Sie mit " & HText & "."										' Den Hilfetext03 für das Feld "BenNam" ins Blatt "Einstellungen" Zelle "H39" eintragen 
 HText04 = "Geben Sie die Strasse, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext04 für das Feld "BenStr" ins Blatt "Einstellungen" Zelle "I39" eintragen 
 HText05 = "Geben Sie die Plz, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext05 für das Feld "BenPlz" ins Blatt "Einstellungen" Zelle "J39" eintragen  
 HText06 = "Geben Sie den Ort, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext06 für das Feld "BenOrt" ins Blatt "Einstellungen" Zelle "K39" eintragen 
 HText07 = "Geben Sie das Land, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext07 für das Feld "BenLan" ins Blatt "Einstellungen" Zelle "L39" eintragen 
 HText08 = "Geben Sie einen Titel, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext08 für das Feld "BenTit" ins Blatt "Einstellungen" Zelle "M39" eintragen 
 HText09 = "Geben Sie eine Position, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext09 für das Feld "BenPos" ins Blatt "Einstellungen" Zelle "N39" eintragen 
 HText10 = "Geben Sie die Telefon-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext10 für das Feld "BenPrv" ins Blatt "Einstellungen" Zelle "O39" eintragen 
 HText11 = "Geben Sie die Telefon-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext11 für das Feld "BenGes" ins Blatt "Einstellungen" Zelle "P39" eintragen 
 HText12 = "Geben Sie die Telefax-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext12 für das Feld "BenFax" ins Blatt "Einstellungen" Zelle "Q39" eintragen 
 HText13 = "Geben Sie eine Email Adresse, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."			' Den Hilfetext13 für das Feld "BenMai" ins Blatt "Einstellungen" Zelle "R39" eintragen 

 ' Die Definition der Fehlermeldungen Start in Blatt "Einstellungen.$E53"
 FSpalte =  4																										' Die Var. "FSpalte" mit dem Spalten-Index "4" belegen (die erste Spalte hat den Buchstaben "E")
 FZeile  = 52																										' Die Var. "FZeile"  mit dem Zeilen-Index "52" belegen (die erste Zeile hat die Ziffer "53")
 FText   = "darf durch ein Leerzeichen ersetzt werden, oder muss mindestens 3 Zeichen lang sein !!!"				' Die Var. "Ftext"   mit dem entsprechenden STring belegen
 FText00 = 13																										' Die Anzahl der def. Fehlertexte  ins Blatt "Einstellungen" Zelle "E53" eintragen
 FText01 = "Die Firma "        & FText																				' Den Fehlertext01 für das Feld "BenFir" ins Blatt "Einstellungen" Zelle "F53" eintragen 
 FText02 = "Der Vorname muss mindestens 3 Zeichen lang sein" 														' Den Fehlertext02 für das Feld "BenVor" ins Blatt "Einstellungen" Zelle "G53" eintragen
 Ftext03 = "Der Nachname muss mindestens 3 Zeichen lang sein"														' Den Fehlertext03 für das Feld "BenNam" ins Blatt "Einstellungen" Zelle "H53" eintragen
 FText04 = "Die Strasse "      & FText																			 	' Den Fehlertext04 für das Feld "BenStr" ins Blatt "Einstellungen" Zelle "I53" eintragen
 FText05 = "Die Plz darf durch ein Leerzeichen ersetzt werden, oder muss 5 Ziffern lang sein !!!"					' Den Fehlertext05 für das Feld "BenPlz" ins Blatt "Einstellungen" Zelle "J53" eintragen
 FText06 = "Der Ort "          & FText																				' Den Fehlertext06 für das Feld "BenOrt" ins Blatt "Einstellungen" Zelle "K53" eintragen
 FText07 = "Das Land "         & FText																				' Den Fehlertext07 für das Feld "BenLan" ins Blatt "Einstellungen" Zelle "L53" eintragen
 FText08 = "Der Titel "        & FText																				' Den Fehlertext08 für das Feld "BenTit" ins Blatt "Einstellungen" Zelle "M53" eintragen
 FText09 = "Die Position "     & FText																				' Den Fehlertext09 für das Feld "BenPos" ins Blatt "Einstellungen" Zelle "N53" eintragen
 FText10 = "Die Telefon-Nr. "  & FText																				' Den Fehlertext10 für das Feld "BenPrv" ins Blatt "Einstellungen" Zelle "O53" eintragen
 FText11 = "Die Telefon-Nr."   & FText																				' Den Fehlertext11 für das Feld "BenGes" ins Blatt "Einstellungen" Zelle "P53" eintragen
 FText12 = "Die Telefax-Nr. "  & FText																				' Den Fehlertext12 für das Feld "BenFax" ins Blatt "Einstellungen" Zelle "Q53" eintragen
 FText13 = "Die Mail-Adresse " & FText																				' Den Fehlertext13 für das Feld "BenMai" ins Blatt "Einstellungen" Zelle "R53" eintragen

 ' Die Arrays erstellen
 Blatt  = Array(TbHin,TbEin,TbBen)																					' Das Array "Blatt"  für die benptigten Blätter für dieses Modul
 Bild   = Array(BildBr,BildHo)																						' Das Array "Bild"   für die Blidbreite und BildHoehe erstellen
 Dialog = Array(DlgName,GM,DlgTit,Button1,Button2,TAweisg,AnzFeld,AnzEing)											' Das Array "Dialog" für die Var. des Dialoges erstellen 
 Hilfe  = Array(Htext00,Htext01,Htext02,Htext03,Htext04,Htext05,Htext06,Htext07,_
				Htext08,Htext09,Htext10,Htext11,Htext12,Htext13)													' Das Array "Hilfe"  für die Hilfetexte  erstellen
 Fehler = Array(Ftext00,Ftext01,Ftext02,Ftext03,Ftext04,Ftext05,Ftext06,Ftext07,_
				Ftext08,Ftext09,Ftext10,Ftext11,Ftext12,Ftext13)													' Das Array "Fehler" für die Fehlertexte erstellen
 Zeile = Array(DSpalte,DZeile,HSpalte,HZeile,FSpalte,FZeile)														' Das Array "Zeile"  für die Spalten- und Zeilen-Bezeichnungen erstellen
 
 ' Die erzeugten Arrays in das Blatt Einstellungen eintragen
 Infos= Array(Blatt,Bild,Dialog,Hilfe,Fehler,Zeile)																	' Das Array "Infos" aus den bisherigen definierten Array's zusammenfassen
 SetF_VarErstellen(Infos)																							' Die Funktion SteF_VarErstellen aufrufen und ausführen

 
 ' Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe"
' Dialog_BenutzerAnAeLoe(Blatt,Bild,Dialog,Hilfe,Fehler)																	' Die Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe" ausführen
End Sub
Die entsprechende Function dazu im Modul Function

Code: Alles auswählen

'************************************
'* Funktion  zum Einsetzen der Var. *
'*   in Das Blatt "Einstellungen"   *
'************************************
Public Function SetF_VarErstellen(o1)																				' Funktion in der die in den Prozedurren "P*_Anlegen" und "P*_Aendern" angelegten Einträge in das Blatt "Einstellungen" eingetragen werden
 oTbEin = ThisComponent.Sheets.GetByName(o1(0)(1))																	' Die Var "oTbEin" durch das zuweisen der verschiedenen Objekte als aktives Blatt erstellen

 'Die BildBreite und BildHoehe in Blatt "Einstellungen" eintragen 
 For i=0 to UBound(o1(1))																							' Die Schleife durchlaufen solange  das Array "Bild" (o1(1)) Einträge hat
    oTbEin.getCellByPosition(4,3+i).Value = o1(1)(i)  																' Die BildBreite und die BildHöhe  in das Blatt "Einstellungen" Zelle "E4"  und "E5" eintragen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Var für den Dialog "BenutzerAnAeLoe" in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(0)																									' Die Var. "Spalte"	mit dem Wert der Var. "DSpalte" belegen
 For i=0 to UBound(o1(2))																							' Die Schleife durchlaufen solange  das Array "Dialog" (o1(2)) Einträge hat
	If i>=6 then  																									' Wenn i den Eintrag für "anzFelder" bzw. "anzEing" betrifft den Wert eintragen
		oTbEin.getCellByPosition(Spalte,o1(5)(1)).Value = o1(2)(i)  												' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "J&DZeile:K&DZeile" eintragen
	Else																											' Bei allen anderen Werten von i den String eintragen
	    oTbEin.getCellByPosition(Spalte,o1(5)(1)).String = o1(2)(i)  												' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "D&DZeile:I&DZeile" eintragen
	End If
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Hilfetexte in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(2)																									' Die Var. "Spalte"	mit dem Wert der Var. "HSpalte" belegen
 For i=0 to UBound(o1(3))																							' Die Schleife durchlaufen solange  das Array "Hilfetexte" (o1(3)) Einträge hat
    oTbEin.getCellByPosition(Spalte,o1(5)(3)).String = o1(3)(i)  													' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "E&FZeile:U&fZeile" eintragen
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Fehlertexte in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(4)																									' Die Var. "Spalte"	mit dem Wert der Var. "FSpalte" belegen
 For i=0 to UBound(o1(4))																							' Die Schleife durchlaufen solange  das Array "Fehlertexte" (o1(4)) Einträge hat
    oTbEin.getCellByPosition(Spalte,o1(5)(5)).String = o1(4)(i)  													' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "E&FZeile:U&fZeile" eintragen
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht
End Function
Habe ich getestet und funzt wie ich meine. Ich werde wohl diese Bariablen FText01....Ftext15 usw als Globale Variablen definieren (*Mein derzeituger Gedanke) .
So nu ist die Katze aus dem Sack ubd ich stehe bibbernd in der Ecke und warte auf meine Hinrichtung. :shock:

Jetzt aber zu Deiner , wie sagtest Du , "spontaner Idee ... zu dugitalisieren????? Ähm ich dachte Bibliotheken werden am Rechner entwickelt und Rechner = Digital??? oder schreibst du das erst auf Papier???
Na ich wünsche Dir jedenfalls viel Erfolg und ein Schnelles Ergebnis.

Ein schnes Rest WE und bitte sei nicht zu hart mit Deinem Urteil meiner Idee

Gruss Dirk

Re: Eingabefelder in Dialog

von marcel_at_work » Fr, 13.12.2019 20:55

Hallo Dirk,

Stress habe ich gar nicht unbedingt, sondern nur zu wenig Zeit für all die Dinge, die ich gerne erledigen möchte...
Vor zwei Wochen habe ich z.B. im Affekt beschlossen, meine gesamte Bibliothek und alle meine Unterlagen zu digitalisieren, da mir das stetige Suchen (und größtenteils NICHT-finden) dermaßen "auf den Keks geht". Es musste dafür erst recherchiert, anschliessend ein Scanner besorgt und nun, seit fast fünf Tagen, damit getestet werden. Dies war ursprünglich alles nicht eingeplant und aktuelle Projekte stauen sich... :)

Ich find' es toll, dass du so gut vorankommst. 'Daumen hoch'! In Kürze schon ist der Herr ein Profi... ;-)
Wie kann ich aus der Prozedur die das Dialogfeld konfiguriert an den Key Listener Variablen Übergeben???
Katz Mache ich das wie oben gezeigt. Anders habe ich es nicht hinbekommen weil ich mit "Function F_Mat_KeyPressed(oEvt) As Boolean" nicht zurecht komme. wenn ich es richtig verstanden habe bedutet (oEvt) as Boolean doch das die oEvt- Bar. Boolean also Wahr oder falsch definiert hat. wie jann man den z. B. die Var Gm im Kopf mit übergeben??
Da ich letztens zufällig etwas Ähnliches brauchte, aber zu faul war, mir Gedanken zu machen, hatte ich dies einfach mit einer globalen Variable gelöst: Der Wert (eine Variable) wird in der Prozedur gesetzt und im Listener dann abgefragt > klappt prima, schön ist das allerdings nicht.

Listener-Events sind in der besagten Dokumentation sehr gut beschrieben. Bitte auch einmal anschauen! :)

Objekt-Beschreibung:

Wenn das "_keyPressed"-Ereignis der Schaltfläche aktiviert wird, übergibt das auslösende Objekt sowohl spezifische Ereignisdaten sowie auch all seine Objekt-Eigenschaften an die "_keyPressed"-Funktion, die dann in oEvt verfügbar sind. Der Inhalt dieser Objekt-Variable kann, soweit mir das meine Logik sagt, nicht gelöscht/ersetzt werden.

Mit der Deklaration "As Boolean" wird ausschliesslich der Typ des Rückgabewertes festgelegt - also, NACH Beendigung der Funktion "_keyPressed" ist ihr Wert wahr oder falsch.

Lösungsvorschlag:

In oEvt sind allerdings die gesamten Objekteigenschaften (also auch geerbte Eigenschaften des übergeordneten Dialog-Objekts) enthalten.
Du könntest in deiner Dialogfeld-Prozedur einfach eine nicht benötigte Eigenschaft der Schaltfläche (oder des Dialoges) mit deinem gewünschten Wert definieren - da gäbe es hunderte Möglichkeiten.
Im "_keyPressed"-Ereignis kann man dies dann einfach mittels: x = oEvt.Source...irgendeineEigenschaft abfragen. Dialog-Eigenschaften können von der Schaltfläche aus, ich glaube, über ".parent" oder "...context" angesprochen werden.

Mit ein paar Minuten Xray kann man dies alles sehr schnell herausfinden. ;-)

Eine sich direkt daraus ergebende Frage wäre, WARUM du überhaupt aus einer anderen Prozedur auf die Listener-Funktion zugreifen möchtest? WAS ist der Zweck davon? Kann man das nicht vielleicht auch anders lösen?

Hier noch ein paar Anregungen:

Code: Alles auswählen

 for i=1 to anzFelder																					' Die For-Schleie solange durchlaufen wie der Zähler "i" kleiner gleich der existierenden Dialogeinträge ist 
	oControls=oDlg_Dialog.tabControllers(0).controls													' In die Object Var. "oConbtrol" den Dialogeintrag aufnehmen
	oKeyListener = createUnoListener("F_Mat_", "com.sun.star.awt.XKeyListener")							' Den Listener "oKeyListener" laden und als "oKey_" definieren
	oControls(i).addKeyListener(oKeyListener)															' Den Dialogeintrag aus dem Listener "oKeyListener" aufnehmen 
 next	
Die zweite und dritte Zeile gehören nicht IN die Schleife - da passiert immer nur dasselbe.

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)	
 ...
Wenn diese tausenden Variablen IM Listener eigentlich stets dieselben Werte besitzen, könnte man sie auch als globale Variablen deklarieren und in einer Start-Prozedur zuweisen? Aktuell müssen sie bei jedem Klick-Ereignis erneut erstellt werden...

Viele Grüße und ein besinnliches Wochenende,

Marcel

Re: Eingabefelder in Dialog

von pcdirk91 » Do, 12.12.2019 20:10

Hi Marcel,
ich hoffe Dir geht es soweit gut und es ist nicht mehr so stressig für Dich. Ist ja schliesslich die wie wir hier sagen "die Stade Zeit" (stade = ruhige). Ich habe jetzt viel durch probiert und für meine Begriffe auch optimiert. Der gesamte Code ist fast fertig. Ihn werde ich falls Interesse bessteht Dir gerne zur Durchsicht senden. Der Grund warum ich dich jetzt anfrage ist folgender:

wie Du dich sicher erninnern kannst habe ich durch Dich gelernt wie man Variablen in andere Prozeduren weitergibt (Danke nochmals dafür). Jetzt habe ich aber ein Problem mit dem oKey-Listener
Aufruf:

Code: Alles auswählen

Function F_Mat_KeyListener_Load																			' Funktion zum Laden des "KeyListener"
 Dim anzFelder as Integer : anzFelder = oTbEin.getCellrangeByName("J25").Value							' Die Integer Var. "anzFelder" deklarieren und mit dem Wert aus dem Blatt "Einstellungen" Zelle "J25" belegen
 for i=1 to anzFelder																					' Die For-Schleie solange durchlaufen wie der Zähler "i" kleiner gleich der existierenden Dialogeinträge ist 
	oControls=oDlg_Dialog.tabControllers(0).controls													' In die Object Var. "oConbtrol" den Dialogeintrag aufnehmen
	oKeyListener = createUnoListener("F_Mat_", "com.sun.star.awt.XKeyListener")							' Den Listener "oKeyListener" laden und als "oKey_" definieren
	oControls(i).addKeyListener(oKeyListener)															' Den Dialogeintrag aus dem Listener "oKeyListener" aufnehmen 
 next	 																								' Den Zähler "i" um den Wert "1" erhöhen und wieder zum An fang der For-Schleife springen
End Function																							' Das Ende der Funktion
Mündet dann in :

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)									' Die Object Var. "oOk"  mit dem CommandButton1 belegen
 Dim oOk1   as Object  : oOk1   = odlg_Dialog.getControl("CommandButton1")								' Die Object Var. "oOk1"  mit dem CommandButton1 belegen
 Dim oAb    as Object  : oAb    = odlg_Dialog.model.controlModels(1)									' Die Object Var. "oAb"  mit dem CommandButton1 belegen
 Dim Bez    as Object  : Bez    = odlg_Dialog.getControl("MatBez")										' Die Object Var. "Bez"  mit dem EingabeFeld "MatBez" belegen
 Dim St     as Object  : St     = odlg_Dialog.getControl("MatSt")										' Die Object Var. "St"   mit dem EingabeFeld "MatSt"  belegen
 Dim Nr     as Object  : Nr     = odlg_Dialog.getControl("MatNr")										' Die Object Var. "Nr"   mit dem Eingabefeld "MatNr"  belegen
 Dim F1     as Object  : F1     = odlg_Dialog.getControl("oTextFehler")									' Die Object Var. "F1"   mit dem Labelfeld "oTextFehler"  belegen
 Dim A1     as Object  : A1     = odlg_Dialog.getControl("oTextAnweisg")								' Die Object Var. "A1"   mit dem Labelfeld "oTextAnweisg" belegen
 Dim TSt    as Object  : TSt    = odlg_Dialog.getControl("oTextSt")										' Die Object-Var. "oTextSt"       mit dem Labeldfeld "oTextSt"       belegen
 Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")								' Die Object-Var. "oTextEinheit"  mit dem Labeldfeld "oTextEinheit"  belegen
 Dim TNr    as Object  : TNr    = odlg_Dialog.getControl("oTextNr")										' Die Object-Var. "oTextNr"       mit dem Labeldfeld "oTextNr"       belegen
 Dim oDatNr as Object  : oDatNr = oTbEin.getCellByPosition( 3,5)  										' Die Adresse der Object Var. "DatNr" mit Zelle "Einstellungen!K6" belegen
 Dim Feld   as String  : Feld   = oEvt.source.Model.Name												' Die Object Var. "Feld"   mit dem Object "oEvt.Source.Name" belegen					
 Dim GM     as String  : GM     = oTbEin.getCellByPosition( 4,24).String								' Die String Var. "Gmenu" mit der Prozedur die gestartet wurde belegen
 Dim anzMat as Integer : anzMat = oTbEin.getCellByPosition(12,24).Value -1								' Die Integer Var. "anzMat" mit der Ssumme aller angelegten Materialien minus dem Wert "1" belegen
 Dim ZNrID  as Integer : ZNrID  = oTbEin.getCellByPosition(13,24).Value									' Die Integer Var. "ZNrID"  mit dem Wert der 1. blegten Zeilennummer asl Index belegen
 Dim LfdNr1 as Integer : LfdNr1 = oTbEin.getCellByPosition(12,24).Value+1								' Die Integer Var. "LfdNr1" mit dem Wert (aller angelegten Materialien + dem Wert "1") belegen
 Dim LfdNr2 as Inte

'weitere Anweisungen

End Function
Jetzt meine Frage
Wie kann ich aus der Prozedur die das Dialogfeld konfiguriert an den Key Listener Variablen Übergeben???
Katz Mache ich das wie oben gezeigt. Anders habe ich es nicht hinbekommen weil ich mit "Function F_Mat_KeyPressed(oEvt) As Boolean" nicht zurecht komme. wenn ich es richtig verstanden habe bedutet (oEvt) as Boolean doch das die oEvt- Bar. Boolean also Wahr oder falsch definiert hat. wie jann man den z. B. die Var Gm im Kopf mit übergeben??

Vielleicht hast Du oder ein anderer kurz Zeit mir Tipps oder Lösungen zu geben.
Ich werde Die nächsten Tage wenn ich die Beschreibungen fertig geschrieben habe und Interesse besteht den Code hier reinstellen.
Ansonsten wünsche Ich Dur Marcel, aber auch den anderen Leuten eine Schöne und ruhige Vorweihnachtszeit.
Gruss Dirk

Re: Eingabefelder in Dialog

von pcdirk91 » So, 01.12.2019 19:20

Hi Marcel,
verfiss den vorherigen Post habe noch was besseres gefunden. Kann das aber noch nicht senden.
Dennoch Danke und einen schönen Abend

Gruss DIrk :lol:

Re: Eingabefelder in Dialog

von pcdirk91 » So, 01.12.2019 17:59

Hi Marcel,
zunächst wünsche ich einen schönen Resr-Sonntag. Ich habe in den letzten Tagen viel probiert den Code zu kürzen. Bei dem Key-Listener bin ich soweit gekommen das es für mich funzt. Vielleicht kannst Du mal drüber schauen.

Code: Alles auswählen

Function oKey_KeyPressed(oEvt) As Boolean														' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg      as Integer
 Dim oOk as Object : oOk= oOkButton
 Dim oOk1 as Object : oOk1= oOkButton1
 Dim oAb as Object : oAb= oAbButton
 Dim Bez as Object : Bez = oMatBez
 Dim St as Object : St = oMatSt
 Dim Nr as Object : Nr = oMatNr
 Dim Fehler as Object : Fehler = oTextFehler
 Dim Anweisg as Object : Anweisg = oTextAnweisg
 Dim Feld as String : Feld= oEvt.source.Model.Name								

 select case oEvt.KeyChar																		' Der eingebene Tastaturwert soll ausgewählt werden
    case chr(13)																				' Wenn die Taste "Return" gedrückt wurde
		'Wenn die Funktion durch das Feld "MatBez" aufgerufen wurde
		If Feld= "MatBez" Then
			'Wenn die Function aus dem Feld "MatBez" gestartet wurde
			If Feld= "MatBez" Then SetMeineFunktionBez("BezTrim",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Im Feld "MatBez" alle Leerzeichen am Anfang  u. am Ende löschen
			' Dan Anfangsbuchstebn gross schreiben
			If Len(Bez.Text) > 1 then SetMeineFunktionBez("BezLg",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Das Feld "MatBez" den Anfangsbuchstaben Gross machen 
			'Wenn das Feld "MatBez" leer ist
			If Bez.Text = "" Then																	
				SetMeineFunktionBez("keine Bez",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)			' Die Fehlermeldung für die leere Bezeichnung konfigurieren und einblenden  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			'Wenn das Feld "MatBez" <3 oder >20 Zeichen hat
			If Len(Bez.Text) < 3 or Len(Bez.Text) > 20 then
				SetMeineFunktionBez("falsche Bez",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Die Fehlermeldung für die zu kurze oder zu lange Bezeichnung konfigurieren und einblenden  	  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			' Wenn die "MatBez" kein "platte" am Ende hat 
			If LCase(Right(Bez.Text,6)) <> "platte" Then Bez.Text = Bez.Text & "platte"			' Das Feld "MatBez" um den String "platte" erweitern
			' Das EingabeFeld "MatNr" wird berechnet
			SetMeineFunktionBez("MatNr",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' Das Feld "MatNr" belegen
			'Die Fehlerzeile wird aus- die Anweisungzeile eingeschaltet
			SetMeineFunktionBez("Fehler aus",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)				' Das EingabeFeld "MatST" und seine Beschriftungen werden eingeschaltet
			'Das Feld "MatST" und seine Beschriftungen werden eingeschaltet
			SetMeineFunktionenDialog("EingabeEinAus",Array(oTextFehler, False,oTextAnweisg,True,_
														   oMatSt,True,oTextSt,True,_
														   oTextEinheit,True,))					' Aufruf der Funktion "SetMeineFunktionenDialog" zum Unsichtbar- oder Sichtbar-Schaltung der Eingabefelder bzw. Beschriftung ausführen
		    St.SetFocus()																		' Das Eingabefeld "MatSt" fokussieren
		End If
		'Wenn die Function aus dem Feld "MatBez" gestartet wurde
		If Feld = "MatSt" Then
			'Wenn das Feld "MatSt" <2 oder >28 Zeichen ist
			If St.Value < 2 or St.Value > 28 Then 												' Wenn das Feld "MatSt" den Wert <2 oder >28 Ist
				SetMeineFunktionBez("falsche St",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)			' Die Fehlermeldung für die zu kleine oder zu grosse Materialstärke konfigurieren und einblenden  	  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			'Die Fehlerzeile wird aus- die Anweisungzeile eingeschaltet
			SetMeineFunktionBez("Fehler aus",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)				' Das EingabeFeld "MatST" und seine Beschriftungen werden eingeschaltet
			' Das EingabeFeld "MatNr" wird berechnet
			SetMeineFunktionBez("MatNr",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' Das Feld "MatNr" belegen
			' Das Feld "MatNr" und seine Beschriftungen sichtbar schalten
			SetMeineFunktionenDialog("EingabeEinAus",Array(oMatNr,True,oTextNr,True))			' Aufruf der Funktion "SetMeineFunktionenDialog" zum Unsichtbar- oder Sichtbar-Schaltung der Eingabefelder bzw. Beschriftung ausführen
			' Das EingabeFeld "MatNr" und der CommandButton1 werden eingeblendet
			SetMeineFunktionBez("Button",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' die CommandButtons auf die x-Position setzen und schalten
			oOk1.setFocus()																		' Den CommandButton1 "Material anlegen" fokussieren
		End If
	case else																					' Wenn keine definierte Taste gedrückt wurde
  end select																					' Das Ende der Tastenselektion
End Function



Function oKey_KeyReleased(oEvt) As Boolean
  oKey_KeyReleased = False
End Function


Sub oKey_disposing(oEvt)
  'Muß nur vorhanden sein, keine weitere Funktion auslösen
End Sub
die entsprechene Benutzer Function

Code: Alles auswählen

Public Function setMeineFunktionBez(s1 as String,oOK,oOk1,oAb,Bez,St,Nr,F1,A1)
 Dim Ftext1  as String : Ftext1 = oTbEin.getCellRangeByName("E53").String						' Die Var. "FText1" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "E53" belegen
 Dim Ftext2  as String : Ftext2 = oTbEin.getCellRangeByName("F53").String						' Die Var. "FText2" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "F53" belegen
 Dim Ftext3  as String : Ftext3 = oTbEin.getCellRangeByName("G53").String						' Die Var. "FText3" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "G53" belegen
 Select Case s1
	Case "BezTrim"
		Bez.Text=Trim(Bez.Text)																	' Die Anfangs- und End-Leerzeichen werden aus dem Feld "MatBez" entfernt
	Case "BezLg"
		Lg = Len(Bez.Text)-1																	' Die Var. "L" aus der Länge des Feldes "MatBez" belegen
		Bez.Text = UCase(Left(Bez.Text,1)) & Right(Bez.Text,Lg) 								' In der Materialbezeichn ung den 1. Buchstaben Groß schreiben
	Case "MatNr"
		If St.Value =  0 Then Nr.Text = Bez.text  + "_00"										' Das Feld "MatNr" mit dem String des Feldes "MatBez" und dem String "_00" belegen
		If St.Value <= 9 Then Nr.Text = Bez.text  + "_0" + St.Value	 							' Das Feld "MatNr" mit dem String des Feldes "MatBez" ,dem String "_0" und dem Feld "MatSt" belegen
		If St.Value >  9 Then Nr.Text = Bez.text  + "_"  + St.Value								' Das Feld "MatNr" mit dem String des Feldes "MatBez" ,dem String "_" und dem Feld "MatSt" belegen
		' Wenn der CommandButton1 deaktiviert ist
		If oOk.enablevisible= True then
			oOk.enabled = True 																	' Den CommandButton1 "Material anlegen" aktivieren
			oOk1.setFocus()																		' Den CommandButton1 "Material anlegen" fokussieren
		end If	
 	Case "Button"
		oOk.positionx =  10
		oAb.positionx = 105
		oOk.enabled   = True
		oOk.enableVisible = True
	Case "keine Bez"
		F1.text = Ftext1																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext1" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "falsche Bez"
		F1.text = Ftext2																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext2" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "falsche St"
		F1.text = Ftext3																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext3" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "Fehler aus"
		F1.Visible= False																		' Die Object Var. "oTextFehler"    unsichtbar schalten
		A1.Visible= True																		' Die Object Var. "oTextAnweisung"   sichtbar schalten
 End Select
End Function
Wollte Fragen ob da sehr viel verkehrt ist.
Vielleicht hast Du ja etwas Zeit mal drüber zu schauen.
Ansonstenb hoffe ich Du hast wieder etwas weniger Stress und wünsche DIr einen ruhugeren Wochen-Anfang.

Gruss DIrk

Re: Eingabefelder in Dialog

von marcel_at_work » Di, 26.11.2019 18:53

Hallöchen Dirk,

alles gut. :lol:

Dies steht im OOME eine Zeile weiter unten:

Code: Alles auswählen

Die Angabe von „zähler“ hinter der Next-Anweisung ist optional. Next bezieht sich automatisch auf
die zuletzt vorgekommene For-Anweisung.
For i = 1 To 4 Step 2
  Print i ' Gibt erst 1, dann 3 aus.
Next i    ' In dieser Anweisung ist das i optional.
Ich habe bislang noch keinen Zweck für diese Angabe entdeckt.
Das mit dem "_+" habe ich mal getestet, und wie Du glaube ich auch geschrieben hast , miss ich das Plus nur bei Strings die durch den "_" getrennt werden einsetzen. *Werde ich überarbeiten.
Das bedeuted, ein Verbindungszeichen ist in einem Array (wie es immernoch überall zu finden ist) nicht notwendig, da z.B.:

Code: Alles auswählen

Array("1", _
      "2")
... ein Objekt mit Elementen darstellt, die von einander getrennt sind.
Den Punkt mit Set.Focus() ist richtig geht auch ohne Function. Ich habe dich nur so verstanden das SIe leichter lesbar ist als z.B. "oMatBez.setfocus"
Werde ich aber abändern.
Du hattest folgende Funktion geschrieben:

Code: Alles auswählen

Function setFocus(o1)
	o1.setFocus()
End Function
Dein Aufruf dazu lautet z.B.: setFocus(oMatBez)
... analog der BASIC-Methodenaufruf des Objektes: oMatBez.setFocus()
Wenn es schon eine fertige Funktion gibt, die auch noch fast identische Ausdrücke benutzt, würde eine zusätzliche (redundante) Funktion den Programm-Code nur unnötig aufblähen. Also, ich persönlich, versuche, wo ich nur kann, Code zu verdichten und somit zu löschen, damit er übersichtlicher wird.
Das Array was ich dort Erstelle habe ich auf die Schnelle erstellt . Gute Idee das in eine Function zu packen. Aber dabei Habe ich noch eine Frage an Dich (sicherlich lapidar und irgendwo beschrieben; finde es aber nicht) Meine Idee war die Functionen in eine zu schreiben und dann je nachdem welche aufgerufen wurde zu dieser dann zu springen. Also praktisch eine Abfrage welche Function benötigt wird und dann genau zu diesem Punkt zu soringen. damit könnte man die Anzahl der Einträge der Functionen reduzieren. Was sagst du dazu??
Verstehe ich noch nicht so ganz... :shock:
Ja das ist gewollt. Wenn man den Dialog "Material AnAeLoe" abbricht soll der Abbruch durch die Meldung angezeigt werden. Damit man Due Meldung entweder mit "x" oder mit "Ok" bekommt habe ich das so gelöst. Nicht gut???
... wenn das immer passieren soll, z.B.:

Code: Alles auswählen

	Select Case dlg.Execute()
	Case Else
		... wird bei jeder Dialog-Rückgabe aufgerufen
	End Select

Code: Alles auswählen

SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,False))
Tipp (allgemein): Wenn man Werte gleicher Struktur untereinander schreibt, ist dies übersichtlicher und weniger fehleranfällig...

Code: Alles auswählen

SetLabelEin_Aus(Array(oMatSt,True,_
		      oMatNr,True,
		      oTextFehler,False,
		      oTextSt,True,
		      oTextEinheit, False))
Die Dokumentation von "Andrew Pitonyak" hat 715 Seiten und diese komplett zulesen und begreifen fällt mir sehr schwer. Daher habe ich den oben beschriebenen Weg gewählt. Ist vieleicht faösch.
Auf den ersten 120 Seiten sind die BASIC-Grundelemente beschrieben, die fortlaufend benutzt werden - soviel ist das nicht. Alles andere kann man nachschlagen, wenn man es braucht. Mit Studium und Praxis kann man das in ein, zwei Wochen, am Abend, hinbekommen. Das erübrigt dann zukünftig viele Hundert Stunden Fehlersuche (also, je nachdem, wieviel Zeit man überhaupt in der BASIC-IDE verbringt).

Aber dein Programm-Code ist schon sehr viel kompakter geworden, find' ich prima.

BASIC-Fragestunde für heute beendet... 8)

Viele Grüße,

Marcel

Re: Eingabefelder in Dialog

von pcdirk91 » Di, 26.11.2019 14:31

Hi Marcel,
wollte die nur den Code nochmals unverändert übermitteln (hoffentlich jetzt lesbarer

Die im Kopf des Modul definiert Variablen (die mit " ' " ausgegrauten werden nicht mehr benötigt)

Code: Alles auswählen

Dim oDlg_Dialog       as Object																			' Die Deklaration der Var. "oDlg_Dialog" as object (wird benötigt um den Dialog anzeigen zu können)
Dim oDlg_Meldung      as Object																			' Die Deklaration der Var. "oDlg_Meldung" as object (wird benötigt um den Dialog anzeigen zu können)
Dim oOkButton		  as Object																			' Die Deklaration der Var. "oOkButton" as object (der Ok-Button im Dialog "Material anlegen")
Dim oAbButton		  as Object																			' Die Deklaration der Var. "oABButton" as object (der Abbrechen-Button im Dialog "Material anlegen")
Dim oMatBez           as Object																			' Die Deklaration der Var. "oMatBez" as object (das EingabeFeld "Material-Bezeichnung" im Dialog "Material anlegen")
Dim oMatSt		      as Object																			' Die Deklaration der Var. "oMatSt" as object (das EingabeFeld "Material-Stärke" im Dialog "Material anlegen")
Dim oMatNr			  as Object																			' Die Deklaration der Var. "oMatNr" as object (das EingabeFeld "Material-Nr" im Dialog "Material anlegen")
Dim oTextAnweisg	  as Object																			' Die Deklaration der Var. "oAnweisung" as object (das TextFeld "Label1" im Dialog "Material anlegen")
Dim oTextFehler		  as Object																			' Die Deklaration der Var. "oFehler" as object (das TextFeld "Label2" im Dialog "Material anlegen")    
Dim oTextSt  	 	  as Object																			' Die Deklaration der Var. "oTextMatSt" as object (das TextFeld "Material-Stärke" im Dialog "Material anlegen")
Dim oTextEinheit      as Object																			' Die Deklaration der Var. "oTextEinheit" as object (das TextFeld "mm" im Dialog "Material anlegen")
Dim oTextNr	    	  as Object																			' Die Deklaration der Var. "oTextMatNr" as object (das TextFeld "Material-Nr" im Dialog "Material anlegen")
Dim aMatListe         as Object																			' Die Deklaration der Var. "aMatListe" as object (für das Array aller Materialien) 
Dim oControls         as Object																			' Die Deklaration der Var. "oControls" as object (für den Key-Listener) 
Dim oKeyListener      as Object																			' Die Deklaration der Var. "oKeyListener" as object (für den Key-Listener) 
Dim oColumnModel      as Object																			' Die Deklaration der Var. "oColumnModel" als Object (beeinhaltet eine Splate im Grid)
Dim oDataModel        as Object																			' Die Deklaration der Var. "oDataModel" als Object (beinhaltet den Datensatz eines angelegten Benutzers)
Dim oGridModel        as Object																			' Die Deklaration der Var. "oGridModel" als Object 
Dim oGridControl      as Object																			' Die Deklaration der Var. "oGridControl" als Object 
Dim oMyGrid		      as Object																			' Die Deklaration der Var. "oMyGrid" als Object 
'Dim BildBreite        as long																			' Die Deklaration der Var. "Bildbreite" als lomg (wird zum Positionieren des Dialoges benötigt)
'Dim BildHoehe         as long																			' Die Deklaration der Var. "Bildhoehe" als Long  (wird zum Positionieren des Dialoges benötigt)
'Dim DialogBreite      as long																			' Die Deklaration der Var. "DialogBreite" als Long (wird zum Positionieren des Dialoges benötigt)
'Dim DialogHoehe       as long																			' Die Deklaration der Var. "DialogHoehe" als Long (wird zum Positionieren des Dialoges benötigt)
'Dim Rueckwert         as Integer																		' Die Deklaration der Var. "Rueckwert" als Wert (Ob der Dialog mit "Ok" geschlossen wurde oder mit "Abbrechen" oder "x")
'Dim anzFelder         as Integer																		' Die Deklaration der Var. "anzFelder" als Wert (Die Anzahl der Buttons, Textfelder und Eingabefelder des Dialoges)
'Dim anzEingabe        as Integer																		' Die Deklaration der Var. "anzFelder" als Wert (Die Anzahl der Eingabefelder des Dialoges)
'Dim anzMat            as Integer																		' Die Deklaration der Var. "anzMat" als Integer (enthält die anzahl der angelegten Materialien)
'Dim vonZeile          as Integer																		' Die Deklaration der Var. "vonZeile" als Integer (beinhaltet die Zeile als Index des 1. Datensatzen)
'Dim bisZeile          as Integer																		' Die Deklaration der Var. "bisZeile" als Integer (beinhaltet die zeile als Index des letzten Datensatzes)
Dim Zeile_Id          as Integer																		' Die Deklaration der Var. "zeileText3" als String (wird für die Zeile des 1. freien Datensatzes verwendet)er
Dim Meldung           as Integer																		' Die Deklaration der Var. "Meldung" als Integer (wird für den Dialog "MeldungAusgeben" benötigt
'Dim GMenu             as String																			' Die Deklaration der Var. "GMenu" als String (wird zum Abfragen welcher Menüpnkt gewählt wurde benötigt)
'Dim BibliothekName    as String																			' Die Deklaration der Var. "BibliothekName" als String (wird zum Ermitteln der aufzurufenden Libairies benötigt)
'Dim DialogName        as String																			' Die Deklaration der Var. "DialogName" als String (Wird für den Aufruf des entsprechenden Dialog benötigt)
Dim ttl               as Variant																		' Die Deklaration der Var. "ttl" als Variant (beinhaltet den linken  Rand des Tabellen-Grids)
Dim ttr               as Variant																		' Die Deklaration der Var. "ttr" als Variant (beinhaltet den rechten Rand des Tabellen-Grids)
Dim tto               as Variant																		' Die Deklaration der Var. "tto" als Variant (beinhaltet den oberen  Rand des Tabellen-Grids)
Dim ttu               as Variant																		' Die Deklaration der Var. "ttl" als Variant (beinhaltet en unteren  Rand des Tabellen-Grids)
Dim MyGrid		      as Variant																		' Die Deklaration der Var. "MyGrid" als Variant (beinhaltet den Namen des Tabellen-Grids)
Die Prozedur "P_MatAnlegen" zum Starten ausführen

Code: Alles auswählen

Sub P_MatAnlegen																						' Prozedur zum Anlegen eines Materials
' oView.setActiveSheet(oTbHin)																			' Das Blatt "Hintergrund" sichtbar machen
 ' DIe Infos für den DIalog "MatAnAeLoe"  ins Blatt "Einstellungen" eintragen 
 oTbEin.GetCellRangeByName("D25").String = "MaterialAnAeLoe"											' Den DialogNamen  "MaterialAnAeLoe"         ins Blatt "Einstellungen" zelle "D25" eintragen
 oTbEin.GetCellRangeByName("E25").String = "Anlegen"													' Die Prozedurart  "Anlegen"                 ins Blatt "Einstellungen" zelle "E25" eintragen
 oTbEin.GetCellRangeByName("F25").String = "Material anlegen"											' Den Dialogtitel  "Material anlegen"        ins Blatt "Einstellungen" zelle "F25" eintragen 
 oTbEin.GetCellRangeByName("G25").String = "Material "& chr(126) & "anlegen"							' Die Schaltfläche "M aterial ~ablegen"      ins Blatt "Einstellungen" zelle "G25" eintragen 
 oTbEin.GetCellRangeByName("H25").String = "Nehmen Sie die notwendigen Eingaben vor !!!"				' Die Schaltfläche "M aterial ~ablegen"      ins Blatt "Einstellungen" zelle "H25" eintragen 
 oTbEin.GetCellRangeByName("I25").Value  = 10															' Die Anzahl aller Felder des Dialoges       ins Blatt "Einstellungen" zelle "I25" eintragen 
 oTbEin.GetCellRangeByName("J25").Value  = 3															' Die Anzahl der Eingabe-Felder des Dialoges ins Blatt "Einstellungen" zelle "J25" eintragen  

 ' Die Helptexte ins Blatt "Einstellungen" eintragen
 oTbEin.GetCellRangeByName("E39").String = "Die Bezeichnung muss mind. 3 Zeichen lang sein, und mit " &_
 											+ chr(8222) & "ENTER" & chr(8220) &" bestätigt werden."		' Der Helptext für das Feld "MatBez"       ins Blatt "Einstellungen" zelle "E39" eintragen 
 oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
 											+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
 											+ " bestätigt werden."										' Der Helptext für das Feld "MatSt"        ins Blatt "Einstellungen" zelle "F39" eintragen 
 oTbEin.GetCellRangeByName("G39").String = "Die Material-Nr  wird automatisch aus der Bezeichnung "_
 											+ "und der Stärke gebildet."								' Der Helptext für das Feld "MatNr"        ins Blatt "Einstellungen" zelle "G39" eintragen 

 ' Die Fehlertexte ins Blatt "Einstellungen" eintragen
 oTbEin.GetCellRangeByName("E53").String = "Die Bezeichnung muss belegt sein !!!"						' Der Fehlertext1 für das Feld "MatBez"    ins Blatt "Einstellungen" zelle "E53" eintragen 
 oTbEin.GetCellRangeByName("F53").String = "Die Bezeichnung muss zwischen 3 und 20 Zeichen lang " & _
 											+ "sein !!!" 												' Der Fehlertext2 für das Feld "MatBez"    ins Blatt "Einstellungen" zelle "F53" eintragen 
 oTbEin.GetCellRangeByName("G53").String = "Die Stärke muss zwischen 2 und 28 mm betragen !!!"			' Der Fehlertext3 für das Feld "MatSt"     ins Blatt "Einstellungen" zelle "G53" eintragen 
 oTbEin.GetCellRangeByName("H53").String = "Dieses Material existiert bereits !!!"						' Der Fehlertext3 für Material existiert"  ins Blatt "Einstellungen" zelle "H53" eintragen 

 ' Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe"
 Dialog_MatAnAeLoe																						' Die Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe" ausführen

 ' Der Dialog "MaterialAnAeLoe" wird ausgewertet; Rückgabewert "0" mit Button "Abbrechen oder mit "x" 
 If oDlg_Dialog.Execute = 0 Then																		' Wenn der Dialog "MaterialAnAeLoe" mit Abbrechen oder "x" gwählt wurde 
	UnregisterKeyListener																				' Der Key-Listener wird wieder entladen
	oTbEin.getCellRangeByName("R6").Value = 0															' Im Blatt "Einstellungen" in der Zelle "R6" den Wert "0" (Der Dialog "Material anlegen" wurde abgebrochen) einsetzen
	oTbEin.getCellRangeByName("S6").Value = 1															' Im Blatt "Einstellungen" in der Zelle "S6" den Wert "1" (die Texte für "MatAbbruchAnlegen" ausgeben)

	' Der Dialog "MaterialAnAeLoe" wurde abgebrochen
	Dialog_MatMeldung																					' Die Prozedur zum Erstellen und Einstellen des Dialoges "MeldungAusgeben" ausführen

	If oDlg_Meldung.Execute = 0 Then																	' Wenn der Dialog "Meldun Ausgeben" mit  Abbrechen oder "x" gwählt wurde 	
		' Der Dialog "MaterialAnAeLoe" wurde abgebrochen	
		AbruchMatAnAeLoe:																				' Die Sprungmarke "AbruchMatANAELoe" wurd durchlaufen wenn der Dialog "MaterialANAELoe" abgebrochen wurde
		Arg=Array(oTbEin.getCellRangeByName("K6:S6"),  oTbEin.getCellRangeByName("D25:J25"),_
 				+ oTbEin.getCellRangeByName("E39:S39"),oTbEin.getCellRangeByName("E53:S53"))			' Die Argumente "Material","für Dialog- u. Variablen", "für Hilfetext" u. für Fehlertext aufnehmen
		For i = 0 To UBOUND(arg)																		' Die Schleifen solange Argumente vorhanden sund durchlaufen
			oBereich = arg(i)																			' Die Object Var. "oBereich" mit dem Argument belegen
			oBereich.clearContents(com.sun.star.sheet.CellFlags.VALUE _
								  +com.sun.star.sheet.CellFlags.STRING)									' Im Blatt "Einstellungen" die in der Object Var. "oBereich" enthaltenen Zellen von Werten und Strings leeren
		Next i																							' Den Zähler "i" um den Wert "1" erhöhen und zum Schleifenbeginn springen
		Exit Sub																						' Die Prozedur wird vorzeitig beendet
	Else
		' Der Dialog "MaterialAnAeLoe" wurde mit "Ok" beendet	
		Goto AbruchMatAnAeLoe																			' Weiter an der Sprungmarke "AbruchMatANAELoe"
	End If
 End If
Die Prozedur "Dialog_MaterialAnAeLoe" wird von dort aufgerufen

Code: Alles auswählen

 Sub Dialog_MatAnAeLoe																					' Prozedur zum Einstellen des Dialoges "MaterialAnAeLoe"
 Dim oTitel       as Object																				' Die Object Var. "oTitel" deklarieren
 Dim DialogBreite as Long 																				' Die Long Var.   "DialogBreite" deklarieren 
 Dim DialogHoehe  as Long																				' Die Long Var.   "DialogHöhe" deklarieren 
 Dim BildBreite   as Long   : BildBreite = oTbEin.getCellRangeByName("E18").String						' Die Long Var.   "BildBreite" mit dem Wert aus Blatt "Einstellungen" Zelle "E18" belegen
 Dim BildHoehe    as Long   : BildHoehe  = oTbEin.getCellRangeByName("E19").String  					' Die Long Var.   "BildHoehe"  mit dem Wert aus Blatt "Einstellungen" Zelle "E19" belegen
 Dim DialogName   as String : DialogName = oTbEin.getCellRangeByName("D25").String						' Die Long Var.   "DialogName" mit dem Wert aus Blatt "Einstellungen" Zelle "D25" belegen
 Dim Gmenu        as String : Gmenu      = oTbEin.getCellRangeByName("E25").String						' Die String Var. "GMenue"     mit dem Wert aus Blatt "Einstellungen" Zelle "E25" belegen
 Dim Titel        as String : Titel      = oTbEin.getCellRangeByName("F25").String						' Die String Var. "Titel"      mit dem Wert aus Blatt "Einstellungen" Zelle "F25" belegen
 Dim TButton      as String : TButton    = oTbEin.getCellRangeByName("G25").String						' Die String Var. "TButton"    mit dem Wert aus Blatt "Einstellungen" Zelle "G25" belegen
 Dim Anweisung    as String : Anweisung  = oTbEin.getCellRangeByName("H25").String						' Die String Var. "Anweisung"  mit dem Wert aus Blatt "Einstellungen" Zelle "H25" belegen
 Dim H_MatBez     as String : H_MatBez   = oTbEin.getCellRangeByName("E39").String						' Die String Var. "H_MatBez"   mit dem Wert aus Blatt "Einstellungen" Zelle "E39" belegen
 Dim H_MatSt      as String : H_MatSt    = oTbEin.getCellRangeByName("F39").String						' Die String Var. "H_MatSt"    mit dem Wert aus Blatt "Einstellungen" Zelle "F39" belegen
 Dim H_MatNr      as String : H_MatNr    = oTbEin.getCellRangeByName("G39").String						' Die String Var. "H_MatNr"    mit dem Wert aus Blatt "Einstellungen" Zelle "G39" belegen

 oDlg_Dialog = CreateUnoDialog(oLib.getByName(DialogName))												' Den Zugriff auf den Dialog in der Variablen DialogName setzen
 DialogBreite = oDlg_Dialog.Size.Width																	' Die Breite des Dialoges auslesen und in die Var. Dialogbreite aufnehmen
 DialogHoehe = oDlg_Dialog.Size.Height																	' Die Höhe des Dialoges auslesen und in die Var. Dialoghöhe aufnehmen
 xPos = (BildBreite-DialogBreite)/2																		' Die x-Position des Dialoges aus der Differenz der BildBreite und der Dialogbreite dividiert durch 2 ermitteln und in die Var xPos aufnehemen
 yPos = (BildHoehe-DialogHoehe)/2																		' Die y-Position des Dialoges aus der Differenz der BildHoehe und der DialogHoehe dividiert durch 2 ermitteln und in die Var yPos aufnehemen
 oDlg_Dialog.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)			' Die x- ,die Y- Position; die Breite und die Höhe des Dialoges einsetzen
 
 'Die Button und Eingabefelder in Object Var. aufnehmen
 oTitel     = odlg_Dialog.model 																		' Der Titel des Dialoges "MatMeldung" wird in die Object-Var. "oTitel" aufgenommen  
 oOkButton1 = odlg_Dialog.getControl("CommandButton1")
 oOkButton  = odlg_Dialog.model.controlModels(0)														' Der "CommandButton1" "Material" Anlegen wird in die Object-Var "oOkButton" aufgenommen
 oAbButton  = odlg_Dialog.model.controlModels(1)														' Der "CommandButton2" "Abbrechen" wird in die Object-Var "oAbButton" aufgenommen
 oMatBez    = odlg_Dialog.getControl("MatBez")															' Das Feld "MatBez" wird in die Object-Var. "oMatBez" aufgenommen  
 oMatSt     = odlg_Dialog.getControl("MatSt")															' Das Feld "MatSt" wird in die Object-Var. "oMatSt" aufgenommen  
 oMatNr		= odlg_Dialog.getControl("MatNr")															' Das Feld "MatNr" wird in die Object-Var. "oMatNr" aufgenommen  
 
 'Die Textfelder (Labels) in Object Var. aufnehmen
 oTextAnweisg = odlg_Dialog.getControl("Label1")														' Das Feld "Label1" für die entspechende Anweisung     wird in die Object-Var. "oTextAnweisg" aufgenommen  
 oTextFehler  = odlg_Dialog.getControl("Label2")														' Das Feld "Label2" für die entspechende Fehlermeldung wird in die Object-Var. "oTextFehler"  aufgenommen  
 oTextBez     = odlg_Dialog.getControl("Label3")														' Das Feld "Label3" für die entspechende Fehlermeldung wird in die Object-Var. "oTextBez"     aufgenommen  
 oTextSt      = odlg_Dialog.getControl("Label4")														' Das Feld "Label4" für die entspechende Fehlermeldung wird in die Object-Var. "oTextSt"      aufgenommen  
 oTextEinheit = odlg_Dialog.getControl("Label5")														' Das Feld "Label5" für die entspechende Fehlermeldung wird in die Object-Var. "oTextEinheit" aufgenommen  
 oTextNr      = odlg_Dialog.getControl("Label6")														' Das Feld "Label6" für die entspechende Fehlermeldung wird in die Object-Var. "oTextNr"      aufgenommen  

 If Gmenu = "Anlegen" then
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))									' Aufruf der Funktion "SetHelpText"    zum Eintragen der Helptexte
	SetLabelEin_Aus(Array(oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,False,oTextEinheit,_
																			+False,oTextNr,False))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,57)													' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,False)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
	SetFocus(oMatBez)																					' Aufruf der Funktion "SetFocus" zum fokussueren eines Fekdes ausführen
 ElseIf Gmenu = "Aendern" then	
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))									' Aufruf der Funktion "SetHelpText"    zum Eintragen der Helptexte
	SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
																			+True,oTextNr,True))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,105)													' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
	SetFocus(oOkButton1)																					' Aufruf der Funktion "SetFocus" zum fokussueren eines Fekdes ausführen
 ElseIf Gmenu = "Loeschen" then	
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
																			+True,oTextNr,True))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetLabelDeaktiv_AKtiv(Array(oMatBez,False,oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,_
													+ False,oTextEinheit, False,oTextNr, False))		' Aufruf der Funktion "SetLabelDeaktiv_AKtiv" zum Sperren der EingabeFelder ausführen
	SetLabelHintergrund(Array(oMatBez,RGB(221,221,221),oMatSt,RGB(221,221,221), _
											 + oMatSt,RGB(221,221,221),oMatNr,RGB(221,221,221)))		' Aufruf der Funktion "Hintergrund" zum HintergundFarbe einstellen der EingabeFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,105)												' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 Else
	'Fehlerbehandlung entwickeln
 End If
 ' Den Key-Listener laden
 RegisterKeyListener																					' Den Listener "RegisterKeyListener" anmelden 
End Sub
und landet dann wieder in P_MatAnlegen um dann die Prozedur "Dialog_MatMeldung" zu starten

Code: Alles auswählen

Sub Dialog_MatMeldung																					' Prozedur zum Einstellen des Dialoges "MaterialMeldung"

 Dim oTitel        as Object																			' Die Object Var. "oTitel" deklarieren
 Dim DialogBreite  as Long 																				' Die Long Var.   "DialogBreite" deklarieren 
 Dim DialogHoehe   as Long																				' Die Long Var.   "DialogHöhe" deklarieren 
 Dim BildBreite    as Long    : BildBreite    = oTbEin.getCellRangeByName("E18").String					' Die Long Var.   "BildBreite"   mit dem Wert   aus Blatt "Einstellungen" Zelle "E18"  belegen
 Dim BildHoehe     as Long    : BildHoehe     = oTbEin.getCellRangeByName("E19").String  				' Die Long Var.   "BildHoehe"    mit dem Wert   aus Blatt "Einstellungen" Zelle "E19"  belegen
 Dim AnzButton     as Integer : AnzButton     = oTbEin.getCellRangeByName("U6").Value  					' Die Integer Var. "AnzButton"   mit dem Wert   aus Blatt "Einstellungen" Zelle "U6"   belegen
 Dim DialogAbbruch as Integer : DialogAbbruch = oTbEin.getCellRangeByName("R6").Value					' Die Integer Var. "DialogAbbruch"  mit dem Wert aus Blatt "Einstellungen" Zelle "R6"  belegen
 Dim TButton       as String  : TButton       = oTbEin.getCellRangeByName("V6").String					' Die String  Var. "TButton"     mit dem String aus Blatt "Einstellungen" Zelle "V6"   belegen
 Dim TButton1      as String  : TButton1      = oTbEin.getCellRangeByName("W6").String					' Die String  Var. "TButton1"    mit dem String aus Blatt "Einstellungen" Zelle "W6"   belegen
 Dim Titel         as String  : Titel         = oTbEin.getCellRangeByName("X6").String					' Die String  Var. "Titel"       mit dem String aus Blatt "Einstellungen" Zelle "X6"   belegen
 Dim TextZeile1    as String  : TextZeile1    = oTbEin.getCellRangeByName("Y6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "Y6"   belegen
 Dim TextZeile2    as String  : TextZeile2    = oTbEin.getCellRangeByName("Z6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "Z6"   belegen
 Dim TextZeile3    as String  : TextZeile3    = oTbEin.getCellRangeByName("AA6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "AA6"  belegen
 Dim TextZeile4    as String  : TextZeile4    = oTbEin.getCellRangeByName("AB6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "AB6"  belegen

 oDlg_Meldung = CreateUnoDialog(oLib.getByName("MeldungAusgeben"))										' Den Zugriff auf den Dialog "MeldungAusgeben" setzen
 DialogBreite=oDlg_Meldung.Size.Width																	' Die Breite des Dialoges auslesen und in die Variable Dialogbreite aufnehmen
 DialogHoehe=oDlg_Meldung.Size.Height																	' Die Höhe des Dialoges auslesen und in die Variable Dialoghöhe aufnehmen
 xPos = (BildBreite-DialogBreite)/2																		' Aus der Differenz der Bildschirm- und Dialogbereite die x-Position des Dailoges ermitteln und in die Variable xPos schreiben
 yPos = (BildHoehe-DialogHoehe)/2																		' Aus der Differenz der Bildschirm- und Dialoghöhe die y-Position des Dailoges ermittel nund in die Variable yPos schreiben
 oDlg_Meldung.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)			' Die x- und die Y- Position die Breite und die Höhe für den entsprechend anzuzeigenden Dialog einsetzen

 'Die Elemente im Dialog MeldungAusgeben in die Var. übernehmen
 oTitel      = odlg_Meldung.model 																		' Der Titel des Dialoges "MatMeldung" wird in die Object-Var. "oTitel" aufgenommen  
 oOKButton   = odlg_Meldung.model.controlModels(0)														' Der "CommandButton1" "Ok" wird in die Object-Var "oOkButton"  aufgenommen
 oOkButton1  = odlg_Meldung.model.controlModels(1)														' Der "CommandButton2" " "  wird in die Object-Var "oOkButton1" aufgenommen
 oTextZeile1 = odlg_Meldung.getControl("Label1")														' Das Feld "Label1" für die Meldungszeile1 wird in die Object-Var. "oTextZeile1" aufgenommen  
 oTextZeile2 = odlg_Meldung.getControl("Label2")														' Das Feld "Label2" für die Meldungszeile2 wird in die Object-Var. "oTextZeile2" aufgenommen  
 oTextZeile3 = odlg_Meldung.getControl("Label3")														' Das Feld "Label3" für die Meldungszeile3 wird in die Object-Var. "oTextZeile3" aufgenommen  
 oTextZeile4 = odlg_Meldung.getControl("Label4")														' Das Feld "Label4" für die Meldungszeile4 wird in die Object-Var. "oTextZeile4" aufgenommen  


 If AnzButton = 1 then																					' Wenn der Dialog "MatMeldung" nur den "Ok" Button hat
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
																  + oTextZeile4,TextZeile4))			' Aufruf der Funktion "SetLabelText" zum Belegne der TextFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton))															' Aufruf der Funktion "SetButtonLabel" zum Erstellen der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,40))																' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton1,False))															' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 ElseIf AnzButton = 2 then																				' Wenn der Dialo "MatMeldung" 2 Buttons hat
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
																  + oTextZeile4,TextZeile4))			' Aufruf der Funktion "SetLabelText" zum Belegne der TextFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton,oOkButton1,TButton1))										' Aufruf der Funktion "SetButtonLabel" zum Erstellen der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,7,oOkButton1,75))												' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True,oOkButton1,True))												' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 Else
	'Fehlerbehandlung entwickeln
 End If
 If DialogAbbruch = 0 Then																				' Wenn der Dialog "MaterialAnAeLoe" mit "Abbrechen" oder mit "x" geschlossen wurde
	SetLabelSchriftFarbe(Array(oTextZeile3,""))															' Aufruf der Funktion "SetLabelSchriftFarbe" zum Erstellen der Button-Beschriftung ausführen
 ElseIf DialogAbbruch = 1 Then																			' Wenn der Dialog "MaterialAnAeLoe" mit "Ok" geschlossen wurde
	SetLabelSchriftFarbe(Array(oTextZeile3,16728064))													' Aufruf der Funktion "SetLabelSchriftFarbe" zum Erstellen der Button-Beschriftung ausführen
 Else
	   'Fehlerbehandlung entwickeln
 End If
	
' odlg_Meldung.execute																					' Den Dialog "MeldungenAusgeben" anzeigen
' Meldung=1																								' Die Var. "Meldung" auf den Wert "1" setzen
End Sub
zu guter Letzt wird "P_MatAnlegen" dann beendet (*Vorläufig)

Ich hoffe so kann man es besser lesen
Gruss Dirk

Re: Eingabefelder in Dialog

von pcdirk91 » Di, 26.11.2019 14:11

Hi Marcel,
erstmal Danke für Deine Geduld. Ich wollte mich nur auf deine Antwort hin melden.
Ich denke ich bin an die ganze Sache falsch heran gegangen. uch habe mich hingesetzt und den Code soweit ich Ihn kannte bzw ais den Dokumentationen "im Internet" versucht zu verstehen. soll heussen, wenn ich auf ein Problem stoße veruche ich es aus Beispielen heraus zu lösen.
Die Dokumentation von "Andrew Pitonyak" hat 715 Seiten und diese komplett zulesen und begreifen fällt mir sehr schwer. Daher habe ich den oben beschriebenen Weg gewählt. Ist vieleicht faösch.
Meine Äußerungen wollte ich nur als Gedankenanstoß verstanden haben. Du solltest aus eigenem Interesse endlich diese Dokumentation lesen, weil es dir außerordentlich helfen würde.
Nicht falsch verstehen ich will ja verbessert werden. Ich bin für jeder Anregung dankbar.

Nun Konkret zu Deinen Anmerkungen:

Code: Alles auswählen

oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
+ " bestätigt werden."
Funktioniert ohne Fehlermeldung bei mir. Ich wolölte in dem String die Gänsefüßchen unten und oben haben. (Scheiss deutsche Ausnahme
Das mit dem "_+" habe ich mal getestet, und wie Du glaube ich auch geschrieben hast , miss ich das Plus nur bei Strings die durch den "_" getrennt werden einsetzen. *Werde ich überarbeiten.

zu der For Schleife:
"Andrew Pitonyak" hat im Punkt 3.9.9. For ... Next folgendes beschrieben

Code: Alles auswählen

For zähler = startwert To endwert [Step schrittWert]
Anweisungsblock1
[Exit For]
Anweisungsblock2
Next [zähler]
Die numerische Variable „zähler“
Daher bei mir das "next i" ich habe das ohne das i getestet und es funzt ==> wird geändert.

zu 2:
die Einrückungen sind bei mir immer drinnen wegen der Lesbarkeit, wie Du ja auch schreibst. Durch das Löschen der Kommentare in Writer sind die Verlorengegangen. Den Tip mit Code einführen wusste ich noch nicht . Ist in meinem Hirn abgespeichert
Den Punkt mit Set.Focus() ist richtig geht auch ohne Function. Ich habe dich nur so verstanden das SIe leichter lesbar ist als z.B. "oMatBez.setfocus"
Werde ich aber abändern.
Zu 3:
3) Ich finde gut, daß du Routinen jetzt mit einem erweiterten Funktionsumfang benutzt. Meine Anregungen waren aber nur Beispiele, die du mit kurzem Blick in die Dokumentation noch sehr viel effektiver machen kannst/solltest.
Das Array was ich dort Erstelle habe ich auf die Schnelle erstellt . Gute Idee das in eine Function zu packen. Aber dabei Habe ich noch eine Frage an Dich (sicherlich lapidar und irgendwo beschrieben; finde es aber nicht) Meine Idee war die Functionen in eine zu schreiben und dann je nachdem welche aufgerufen wurde zu dieser dann zu springen. Also praktisch eine Abfrage welche Function benötigt wird und dann genau zu diesem Punkt zu soringen. damit könnte man die Anzahl der Einträge der Functionen reduzieren. Was sagst du dazu??
Die Meldung wird hier immer angezeigt, egal was gedrückt wird? Ist dies so gewollt?
Ja das ist gewollt. Wenn man den Dialog "Material AnAeLoe" abbricht soll der Abbruch durch die Meldung angezeigt werden. Damit man Due Meldung entweder mit "x" oder mit "Ok" bekommt habe ich das so gelöst. Nicht gut???

Tut mir Leid das Du im Moment so viel um die Ohren hast. Ich freue mich wenn ich eine Antwort von Dir bekommen (und wenn es etwas Dauert dann ist es auch ok. Ich arbeite ja weiter an der Sache) Also mach DIr keinen Kopf. Ich hoffe es kehrt bald wieder mehr Ruhe bei Dir ein. Ich wünsche Dir eine erfolgreiche Zeit bis Du wieder antorten kannst.

Gruss Dirk

Nach oben