Clean Code Development

Hinterlasse einen Kommentar

Auf dieser Webseite haben Ralf Westphal und Stefan Lieser ihre Überlegungen vorgestellt, was einen professionellen Softwareentwickler ausmacht.

Sie definieren dazu ein Wertesystem, Prinzipien und Praktiken. Die Prinzipien werden in sieben Gruppen (Graden) zusammengefasst, die man sukzessive für jeweils mindestens 21 Tage “lebt”. Die Grade werden dabei zyklisch durchlaufen, nach dem letzten Grad beginnt man also wieder mit dem ersten.

Ich werde versuchen, das Clean Code Development in meine Softwareentwicklungspraxis zu integrieren, auch wenn ich nur in sehr bescheidenem Umfang programmiere.

MS Access: Unicode-Zeichen per VBA erzeugen

Hinterlasse einen Kommentar

Unicode-Zeichen können in MS Access unter VBA mit der Funktion ChrW() erzeugt werden. Als Parameter übergibt man den Unicode-Wert.

Auf den erzeugten String können die üblichen String-Operationen angewendet werden, also z. B. sixSimaString=”6″  &  ChrW(963)  & “=”  &  sixSigmaWert .

Die Funktion zur Ermittlung des Unicode-Wertes eines Zeichens heißt  AscW().

Zumindest unter Access 2002 können Unicode-Zeichen, die keine ASCII-Zeichen sind, nicht im VB-Code-Editor angezeigt werden.

Personal Kaizen: das Now & Later Board für elektronische Notizen

Hinterlasse einen Kommentar

Seit langer Zeit benutze ich an meinem Arbeitsplatz den Windows-Texteditor Wordpad als elektronischen Notizzettel. Bei der Anmeldung in Windows wird über den Autostart gleich die Datei notizen.rtf geladen, in die ich alles hinein schreibe, dass ich mir kurzfristig aufheben möchte. Die angeboteten RTF-Formatieroptionen reichen mir dabei völlig aus.

Verschiedene Notizen trenne ich im Editor meist durch mehrere Leerzeilen, gefolgt von einer Zeile mit ein paar Minuszeichen für den Beginn einer neuen Notiz. Was mich schon immer etwas gestört hat, war die “Vermischung” von Notizen zu der Aufgabe, die ich gerade bearbeite, und Notizen, die diese Aufgabe nicht betreffen, die ich aber dennoch aufnehmen muss, weil beispielsweise jemand anruft oder bei mir vorbei kommt und mir etwas mitteilt.

Ich bin, als ich mir das Programm Vitamin-R ansah, über die offensichtliche Lösung für mein Problem gestolpert: das Now & Later Board. das im Wesentlichen ein Editor mit mehreren Tabs ist.

In Java habe ich mir diese Funktionalität nachprogrammiert.

Neben einfachen Formatierungsmöglichkeiten habe ich noch eine Funktion für das Leeren eines Notizblattes implementiert:

Alle Informationen zur aktuell bearbeiteten Aufgaben notiere ich auf dem Notizblatt jetzt, alles, was ich später noch erledigen muss, auf dem Notizblatt später, und den Rest auf dem Notizblatt Schmierzettel. Zwischen den verschiedenen Notizblättern kann ich mit Hotkeys wechseln. Um die Bedienung einfach zu halten, erfolgt das Laden und Speichern der drei Notizblätter automatisch.

Ich nutze mein Now & Later Board nun seit einigen Tagen und überlege, welche Funktionen ich noch einbauen könnte, um meinen “Notiz-Workflow” zu verbessern.

 

MS Access: sporadische #gelöscht-Anzeige in Unterformularen

Hinterlasse einen Kommentar

In einer MS Access-Anwendung, die ich geschrieben habe, werden in einem Formular in mehreren Registerkarten unter anderem zwei Unterformulare verwendet, welche die Ergebnisse von Datenbank-Abfragen erhalten. Beim Betätigen eines Buttons innerhalb des Formulars werden die Abfragen aufgefrischt und danach stets die erste Registerkarte, die keine Unterformulare enthält, selektiert.

