Posts Tagged ‘Fehler’

Lizenzierung Teil 3

Montag, November 28th, 2011

Mit der ab heute verfügbaren Version 2.0.0.31, ist das Lizenzsystem endlich abgeschlossen. Dafür, das ich darin möglichst wenig Arbeit stecken wollte, hat es mich doch eine ganze Weile beschäftigt. Dabei sind mir Inhalte eigentlich wichtiger, als so verwaltungstechnischer Kram. Aber nun ist es ja abgeschlossen und wird mich hoffentlich nicht so schnell wieder belästigen.

Der wichtigste Änderungspunkt an der neuen Version ist wohl, das ich Änderungen an der Datenbankstruktur vorgenommen habe. Ihr müsst also einmal wieder eure Datenbank aktualisieren oder neu erstellen. Die Änderungen werden zum Großteil in der aktuellen Version noch nicht genutzt. Sie sind hauptsächlich für die nächsten Punkte bestimmt, die ich im kommenden Jahr implementieren will. Ich möchte aber, das wenn ihr die stabile Software Version einsetzt, möglichst lange auch die Testversionen probieren könnt, ohne das ihr 2 verschiedene Datenbanken benötigt.  Theoretisch sollte dies jetzt auch die letzte Datenbankänderung sein, die per MySQL-Tools erledigt werden muss. Demnächst werde ich ein kleines Tool schreiben, mit dem ihr die Datenbankänderungen bequemer vornehmen könnt.

Bei der Fehlerkorrektur habe ich auch ein gutes Stück geschafft. Sogar einen hässlichen Totalabsturz, der bei einem fehlerhaften EXIF-Header auftrat konnte ich beseitigen. Entgegen meiner Ankündigung, das keinerlei neue Funktionen zu erwarten sind, habe ich 2 Kleinigkeiten umgesetzt, welche die Nutzbarkeit des Programmes doch merklich steigern.

Zum ersten kann nun, wenn der Eingabefocus auf einer der Bildkomponenten liegt, der Vollbildmodus mit der „Enter“ Taste geöffnet werden. Dadurch ist es nun möglich, das man den Vollbildmodus komplett per Tastatur bedienen kann. Die zweite Kleinigkeit betrifft die Sortierung der Bilder in den Bildlisten. Bisher war es so, das nach dem Programmstart eine Standardsortierung (Bildname aufsteigend) aktiv gewesen ist. Wollte man dauerhaft die Bilder anders sortiert haben, so musste man nach jedem Programmstart seine Wunschsortierung wieder einstellen. Nun ist es so, das beim Beenden des Programmes die aktive Sortierung gespeichert und beim nächsten Programmstart wieder aktiviert wird.

Zur Zeit sieht es danach aus, als wenn die nächste Updatemeldung hier für die erste stabile Version reserviert ist. Die Anzahl der gefundenen Fehler hält sich in Grenzen und es sind nur noch wenige Sachen an der Homepage zu erledigen. Ich hoffe, das es in 2-3 Wochen gut zu schaffen ist.

Fehler in TShellTreeView, TShellComboBox und TShellListView

Samstag, April 30th, 2011

Meinen letzten Artikel, den ich einem Delphi-Problem gewidmet habe, liegt schon einige Monate zurück. Da ich beim Testen auf ein größeres Problem gestoßen bin und auch recht lange gebraucht habe um das Problem zu lösen, bietet es sich an, die Lösung des Problemes hier vorzustellen.

In Delphi 2005 gibt es 2 Sets an Komponenten, die es ermöglichen, einen Dateiauswahl-Dialog recht schnell zusammenzubauen. TDriveCombobox, TDirectoryListBox und TFileListbox sind noch aus den guten alten Windows 3.1 Zeiten vorhanden. Von der Optik her würde ich heute diese Komponenten nicht mehr einsetzen. Als zweites Set haben TShellTreeView, TShellComboBox und TShellListView in der Komponentenliste Platz gefunden. Allerdings werden sie etwas stiefmütterlich behandelt und befinden sich in meiner Delphi 2005 Version nur unter der Komponentenkategorie „Beispiele“.

Im BVASystem habe ich den TShelltreeview und die TShellComboBox genutzt, um den Dialog zur Auswahl des Dateinamens zur Speicherung eines Fotoindexes zu realisieren. Beim Testen ist mir dann aufgefallen, das die Komponenten unter Windows XP für Verzeichnisse, die auf einer CD liegen, teilweise falsche Pfadangaben zurückgeben.  Es werden nur dann richtige Pfadangaben geliefert, wenn das Verzeichnis kein Unterverzeichnis ist. „D:\Bilder\“ klappt also, während für „D:\Bilder\2011-04-29\“  nur „D:\Bilder\“ zurückgegeben wird.

Ok, für die Auswahl eines Speicherortes kann man wohl getrost auf das CD-Rom Laufwerk verzichten. Aber da ich vor habe, die Komponenten auch anderweitig zu verwenden, hat mich das Problem nicht mehr losgelassen.

Die Ursache des Problems konnte ich in der Klasse TShellFolder und dort genau in der Funktion „PathName“ finden. Zur Korrektur des Fehlers muss die Funktion, die sich in der „ShellCtrls.pas“ befindet, folgendermaßen geändert werden:

function TShellFolder.PathName: string;
begin
 result := GetDisplayName(ParentShellFolder, FPIDL, SHGDN_FORPARSING);
 //Result := GetDisplayName(DesktopShellFolder, FFullPIDL,  SHGDN_FORPARSING );
end

