dinsdag 27 november 2007

Controleer in C# of je applicatie al draait

Om te controleren of er al een instantie van je C# applicatie draait kan je de Process collectie in de System.Diagnostics namespace controleren.
Hieronder de voorbeeld code:
/// 
/// Bepaal of een instantie van deze applicatie al draait
///

private static bool isPrevInstance()
{
try
{
//Bepaal de naam van het huidige proces
string currentProcessName = Process.GetCurrentProcess().ProcessName;
//Zoek naar de draaiende processen in dit systeem met deze naam
Process[] processesNamesCollection = Process.GetProcessesByName(currentProcessName);
//Bepaal of meer dan 1 proces draait
return (processesNamesCollection.Length > 1);
}
catch { }

return false;
}

maandag 19 november 2007

Verbergen van georven properties, methods of events van een klasse

Wanneer je een klasse in .Net erft, dan erf je ook automatsch alle properties, methods en events (members). Soms wil je dat een public member verborgen wordt voor de 'buitenwereld'. De IntelliSense zal de verborgen members dan niet in de lijst opnemen.
Het verbergen van zo'n member kan je op een aantal manieren doen:
  1. Verbergen in het properties venster van de designer.
    Hiervoor kan de attribuut System.Componentmodel.Browsable(bool browsable) gebruikt worden
  2. Verbergen voor IntelliSense.
    Hiervoor kan de attribuut System.Componentmodel.EditorBrowsable(EditorBrowsableState state) gebruikt worden
  3. Als Obsolete aanduiden, zodat de .Net compiler een waarschuwing of zelfs een foutmelding zal genereren.
    Hiervoor kan de attribuut System.Obsolete(string message, bool error) gebruikt worden

Bij veel members zijn de eerste twee attributen voldoende. De IntelliSense zal de members niet in de lijst opnemen, maar indien de member toch wordt aangeroepen zal de compiler de code nog wel accepteren.
Om de eerste twee attributen toe te kunnen passen dien je de member te overriden, bijv.:

public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}


Bij sommige members zijn de eerste twee attributen niet voldoende en kan je ervoor kiezen om het derde attribuut te gebruiken. Hierbij zal de IntelliSense de member gewoon opnemen in de lijst, maar wordt wel aangeduid als [deprecated]. Indien je de error parameter van dit attribuut de waarde true meegeeft, zal de code door de compiler niet geaccepteerd worden.
Om het laatste attribuut toe te kunnen passen dien je het keyword new te gebruiken, bijv.:
public new string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}

Bronnen:
Microsoft (System.Attribute derived classes)



vrijdag 16 november 2007

Tonen of verbergen van gebruikers op het Windows XP welkomstscherm

Het lijkt wel of gebruikersnamen willekeurig op het Windows XP welkomstscherm worden getoond (of juist niet worden getoond). De Administrator gebruiker wil je misschien wel op het welkomstscherm terug zien, terwijl dit meestal niet het geval is.

Gelukkig is het mogelijk dit te beïnvloeden door middel van de registry te wijzigen. Volg hiervoor de volgende stappen:

  1. Klik op Start en daarna Run (of Uitvoeren)
  2. Type de tekst "regedit" (zonder aanhalingstekens) in en klik op OK
    De registry Editor word opgestart
  3. Ga in de boomstructuur naar HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ SpecialAccounts \ UserList
  4. Voeg aan de rechterzijde een nieuwe waarde toe van het type DWORD
  5. Geef voor de naam van de nieuwe waarde de naam van de gebruiker op (bijvoorbeeld "Administrator")
  6. Geef de waarde 0 op als je een gebruiker NIET wil tonen op het welkomstscherm. Geef de waarde 1 op om de gebruiker WEL te tonen.
  7. Indien je wel wilt inloggen in Windows, terwijl de gebruiker niet op het welkomstscherm staat, dien je 2x CTRL-ALT-DEL te toetsen om een loginscherm te krijgen

donderdag 15 november 2007

Intressante informatie uit de StackTrace in .Net

Stack trace (ook wel stack backtrace of stack traceback genoemd) is een overzicht van actieve stack frames welke door een programma zijn uitgevoerd.
De StackTrace is bij de meeste .Net ontwikkelaars bekend als de extra debug informatie die het Exception object bevat.

De StackTrace is in .Net altijd op te vragen en kan (bijvoorbeeld ten behove van logging) handige informatie opleveren. Hiervoor kan het StackTrace object in de System.Diagnostics namespace gebruikt worden. Het nadeel van de informatie die je via de GetFrames() methode terugkrijgt, is dat dit veel te gedetailleerd is. Veel informatie over de interne calls binnen het .Net framework zelf, is hierin opgenomen. Om toch de relevante informatie uit de StackTrace te krijgen kan het controleren van de aanwezigheid van de FileName eigenschap van een StackFrame hulp bieden.
Hieronder de code die alleen deze relevante informatie uit de StackTrace haalt en in een string teruggeeft:

public static string GetStackTrace()
{
StringBuilder sb = new StringBuilder();
StackTrace stack = new StackTrace(true);

foreach (StackFrame frame in stack.GetFrames())
{
if (!string.IsNullOrEmpty(frame.GetFileName()))
sb.AppendFormat("{0}.{1} (line:{2} col:{3})\r\n",
frame.GetMethod().DeclaringType.FullName, frame.GetMethod().Name,
frame.GetFileLineNumber(), frame.GetFileColumnNumber());
}

return sb.ToString();
}



Bronnen:
WikiPedia
Microsoft

vrijdag 19 oktober 2007

Converteer afbeeldingen naar grijswaarden in .Net 2.0

Wanneer je in .Net afbeeldingen wil converteren naar grijswaarden, moet je GDI+ gebruiken. GDI (Graphics Device Interface) is hét component in het .Net framework wat gebruikt kan worden voor image processing.

Hieronder de code om afbeeldingen met behulp van GDI om te zetten naar afbeeldingen in grijswaarden:
public static Bitmap ConvertToGrayscale(Bitmap source, Color transparencyColor)
{
Bitmap bm = new Bitmap(source.Width, source.Height);
for (int y = 0; y < bm.Height; y++)
{
for (int x = 0; x < bm.Width; x++)
{
Color c = source.GetPixel(x, y);
int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
}
}
if (transparencyColor!=Color.Empty)
bm.MakeTransparent(transparencyColor);
return bm;
}
public static Bitmap ConvertToGrayscale(Bitmap source)
{
return ConvertToGrayscale(source, Color.Empty);
}

De optionele parameter transparencyColor wordt gebruikt om deze kleur in de afbeelding te converteren naar Transparant!
Het grote nadeel van GDI+ is, is dat het niet erg snel is, omdat GDI+ nog niet voldoende gebruikt maakt van hardware acceleratie.

Een goed alternatief in het .Net 2.0 framework is de statische methode CreateDisabledImage in the ToolStripRenderer klasse. Deze methode heeft mij geholpen een groot aantal afbeeldingen in een User-Interface te converteren naar afbeeldingen in grijswaarden, met een hoge performance. Deze methode roep je als volgt aan:
public static Image CreateDisabledImage (
Image normalImage
)

Deze klasse is onderdeel van de System.Windows.Forms namespace. Je moet dus wel een reference naar deze assembly aan je project toevoegen.

Bronnen:
Wikipedia
Microsoft MSDN
Bob Powel (GDI guru)

donderdag 18 oktober 2007

Kolliger Mühle

Als je zin hebt om een weekendje of een weekje naar de Eifel te gaan, dan heb ik de perfecte lokatie gevonden. Kijk hier maar eens...

Kolliger Mühle

vrijdag 12 oktober 2007

Blogger Labels weergeven als Tags

De Labels die je aan elk bericht toevoegd kan je met behulp van het Labels widget tonen op je Blogpagina. Nadeel van dit widget is, is dat je alleen maar een opsomming van de Labels krijg met het aantal keer dat het Label gebruikt is in je Blog, terwijl tegenwoordig veel gebruik wordt gemaakt van een Tag overzicht.

Op de website van phydeaux3 staat een voorbeeld van zo'n Tag overzicht en hij (of zij?) geeft ook nog prijs hoe je zelf dit overzicht kan maken. Ik ben zo vrij geweest om een vertaalde versie op mijn Blog te zetten.