Oftmals kommt es vor, dass nun in den Unterformularen einzelnen Spalten nach einer Auffrischung den Eintrag #gelöscht enthalten, während die anderen Spalten der Unterformulare korrekt aktualisiert werden. Da dieses Problem nicht immer auftritt, vermute ich hier eine Race Condition innerhalb von Access.

Da ich die wirkliche Ursache des Problems nicht lösen kann, behelfe ich mir mit folgendem Workaround:

Ich fange das Ereignis des Registerkartenwechsels ab und führe dann einen Refresh durch.

Private Sub Registerkarte_Change()
     Me.UF1_Abfrage.Requery
     Me.UF2_Abfrage.Requery
End Sub

Durch den erneuten, zeitversetzten Requery nach der ursprünglichen Aktualisierung tritt die Race Condition nicht mehr auf, und alle Spalten der beiden Unterformulare werden jetzt korrekt dargestellt.

 

 

MS Access: Standard-Menüleiste wieder herstellen

Hinterlasse einen Kommentar

Falls einmal die Standard-Menüleiste deaktiviert hat und sie über die GUI nicht mehr aktiviert bekommt, lässt sich sich in VBA mit den Befehl

Application.CommandBars("menu bar").Enabled=True

wieder einschalten.

Pomodoro-Anwendung ausgebaut

Hinterlasse einen Kommentar

Wie ich hier schrieb, habe ich meine ursprünglich in MS Access implementierte Pomodoro-Anwendung in Java neu geschrieben.

Inzwischen habe ich ein paar neue Features eingebaut.

Tagesplanung

  • ich habe jetzt Buttons mit Icons eingebaut
  • ein Fortschrittsbalken zeigt jetzt grafisch den “Abarbeitungsgrad” der für den Tag geplanten Aufgaben an
  • Aufgaben lassen sich nun markieren, z. B. als Most Important Tasks für den Tag
  • einige Felder lassen sich jetzt in der Tabelle editieren (die Felder, die nicht vom Programm verwaltet werden, also z. B. nicht die Anzahl der Unterbrechungen, denn diese wird nicht geplant)
  • Aufgaben können jetzt im Archiv noch nachträglich bearbeitet werden, incl. Neuberechnung der “historischen” Tageswerte
  • im Archiv wird nun auch die Serviceklasse mit angezeigt und auf Wunsch auch die Aufgaben in Abhängigkeit davon farblich unterlegt:

Archivansicht

Um mir die bisherige unkomfortable Konfiguration des Programms über eine XML-Datei zu ersparen, habe ich auch noch einen Konfigurationsdialog programmiert:

Konfigurationsdialog

Last, but not least gibt es nun auch eine Möglichkeit, wiederkehrende Aufgaben zu verwalten:

Wiederkehrende Aufgabe

Zur Zeit gibt es nur tägliche und wöchentliche Termine, monatliche möchte ich auch noch ergänzen.

Die Anwendung ist jetzt soweit gereift, dass ich sie sehr gut für meine Bedürfnisse einsetzen kann. Durch die kleinen und grösseren Problemen, auf die ich bei der Programmierung stieß, habe ich wieder eine Menge über Java gelernt und ich freue mich, dass mir die Arbeit an dem Programm durch das bereits erworbene Java-Wissen immer leichter fällt.

Pomodoro-Anwendung in Java neu geschrieben

1 Kommentar

Ich hatte mir ja eine eigene Pomodoro-Anwendung geschrieben, und zwar in MS Access, um rasch ein einsatzfähiges System zu haben.

In den letzten Tagen habe ich die Anwendung in Java neu implementiert, um plattformunabhängig zu sein, sprich: sie auch auf Mac OS X, FreeBSD und Linux nutzen zu können.

Ich habe dabei die Bedienung und die Datenbankstrukturen aus der Access-Anwendung  übernommen, mit der Abweichung, dass ich das in  Access noch separat vorhandene “Timer”-Fenster in das Fenster für die Tagesplanung integriert habe.

Die Daten werden in einer lokalen HSQLDB-Datenbank gehalten. Die grafischen Auswertungen habe ich über die Bibliothek JFreeChart realisiert. Hier war ich überrascht, wie schnell ich anhand von im Web gefundenen Code-Beispielen eigene, gut aussehende Grafiken erstellen konnte.

Hier sind einige Screenshots der Java-Anwendung, die hier gerade unter Mac OS X läuft:

