Posts mit dem Label Programmierung werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Programmierung werden angezeigt. Alle Posts anzeigen

9.20.2016

Sicherer Filename

VB:


Imports System.IO

Namespace Helper

    Public Class FileNameHelper
        Public Shared Function GetSafeFilename(filename As StringAs String
            Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars()))
        End Function
    End Class
End NameSpace

c#

public string GetSafeFilename(string filename) 

return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); 
}

Kopierversionen:

Imports System.IO Namespace Helper Public Class FileNameHelper Public Shared Function GetSafeFilename(filename As String) As String Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars())) End Function End Class End Namespace

public string GetSafeFilename(string filename) { return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); }

11.11.2015

Singelton in C#

#region Singleton
       private static xxx _instance;

       private xxx() { }

       public static xxx Instance
       {
           get
           {
               if (_instance == null)
               {
                   _instance = new xxx();
               }
               return _instance;
           }
       }
       #endregion

5.08.2012

Oldi but goldi: Active-X Registrierung per Kontextmenu

Folgenden Text in eine Textdatei einfügen:

REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------


Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.

Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.

Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx

11.02.2010

Splash-Screen-Problem in VB.Net

Problem: Ein Formular das nach einem Splash-Screen gezeigt werden soll und nicht das Hauptformular ist (z.B. Login) erhält nicht den Fokus.

Lösung:
private m_FormLoaded as boolean



Private Sub frmLogin_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    m_FormLoaded = True

    txtUserID.Text = String.Empty
End Sub

Private Sub txtUserID_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtUserID.GotFocus
'This hack ensures that the user id field receives focus.
'For some reason it appeared to have focus however was not responding until
'user clicked on the Form!

    If m_FormLoaded = False Then
        System.Windows.Forms.SendKeys.Send(ControlChars.Back)

        txtUserID.Text = String.Empty

    End If
End Sub
Quelle:
http://bytes.com/topic/visual-basic-net/answers/638041-application-startup-event-splash-login-screens

5.31.2010

.NET-Zauberzeug

System.Diagnostics.Process.Start (BefehlAlsString)
scheint der extrem leistungsfähige Nachfolger des Shell-Befehls zu sein. Egal ob Excel, Word, Bild, Video, HTML-Adresse oder "mailTo"-Anweisung. Es wird immer das Programm gestartet dass unter Windows mit dem Dateityp verbunden ist.

Zauberzeug!

11.17.2009

Duck-Tape-Programming und Clean-Code

Als auf der letzten PRIO der Begriff "Duck-Tape-Programming" fiel konnte ich mir sofort was drunter vorstellen - wer könnte das nicht.

Natürlich wurde diese Art der Programmierung als unprofessionell und schlecht gebrandmarkt.

Natürlich?? Warum eigentlich?

Wenn ich Duck-Tape höre fällt mir als erstes der Rally-Sport ein. Hier vollbringen Mechaniker mit Duck-Tape wahre Wunder. Für den Laien völlig zerstörte Fahrzeuge werden mit Duck-Tape, Draht und Spuke wieder zusammen geflickt, bestehen noch die nächste Prüfung und vielleicht gewinnt das Team sogar noch die Rally.

Arbeiten diese Mechaniker unprofessionell?
Sind sie schlecht?
Nein, schlecht sind sie garantiert nicht. Die besten Mechaniker schaffen es vielleicht mal Rally-Mechaniker zu werden.

Sie arbeiten nur unter sehr ungewöhnlichen Bedingungen. Ihre Arbeit erfolgt unter enormen Zeit- und Erfolgsdruck mit einem Ergebnis das nur eine sehr begrenzte Zeit durchhalten muss.

Den Gegenpart bildet der Mechaniker in der Werkstatt in die der Familienvater sein Auto bringt: Hier erwarten wir dass in Ruhe ein Ergebnis erzielt wird das "ewig" hält. Niemand will eine Reperatur die zwar schnell geht aber nur circa 100 km hält.

Und hier sehe ich den Zusammenhang zu unserer Arbeit: Die meisten Entwickler (wie auch die meisten Kfz-Mechaniker) arbeiten in einer "Werkstatt" in der es auf Zuverlässigkeit, Langlebigkeit und Robustheit ankommt. Und somit sollten sie so sauber und sorgfältig wie nur irgend möglich arbeiten. Das Ziel sollte immer das bestmögliche und bestwartbare Produkt sein.

Immer mal wieder ist aber auch eine Rally angesagt:
Wenn der Vorstand JETZT Zahlen haben will die einmalig für diesen Forecast gebraucht werden (für den nächsten gelten eh wieder andere Regeln) und man somit "Wegwerf"-Software baut oder Software JETZT um eine ganz spezielle Funktion erweitert werden muss für die Präsentation HEUTE NACHMITTAG - dann ist "Dranflicken" und Improvisieren angeagt. Duck-Tape-Programming ist dann angesagt - ob wir es so nennen oder nicht.

Aber wie auch bei jeder Rally sollte man nicht die Vor- und Nachbereitung vergessen! Rally-Teams bereiten sich mit einem ungeheuren Aufwand von Zeit und Geld auf die extremen Phasen vor. Und jede dieser Phasen wird hinterher ausgewertet und fließt in Verbesserungen und Veränderungen des Fahrzeugs ein.
Und auch das sollten wir uns zum Vorbild nehmen: Nach der letzten Wertungsprüfung alle mit Tape angeklatschten Teile abreißen und die Ursache analysieren warum sie abgerissen sind. Und diese Ursachen dann beheben.

Und damit sind wir wieder in unserer Werkstatt und arbeiten nach dem Clean-Code-Ansatz.