Let op: je moet gebruik maken van de Layout Templates om dit te laten werken en je dient, voordat je begint, het Label widget toegevoegd te hebben op je Blogpagina
Stappen
  1. Maak een backup van je huidige HTML pagina, zodat je nog altijd terug kan indien het niet lukt.
    - Ga naar je Blogger dashboard en klik op Indeling en daarna op HTML bewerken
    - Selecteer alle tekst in het vak onder Sjabloon bewerken en kopieer deze naar een bestand op je lokale PC en bewaar het bestand
  2. Voeg de HTML styles toe
    - Zoek naar de tekst ]]></b:skin> in hetzelfde tekstvak
    - Kopieer de tekst hieronder en plak deze vóór de gevonden tekst in het tekstvak
    /* Label Cloud Styles */
    #labelCloud {text-align:center;font-family:arial,sans-serif;}
    #labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}
    #labelCloud ul{list-style-type:none;margin:0 auto;padding:0;}
    #labelCloud a img{border:0;display:inline;margin:0 0 0 3px;padding:0}
    #labelCloud a{text-decoration:none}
    #labelCloud a:hover{text-decoration:underline}
    #labelCloud li a{}
    #labelCloud .label-cloud {}
    #labelCloud .label-count {padding-left:0.2em;font-size:9px;color:#000}
    #labelCloud .label-cloud li:before{content:"" !important}

  3. Voeg het HTML script toe
    - Kopieer de tekst hieronder en plak deze ná de gevonden tekst in punt 2
    <script type='text/javascript'>
    // Label Cloud User Variables
    var cloudMin = 1;
    var maxFontSize = 20;
    var maxColor = [0,0,255];
    var minFontSize = 10;
    var minColor = [0,0,0];
    var lcShowCount = false;
    </script>

  4. Vervang de huidige HTML code voor het widget met nieuwe HTML
    - Zoek naar het huidige widget voor het Label overzicht. De HTML code hiervoor ziet er ongeveer zo uit: <b:widget id="'Label1'" locked="'false'" title="'Labels'" type="'Label'/">
    - Kopieer de tekst hieronder en plak deze over de HTML van het huidige widget (deze begint in ieder geval met <b:widget en eindigt in ieder geval met />)

    <b:widget id='Label1' locked='false' title='Label Cloud' type='Label'>
    <b:includable id='main'>
    <b:if cond='data:title'>
    <h2><data:title/></h2>
    </b:if>

    <div class='widget-content'>
    <div id='labelCloud'/>
    <script type='text/javascript'>

    // Don't change anything past this point -----------------
    // Cloud function s() ripped from del.icio.us
    function s(a,b,i,x){
    if(a&gt;b){
    var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m)
    }
    else{
    var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a)
    }
    return v
    }


    var c=[];
    var labelCount = new Array();
    var ts = new Object;
    <b:loop values='data:labels' var='label'>
    var theName = &quot;<data:label.name/>&quot;;
    ts[theName] = <data:label.count/>;
    </b:loop>

    for (t in ts){
    if (!labelCount[ts[t]]){
    labelCount[ts[t]] = new Array(ts[t])
    }
    }
    var ta=cloudMin-1;
    tz = labelCount.length - cloudMin;
    lc2 = document.getElementById('labelCloud');
    ul = document.createElement('ul');
    ul.className = 'label-cloud';
    for(var t in ts){
    if(ts[t] &lt; cloudMin){
    continue;
    }
    for (var i=0;3 &gt; i;i++) {
    c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)
    }
    var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);
    li = document.createElement('li');
    li.style.fontSize = fs+'px';
    li.style.lineHeight = '1';
    a = document.createElement('a');
    a.title = ts[t]+' Posts in '+t;
    a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
    a.href = '/search/label/'+encodeURIComponent(t);
    if (lcShowCount){
    span = document.createElement('span');
    span.innerHTML = '('+ts[t]+') ';
    span.className = 'label-count';
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    li.appendChild(span);
    }
    else {
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    }
    ul.appendChild(li);
    abnk = document.createTextNode(' ');
    ul.appendChild(abnk);
    }
    lc2.appendChild(ul);
    </script>

    <noscript>
    <ul>
    <b:loop values='data:labels' var='label'>
    <li>
    <b:if cond='data:blog.url == data:label.url'>
    <data:label.name/>
    <b:else/>
    <a expr:href='data:label.url'><data:label.name/></a>
    </b:if>
    (<data:label.count/>)
    </li>
    </b:loop>
    </ul>
    </noscript>
    <b:include name='quickedit'/>
    </div>

    </b:includable>
    </b:widget>

  5. Klik op de knop Voorbeeld om te bekijken of het Tag overzicht goed weergegeven wordt. Indien dit niet het geval is, dan zou ik de backup terugplaatsen in het tekstvak onder Sjabloon bewerken, zodat je Blogpagina in ieder geval weer normaal functioneert. Als je vragen hebt kan je me altijd mailen of een reactie op dit bericht plaatsen.
    Indien het Tag overzicht er goed uitziet kan je het Sjabloon opslaan.

Het HTML script, toegevoegd in punt 3 biedt de mogelijkheden om nog wat aan te passen aan de layout van het Tag overzicht. Hieronder een uitleg:

  • var cloudMin= 1
    Indien je dit op 1 laat staan worden alle Labels getoond in het Tag overzicht, maar als je het nummer aanpast naar een hoger getal, dan zullen alleen die Labels worden getoond die minimaal zoveel keer voorkomen in je Blog
  • maxFontSize en maxColor
    Hiermee geef je de grootte van het lettertype en de kleur van de letter voor het Label welke het vaakst op je Blog voorkomt (zie onder Bronnen voor een RGB kleurenoverzicht)
  • minFontSize en minColor
    Hiermee geef je de grootte van het lettertype en de kleur van de letter voor het Label welke het minst vaak op je Blog voorkomt
  • lcShowCount = false
    Indien je de waarde false vervangt door true, dan wordt het aantal keren dat een Label voorkomt op je Blog, weergegeven bij de Tag. Over het algemeen zie je dit nooit terug in Tag overzichten, dus ik zou dit op false laten staan

Verder is het nog mogelijk om je Tag overzicht nóg meer te tweaken door het aanpasen van de HTML styles, toegevoegd in punt 2. Hier wil ik verder niet op in gaan en is bestemd voor de meer ervaren HTML ontwerpers.


Bronnen:
Setup and configuration for New Blogger Tag Cloud / Label Cloud
RGB kleurcodes