Meine erste verkaufte Anwendung
Was immer wieder zu verwunderten Nachfragen bei Personalern führte, war ein Eintrag in meinem Lebenslauf, der wie folgt aussah:
Jun. 2002 - Erste verkaufte Anwendung, erstellt mit Borland Delphi 6
Datenbankanbindung (dBase IV) und –Web-Upload für Sage „GS-Auftrag“ als Schnittstelle zu einem PHP-Webshop für ein mittelständisches bayerisches Unternehmen auf dem Gebiet der Hydraulik- und Forsttechnik.
Inzwischen habe ich mich entschlossen, diesen Eintrag ersatzlos zu streichen, möchte über diese ungewöhnliche Geschichte dennoch bloggen.
SMSAlerter 0.2 USV- und Akkualarm via SMS
2008 schrieb ich eine Anwendung die einem Windows Serveradministrator den Versand von SMS bei einem niedrigen USV-Akkustand ermöglichte. Sie ist denkbar einfach aufgebaut: die USV muss als Akku im System installiert sein, dies ist ein Standard und bei allen mir bekannten Herstellern der Fall. Ebenfalls muss ein AT-Hayes kompatibles GSM-Modem (zB ein Handy, verbunden via USB oder COM) netzfähig sein - eine UMTS-Karte ist ebenfalls einsatzfähig.
Der SMSAlerter 0.2 prüft regelmäßig den Ladezustand der Akkus und sendet bei eintreffen eines definierten Zustandes eine SMS über das Handy an einen Empfänger.
Großhochzeit: C#, Delphi, Assembler und COM
Ein Feature das mit großer Wahrscheinlichkeit in zukünftigen Versionen von .NET noch implementiert werden wird, ist (managed/inline-) Assembler in seine Projekte einzubinden. In einigen Hochsprachen mit "echtem" Compiler ist dies bereits seit vielen Jahren Standard: C++, TurboPascal, FreePascal, Delphi, freeBASIC, usw.
Zudem findet man in alten mächtigen Source-Code-Archiven oft bis zur Perversion optimierte Algorithmen, die der Autor bereits in Inline-ASM implementiert hat. Es wäre doch zu schade diese nicht weiter nutzen zu können...
Folgenden Code fand ich im SwissDelphiCenter:
http://www.swissdelphicenter.ch/de/showcode.php?id=2049
(Ein Instring-Algorithmus von Vanja Fuckar, 100% inline-ASM)
Delphi: Winamp-Titel auslesen
Um mit Delphi den aktuellen Winamp-Titel auszulesen benötigt man nur eine kleine Funktion. Der Zugriff erfolgt über die WinAPI.
function GetWinampFilename(): String; var hwndWinamp, ProcessHandle: THandle; dat2: array[0..500] of Char; temp, MPointer: Cardinal; begin //Bitte nicht wundern, die Fensterbezeichnung ist korrekt und funktioniert bei allen Winamp-Versionen: hwndWinamp:=FindWindow('Winamp v1.x',nil); MPointer:= SendMessage(hwndWinamp,WM_USER,SendMessage(hwndWinamp,WM_USER,0 , 125), 212); GetWindowThreadProcessId(hwndWinamp,ProcessHandle); hwndWinamp:= OpenProcess(PROCESS_ALL_ACCESS,False,ProcessHandle); ReadProcessMemory(hwndWinamp, Pointer(MPointer), @dat2,500,temp); CloseHandle(hwndWinamp); Result:= String(dat2); end;
Parse/Split in Delphi 6
Ein großes Manko an Delphi (bis zur .NET-isierung) war/ist eine fehlende Funktion für das zuverlässige und schnelle Parsing von Strings. Folgende Funktion begleitet mich bereits seit 2002 durch fast alle Delphi-Projekte:
function Parse(Char, S: string; Count: Integer): string; var I: Integer; T: string; begin if S[Length(S)] <> Char then S := S + Char; for I := 1 to Count do begin T := Copy(S, 0, Pos(Char, S) - 1); S := Copy(S, Pos(Char, S) + 1, Length(S)); end; Result := T; end;