Hallo Julia,
Ich scheu mich ein wenig, die Datei hochzuladen, da mir noch recht viel Grundlagenwissen fehlt und sie gar nicht fertig oder aufgeräumt ist...
Nur keine Panik. Niemand verlangt das man ein ausgebildeter Meister in der Makro Programmierung ist. Denn wenn dem so wäre könnten wir hioer die Bude ja dicht machen
Das dir noch einiges an Grundlagenwissen fehlt habe ich gesehen, und werde gleich mal etwas dagegen tun. Und dazu fangen wir gleich am Anfang des Makros an.
Code: Alles auswählen
Dim Ctl_Artikelnummer, Ctl_Anzahl, Ctl_Rabatt, Ctl_Preis as Object
Auch wenn es bei den Elementen in Dialogen nicht ganz so schlimm ist, solltest Du diese Art der Variablen
Deklaration in StarBasic grundsätzlich vermeinden, egal ob es sich um Elemente in einem Dialog oder um einfache Stringvariablen oder sonstiges handelt. Jede zu deklarierende Variable muss mit ihrem dazugehörigen Typ einzeln deklariert werden. Macht man dies nicht, so wird der Variablen automatisch der Typ VARIANT zugewiesen, was mit unter später einmal zu größeren nicht zu verstehenden Problemen führen kann.
Also richtig wäre jetzt folgendes.
Code: Alles auswählen
Dim Ctl_Artikelnummer as Object, Ctl_Anzahl as Object, Ctl_Rabatt as Object, Ctl_Preis as Object
Ach ja, da fällt mir grad eben ein, das ich es durchaus gesehen habe das die Datei einen Excel Hintergrund hat. Ich weiß blos nicht ob sie zwischenzeitlich mal in Excel bearbeitet wurde, oder dort sogar erstellt wurde. Aber um noch weitere Komplikationen auszuschließen würde ich zu sehen das die Datei keinen Kontakt mehr mit Excel hat, weil hier schon einige male von Problemen berichtet wurden die genau damit zu tun hatten. Und deshalb mein Rat, auch wenn es nervt und schmerzt; komplett neu machen und dann einen großen Bogen um Excel machen.
NEIN! Ich will Excel nicht schlecht reden oder madig machen, das liegt mir fern, sondern nur auf Probleme hinweisen die durchaus entstehen können.
Nächster Teil.
Du hast
Code: Alles auswählen
DialogLibraries.loadLibrary("Standard")
oForm = DialogLibraries.Standard.Dlg_Artikel
Dlg_Artikel = CreateUnoDialog(oForm)
was so auf den ersten Blick zu funktionieren scheint. Aber man kann es auch ein wenig übersichtlicher gestalten, was dann so aussieht.
Code: Alles auswählen
DialogLibraries.loadLibrary("Standard")
Dlg_Artikel= CreateUnoDialog(DialogLibraries.Standard.Dlg_Artikel)
Ist wohl Geschmacksache, aber dennoch schlage ich das mal vor.
Weiter.
Es geht um den Dialog "Dlg_Flaschen". Es wird immer "Preis" zuerst angesteuert. Es könnte mit dem Namen zusammenhängen, denn wenn ich "Preis" nach oben setze und umbenenne und ein anderes Eingabefeld nach unten und es ebenfalls umbenenne (in "Preis"), wird wieder "Preis" (jetzt unten) zuerst angesteuert.
Ach Du meinst mit "Preis" das Element welches der Variablen
Ctl_Preis zugewiesen wird. Sorry, aber aus diversen Gründen habe ich momentan ein Knick in meinem Hirn (hat nix mit dir zu tun).
Eine Fehlerquelle in diesem Zusammenhang könnte sein, dass es in einem anderen Modul/Dialog auch das Element "Preis" gibt (nee, nä?). Nur so eine Idee.
Wegen meinem besagtem Knick, sage ich das jetzt mal so.
Nicht richtig, nicht falsch, aber es scheinen da noch andere Faktoren eine Rolle zu spielen. Wobei deine Vermutung "anderes Modul" ein wichtige Rolle spielt.
Oh je! Jetzt muss ich doch wieder etwas weiter ausholen.
Also etwas allgemeines.
Die Ablaufsteuerung von Dialogen muss man sich erstmal verinnerlichen. Sie kann manchmal voller Tücken sein.
Du rufst so gesehen ein "Hauptdialog" auf -{Dlg_Artikel}-, und von dort rufst Du dann wieder verschiedene Einzeldialoge auf: Dlg_Flaschen, Dlg_Korrektur ....
Jeder dieser Dialoge ist ein eigenständiger Dialog, der ja dementsprechend defeniert werden muss, was Du ja mit dem oben gezeigten Beispiel {mit meiner alternative} ja auch machst.
Jedoch deklarierst Du die einzelnen Dialoge in einem anderen Modul in einer eigenständigen Sub. Und das kann zu Problem führen, bei dieser vorgehensweise, da es vorkommen kann das die deklarationen und defenitionen noch gar nicht alle abgeschlossen sind, aber der Dialog schon so gesehen bereit steht. Und was noch viel schlimmer ist, einmal deklarierte Variablen werden wieder neu derklariert, und auch das kann problematisch werden.
Und deshalb schlage ich vor, das Du diese Konzept noch mal überarbeitest. Ich zeige dir wie ich das meine.
Als erstes werden ALLE Variablen im Hauptmodul *Artikel* deklariert.
Code: Alles auswählen
' Blatt'
Dim oSheet as Object
' Dialoge'
Dim Dlg_Artikel as Object, Dlg_EP as Object, Dlg_ID as Object, Dlg_Korrektur as Object
Dim Dlg_Flaschen as Object
' Elemente'
Dim Ctl_Artikelnummer as Object, Ctl_Anzahl as Object, Ctl_Rabatt as Object, Ctl_Preis as Object
Dim Ctl_ID as Object, Ctl_EP as Object, Ctl_Fuellmenge as Object
' Zahlen'
Dim End_Row as integer, ID as Integer, RowIndex as integer, End_Row as integer
Dim RefID as integer, Val_ID as integer, i as integer
Dim Val_Rabatt as Single, ID as integer
' Glaub kaum das dies gebraucht wird, das "Global..."
' Global ID as integer'
Das einfache Anführungszeichen ' heißt nix anderes als REM.
In den Modulen *Artikel_Korrektur* und *Flaschenverkauf* löscht Du die Variablen deklaration. Die brauchst Du dort nicht mehr, da sie jetzt in allen Modulen zur Verfügung stehen.
Nächster Schritt.
Anstatt in jedem Modul einen Dialog zu defenieren, werden jetzt alle Dialoge in der
Sub Dlg_Neuer_Artikel im Modul *Artikel* defeniert.
Code: Alles auswählen
DialogLibraries.loadLibrary("Standard")
Dlg_Artikel= CreateUnoDialog(DialogLibraries.Standard.Dlg_Artikel)
Dlg_ID = CreateUnoDialog(DialogLibraries.Standard.Dlg_ID)
Dlg_Korrektur= CreateUnoDialog(DialogLibraries.Standard.Dlg_Korrektur)
Dlg_EP = CreateUnoDialog(DialogLibraries.Standard.Dlg_EP)
Dlg_Flaschen= CreateUnoDialog(DialogLibraries.Standard.Dlg_Flaschen)
Und nun noch die defenition der einzelnen Elemente.
Code: Alles auswählen
Ctl_Artikelnummer = Dlg_Artikel.GetControl("Artikelnummer")
Ctl_Anzahl = Dlg_Artikel.GetControl("Anzahl")
Ctl_Rabatt = Dlg_Artikel.GetControl("Rabatt")
Ctl_ID = Dlg_ID.GetControl("ID")
Ctl_Artikelnummer = Dlg_Korrektur.GetControl("Artikelnummer")
Ctl_Anzahl = Dlg_Korrektur.GetControl("Anzahl")
Ctl_Rabatt = Dlg_Korrektur.GetControl("Rabatt")
Ctl_EP = Dlg_EP.GetControl("Preis")
Ctl_EP.setfocus()
[....]
Da mir gleich die Augen zufallen, mache ich an dieser Stelle jetzt nicht weiter, das machst Du.
Wichtig ist nur, das bevor der Dialog *Dlg_Artikel* durch
Dlg_Artikel.execute ausgeführt wird, alle Variablen defeniert wurden.
Da die Variablen öffentlich deklariert wurden und in dieser Sub VOR dem Dialog ausführen auch defeniert wurden, stehen sie nun in jedem Modul zur Verfügung. Das heißt, sie dürfen nicht in den anderen Modulen erneut deklariert und defeniert werden, sonst gibts wieder Probleme.
Was mir grad eben noch aufgefallen ist, ist das hier, Beispielsweise.
Du setzt den Fokus auf das "Numerische Feld"?
Und zwei Zeilen weiter.
Und erst danach wird der Dialog ausgeführt.
Vermute ich richtig, das dies ein Überbleibsel von deinen Versuchen ist die Aktivierungsreihenfolge "auf die Reihe zu bekommen"?
Wenn ja, kann dies natürlich auch zu Problem führen. Denn bevor der Dialog ausgeführt wird, bekommen zwei unterschiedliche Elemente den Fokus nacheinander zugesprochen. Ich kann mir nicht vorstellen das Calc damit zu recht kommt. Also lösche das mal.
Wenn Du meine vorgeschlagenen Änderungen eingebaut hast, hänge dann das Ergebnis wieder hier an und berichte wie sich die datei verhällt. Vermutlich müssen wir noch ein paar Dinge abändern.
Ach ja, die geänderte Datei kannst Du dann auch entschlacken in dem Du die Blätter 1 bis 30 löscht.
Geh ins Bett
balu