Wenn man dann die „ShellCtrls.pas“ schon offen hat, bietet es sich auch an, gleich ein paar Speicherlecks, die die Komponenten haben, zu schließen. Wie die Speicherlecks beseitigt werden, könnt ihr in der QualityCentral von Embarcadero nachlesen. Dort hat Brad Prendergast seine Lösung detailiert in den Kommentaren beschrieben.

Kein Datenträger

Mittwoch, Oktober 20th, 2010

Schon in der Version 1.x des BVASystems ärgerte ich mich über einen Fehler, den ich nicht wirklich nachvollziehen bzw. beheben konnte. Gestern trat dieser dann auch bei der neuen Software auf.

Beim Einlesen des Verzeichnisbaumes wird überprüft, ob sich auf den Laufwerken des Computers Unterverzeichnisse befinden. Auch auf Wechseldatenträgern muss der Versuch gestartet werden, die Unterverzeichnisse einzulesen, da es keine andere Möglichkeit gibt, herrauszufinden ob sich ein Datenträger im Laufwerk befindet. Die Funktion ist seit der ersten Version des BVASystems 2.0 unverändert in der Software enthalten. Gestern zeigte sich ein Fehlerdialog mit der Aufschrift: „Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger in Laufwerk … ein.“

Diese Fehlermeldung erschien im BVASystem, wenn sich in einem Laufwerk kein Datenträger befand.

Fehlerdialog: Kein Datenträger

Auf meinem Testrechner machte sich der Fehler durch einen anderen Fehlerdialog bemerkbar. Dort kam es zu einer „Exception Processing Message c0000013“. Ohne die Überschrift hätte ich nicht verstanden, was die Fehlermeldung mir sagen will.

Auf dem Testrechner sah die Fehlermeldung dagegen so aus.

Exception: Kein Datenträger

Ich stellte fest, das die Fehlermeldung aufgetreten war, nachdem ich am Entwicklungsrechner den Kartenleser genutzt hatte, um die Bilder meine Digitalkamera auf den Rechner zu spielen. Nach einem Neustart des Rechners und einer anschließenden Neuübersetzung der Bilddatenbank war der Fehler wieder weg. Da ich meinen Kartenleser gerne weiterbenutzen will, ohne ständig den Rechner neu zu starten, suchte ich weiter.

Durch die weitere Recherche kam ich dann auf die Windowsfunktion „SetErrorMode“. Mit ihr kann eingestellt werden, wie das Betriebssystem auf bestimmte Fehler reagieren soll. Meine Vermutung ist, das der Treiber meines Kartenlesers diesen „ErrorMode“ verstellt hat und daher die Fehlermeldungen angezeigt wurden.

Unterbinden lassen sich die Fehlermeldungen nun ganz einfach dadurch, das der „ErrorMode“ auf SEM_FAILCRITICALERRORS setzt. Die Problemlösung sieht also wie folgt aus:

var OldErrorMode: Integer;
 begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
   ReadDirectorys();
  finally
  SetErrorMode(OldErrorMode);
  end;
 end;

Der gefürchtete Fehlerfall

Dienstag, Oktober 12th, 2010

Eine sehr unangenehme Seite der Softwareentwicklung ist, das es quasi unmöglich ist, ein fehlerfreies Programm zu schreiben. Mit diesem Wissen im Hinterkopf muss man auch daran denken, wie man mit Fehlern umgehen wird. Im BVASystem gibt es zum Beispiel eigentlich ab der ersten Version, die es hier zum Download gab,  eine  Trace-Funktionalität.

Startet man die Anwendung mit dem Parameter „-trace“, werden die einzelnen Funktionsaufrufe, die das Programm ausführt, in eine Datei protokolliert.  Die Trace-Datei „bvatrace.log“ findet man dann im Anwendungsverzeichnis des BVASystems. Im Fehlerfall kann mir diese Datei dann zugeschickt, oder im Bugtracker hochgeladen werden.

Neu in der nächsten Version ist, das es einen aussagekräftigen Dialog gibt, wenn ein unerwarteter Fehlerfall auftritt. In den bisherigen Versionen war es so, das dort der Anwender ein schlichtes „Es ist ein unbekannter Fehler aufgetreten.“ angezeigt bekommen hat. Auch wenn der Anwender mit der Fehlermeldung nicht wirklich etwas anfangen kann, so wird er trotzdem nicht gänzlich ohne Informationen im Regen stehen gelassen. Ab sofort wird der Dialog wie folgt aussehen:

Nullpointer-Exception Dialog

Nullpointer-Exception Dialog

Eigentlich habe ich den Dialog bisher immer mit einer Division durch 0 getestet. Aber extra für Lord-Fake, der die Homepage http://www.nullpointer.at betreibt, hab ich die Testroutine nochmals angepasst. Bitte Fake :-D

MySQL server has gone away.

Montag, August 2nd, 2010

Gestern abend wollte ich zum ersten mal ein Bild mit dem neuen BVASystem in einer MySQL-Datenbank abspeichern. Eigentlich dachte ich, das dies mittlerweile keine allzu große Hürde sein sollte. Aber ich wurde eines besseren belehrt. Der Server beantwortete mein SQL-Query mit:

MySQL server has gone away.
MySQL Fehler

Zuerst grübelte ich einen Moment darüber nach, wohin mein MySQL Server am Sonntag abend so gehen könnte. Da ich zu keinem Ergebnis kam, fragte ich Google nach der Bedeutung der Fehlermeldung. Ursache für die Fehlermeldung war, das die maximal erlaubte Größe des Querys überschritten gewesen ist.

Zur Behebung des Fehlers musste ich einfach in der Einstellungsdatei „my.ini“ meines MySQL Servers, den Wert von max_allowed_packet vergrößern. Einmal noch schnell den Server neugestartet und schon war der Server zurück von seinem Sonntagsausflug.