laufendes Pomdoro

In der Tabelle sind alle Aufgaben für den Tag aufgelistet. Jede Aufgabe hat eine Aufgabennummer, die zur eindeutigen Identifikation eine Aufgabe dient und fortlaufend vom Programm vergeben wird. Wenn in der Spalte ungeplant ein Haken gesetzt ist, ist die entsprechende Aufgabe nicht morgens geplant worden, sondern überraschend während des Tages neu aufgekommen.  Für jede Aufgabe wird natürlich ihre Beschreibung angezeigt, sowie die Anzahl der geplanten und tatsächlich aufgewendeten Pomodori und die Zahl der Unterbrechungen. Erledigte Aufgaben werden entsprechend gekennzeichnet.

Über die Schaltfläche Neue Aufgabe lässt sich eine neue Aufgabe anlegen, über die Schaltfläche Aufgabe erledigt die aktuell markierte Aufgabe als erledigt markieren (zukünftig soll sich das durch einen Klick direkt in das Erledigt-Kästchen der entsprechenden Aufgabe bewerkstelligen lassen). Teilweise habe ich keine “echten” Buttons verwendet, sondern eingerahmte “Label”, da die Knöpfe sonst, je nach Betriebssystem, von Swing ziemlich unschön angeordnet werden.

Im Bereich darunter ist der “Timer” untergebracht. Über den Button “>” kann man einen Pomodoro für die markierte Aufgabe starten, mit “X” abbrechen. Mit dem Button “||” lässt sich eine Aufgabe kurzzeitig (z. B. 30 Sekunden) unterbrechen. Bei einer Unterbrechung beginnt ein Unterbrechungs-Countdown. Klickt man nicht während des Unterbrechungs-Countdowns noch einmal auf den Button “||”, wird der Pomodoro nach Ablauf des Countdowns als abgebrochen gewertet.  Über diesen drei Buttons wird die Restlaufzeit des aktuellen Pomodoro/der Pause/der kurzen Unterbrechung angezeigt, die auch noch einmal durch einen rückwärts laufenden Fortschrittsbalken visualisiert wird. Neben der Restlaufzeit wird die gerade bearbeitete Aufgabe angezeigt.

Per Doppelklick auf eine Aufgabe lässt sich diese bearbeiten. Der Dialog dazu sieht so aus:

Bearbeiten einer Aufgabe

Bearbeiten einer Aufgabe

Hier hat man auch die Möglichkeit, erfasste Ist-Werte (Anzahl geleisteter Pomodori, Unterbrechungen) noch zu korrigieren, falls man sich in der Tagesplanung “verklickt” hat. Für jede Aufgabe kann man auch aus eine vordefinierte Serviceklasse (Class of Service, CoS) auswählen, um später grob zu sehen, wofür man seine Arbeitszeit aufgewendet hat. Auch das Löschen einer Aufgabe ist über diesen Dialog möglich.

 

So sieht das Aufgabenarchiv aus:

Aufgabenarchiv

Im Aufgabenarchiv werden alle Aufgaben angezeigt, auch deren Erledigungsdatum. Das kann manchmal hilfreich sein, wenn man sich nicht mehr erinnert, ob und wann man etwas gemacht hat. Über den Anzeigefilter kann man die Trefferliste entsprechend einschränken.

 

Die Statistik über die geleisteten Pomodori und die Unterbrechungen sieht so aus:

Statistik geleistete Pomodori und Unterbrechungen

Statistik geleistete Pomodori und Unterbrechungen

Das ist die Darstellung der geplanten und ungeplanten Aufgaben:

Statistik geplante und ungeplante Aufgaben

Statistik geplante und ungeplante Aufgaben

Und so wird die Verteilung der geleisteten Pomodori auf die Serviceklassen präsentiert:

Verteilung nach Serviceklassen (CoS)

Verteilung nach Serviceklassen (CoS)

 

Als nächste Änderungen habe ich mir die Implementierung wiederkehrender Aufgaben vorgenommen, so dass die Aufgabenliste automatisch mit “Standard-Aufgaben” gefüllt wird.

 

 

 

 

NetBeans IDE: Schließen des Hauptfensters bei per GUI-Builder erstellen Swing-Anwendungen abfangen

