"Crash-Kurs BASIC und Dialoge"?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: "Crash-Kurs BASIC und Dialoge"?

Beitrag von marcel_at_work »

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
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: "Crash-Kurs BASIC und Dialoge"?

Beitrag von pcdirk91 »

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
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: "Crash-Kurs BASIC und Dialoge"?

Beitrag von pcdirk91 »

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
Antworten