Bis zur nächsten Rally!

11.10.2009

Clean-Code-Developer

Manchmal ist man erstaunt, wenn man Dinge die man fühlt schwarz auf weiß irgendwo liest. Ich habe dann dieses "Genau-Das-Ist-ES"-Gefühl.

Und so geht es mir mit Clean-Code-Developer!
http://clean-code-developer.de/

Jetzt will ich nicht nur MCPD werden sondern auch noch Clean-Code-Developer! Mächtig viel Arbeit ;-)

Und hoffentlich kann ich dann bald immer mal wider diesen Stempel verwenden:

2.26.2008

Excel ist kleinlich

Soll von einem anderen Programm (z.B. Access) aus auf Excel zugegriffen werden, so muss jedes Range und Rows mit dem richtigen Worksheet-Objekt adressiert werden.

Sonst sucht sich Excel bei mehreren Instanzen und benannten Bereichen einen aus bzw. liefert einen Fehler mit ... für _Global fehlgeschlagen.

Tasks finden leicht gemacht

Mit Word-VBA ist das Auffinden von Tasks sehr einfach:



Und hier weniger schön zum rauskopieren:
Sub ZeigeExcel() Dim tskJeder As Task For Each tskJeder In Tasks If InStr(LCase(tskJeder), "excel") Then tskJeder.Visible = True End If NextEnd Sub

2.04.2008

Nützliche Funktionen

Für die Ermittlung von Teilen eines Datums immer wieder gut zu gebrauchen:

EXTRACT (YEAR from sysdate)

Cache leeren:
ALTER SYSTEM FLUSH BUFFER_CACHE; 

1.25.2008

TOAD-Fehler bei Varchar2

TOAD-Version: 8.0.0.47

Im TOAD-Debugger tritt ein Fehler (undeclared identifier) auf, wenn eine Varchar2-Variable mehr als 999 Zeichen enthält und man diese direkt oder mit Watches beobachtet.

Der Code läuft völlig problemlos solange man die Variablen nicht beobachtet.

Eine Lösung zu diesem Problem habe ich noch nicht gefunden.

Benutzerdefinierter Fehler beendet Ausführung und gibt dennoch Meldung aus

Die Anweisung

raise_application_error (-20002, 'do_mcontract2baan - Kein Kundencursor geöffnet!');

erzeugt eine Fehlermeldung. Der Code wird dann nach dieser Meldung fortgesetzt.

Verwendet man

EXCEPTION WHEN others
THEN

so wird zwar die Bearbeitung beendet, aber leider auch die Meldung geschluckt.

Die Lösung:

Es wird ein eigener Fehler im PACKAGE definiert:

Fehler_Als_Meldung EXCEPTION;

und diesem dann die gewünschte Fehlernummer zugewiesen:

PRAGMA EXCEPTION_INIT (Fehler_Als_Meldung, -20002);

und eine Behandlungroutine wie folgt implementiert:

EXCEPTIONWHEN fehler_als_meldung
THEN
raise_application_error (-20003, SQLERRM);

Und schon wird die Ausführung des Code unterbrochen und die Meldung ausgegeben!

1.18.2008

Native Dynamic SQL

Genial! Einfach String als SQL ausführen!

"EXECUTE IMEDIATE" und "REF CURSOR".

Details:
Hier
Hier
Hier
Und Hier

1.20.2006

Abfangen von Indexverletzungen mit eigenen Meldungen

Es gibt in AccessXP ein neues Formularereignis, dass es erlaubt, eine allgemeine Reaktion auf sogenannte Laufzeitfehler (meiner Meinung nach besser: Datenfehler) zu reagieren:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Select Case DataErr
Case 3022 'Indexverletzung
MsgBox "Eigene Meldung!"
Response = 0
Case Else
'Normale Meldung
End Select

10.04.2005

Werktage in gegebenen Zeitraum

Prinzipiell ist dies mit einer Abfrage zu erledigen:
select count(*)
from (
select rownum rnum
from all_objects
where rownum <= mEnd - mStart + 1 )
where to_char(mStart + rnum - 1, 'D' ) not in ( '6', '7' ) ;

Dies funktioniert immer dann, wenn Ende und Start "richtig" herum liegen.
Daher ist das Verpacken in eine kleine Funktione ratsam.

Diese lautet für Oracle:


CREATE OR REPLACE FUNCTION FU_Number_Work_Days(
StartDate date,
EndDate date)
RETURN NUMBER IS
Ret number;
Signum number;
mStart date;
mEnd date;
BEGIN
IF EndDate < StartDate
THEN
mEnd := StartDate;
mStart := EndDate;
Signum := -1;
ELSE
mStart := StartDate;
mEnd := EndDate;
Signum := 1;
END IF;

select count(*) into ret
from (
select rownum rnum
from all_objects
where rownum <= mEnd - mStart + 1 )
where to_char(mStart + rnum - 1, 'D' ) not in ( '6', '7' ) ;

return Ret * Signum;
END FU_Number_Work_Days;
/

9.30.2005

Dynamisches Einbinden von ODBC-Tabellen

Das dynamische Einbinden hat so seine Tücken:
Je nach verwendetem ODBC-Treiber und Art der Änderung (z.B. bei ORACLE nur anderer User auf selber ODBC) kann es sein, dass die Einbindung nicht wirklich erneuert wird.
Erst ein Löschen der eingbundenen Tabellen, komprimieren und reparieren der DB und Neueinbinden führt dann zum Erfolg.
Und das Gemeine: Die Anzeige im Tooltip zeigt die neue Verbindung, die Tabelle "recycled" aber die alte Verbindung!!