Hinterlasse einen Kommentar

Ich habe angefangen, ein wenig in Java zu Programmieren, ohne eine systematische Einführung in diese Programmiersprache und die zugehörigen Bibliotheken, wie z. B. Swing, durchgearbeitet zu haben.

Ich stoße daher immer auf für den erfahrenen Java-Programmierer lächerliche Probleme, die mich oft viel Zeit der Recherche und des Probierens kosten. Damit andere Anfänger diese Probleme schneller lösen können, werde ich hier im Blog das ein oder andere Problem mit der Lösung veröffentlichen. Da ich ein Java-Anfänger bin, sind meine Lösungen wahrscheinlich oftmals “suboptimal”, aber sie haben für mich mein Problem gelöst. Den Auftakt bildet ein Problem bei per NetBeans-GUI-Bilder erstellten Anwendungen.

Bei Anwendungen, deren Benutzeroberfläche mit dem NetBeans-GUI-Builder Matisse erstellt wurden, kann man das Schließen des Hauptfensters auf folgende Weise abfangen:

In der entsprechenden AppView-Klasse fügt man einen Window-Listener (hier mit dem Namen Closer) hinzu:

public meineAnwendungView(SingleFrameApplication app) {
super(app);
initComponents();
getFrame().addWindowListener(new Closer());
(...)

 

 

In der gleichen Klasse schreibt man dann den Code für den Listener , aus dem man dann für das saubere Beenden seines Programms sorgen kann:

public void windowClosing(WindowEvent e) {
Programmlogik.programmende();  // hier den entsprechenden eigenen Aufruf eintragen

}

 

In “normalen” per Matisse erstellten GUI-Fenstern (JFrame-Formulare) lässt sich das Schließen abfangen, indem man ein Methode formWindowClosing(java.awt.event.WindowEvent evt) erstellt:

private void formWindowClosing(java.awt.event.WindowEvent evt) {
Programmlogik.programmende();  // hier den entsprechenden eigenen Aufruf eintragen


}

 

 

 

 

 

MS Access: Fehlermeldung über mangelnden Speicherplatz

Hinterlasse einen Kommentar

In den letzten Tagen habe ich in einer selbsterstellten Access-Anwendung die Fehlermeldung “Nicht genügend Speicherplatz, um diese Operation durchzuführen. Schließen Sie Anwendungen, die Sie nicht benötigen, und versuchen Sie es noch einmal.” erhalten. Meine Versuche, die Fehlerursache einzugrenzen, blieben erfolglos.

Nachdem ich im Internet über die Probleme von Access mit der Speicherverwaltung gelesen habe, prüfte ich meinen Programmcode und gab allozierten Speicher, z. B. für ADODB.RecordSet-Objekte am Ende einer Sub/Function jeweils explizit frei (Set Variable = Nothing). Damit konnte ich mein Problem nicht lösen.

Geholfen hat schließlich, eine neue MDB-Datei anzulegen und alle Tabellen, Formulare, Abfragen, Berichte, Makros und Codemodule aus der alten MDB-Datei zu importieren. Danach erschien die Fehlermeldung nicht mehr.

Zu beachten ist, dass man gegebenenfalls für die neue MDB-Datei auch alle Verweise (im Code-Editor unter Extras/Verweise) neu setzt und auch unter dem Menüpunkt Extras die gewünschten Einstellungen vorzunehmen.

MS Access: Feldnamen für den Zugriff auf Felder in Formularen dynamisch erzeugen

Hinterlasse einen Kommentar

MS Access bietet die Möglichkeit, Feldnamen für den Zugriff auf Formulare dynamisch zu erzeugen, konkret einen String mit dem gewünschten Feldnamen zur Laufzeit zusammenzusetzen.

Dies ist beispielsweise hilfreich,  falls in einem Formular “durchnummerierte” Felder, z. B. Betreff1, Betreff2, Betreff3 verwendet werden. Mit folgendem Code lassen sich beispielsweise alle 30 Betreff-Felder im Formular AV_Lanes_Anzeigen leeren:

For i=1 to 30
Forms!AV_Lanes_anzeigen("Betreff"&i).Caption = ""
Next i

Ältere Artikel

Follow

Bekomme jeden neuen Artikel in deinen Posteingang.