-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
.NET ClickOnce via Firefox
31.05.07 - .NET, Allerlei, Tools, 3rd Party Tools Beitrag von Norbert Eder| | .NET ClickOnce ist mit Firefox nicht durchführbar und blieb daher den Internet Explorer Benutzern vorenthalten. Bei den Firefox Add-Ons befindet sich allerdings eines namens FFClickOnce [1] welches diese Funktionalität hinzufügt.
Firefox: 1.5 – 2.0.0.*
Wer sich über das Thema ClickOnce informieren möchte, der sei auf den Artikel ClickOnce des MSDN's verwiesen.
[1] FFClickOnce Download
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
NClass - kostenloser UML Klassen Designer
30.05.07 - .NET, Allerlei, Tools, 3rd Party Tools Beitrag von Norbert Eder| | Wer einen leichtgewichtigen UML Klassen Designer sucht, der findet ein kostenloses Tool in NClass. Zwar bietet es nicht allzu viele Funktionalitäten, dennoch sollte es genügen, um einen schnellen Überblick über ein kleines Projekt zu erhalten. Für größere Projekte eignet sich das Tool sicherlich nicht, da dafür entsprechende Funktionen einfach fehlen. Da das Projekt jedoch erst im Oktober 2006 erstmalig veröffentlicht wurde, darf noch einiges zu erhoffen sein.
Aktuelle Features
* Precision snapping to align objects without grid
* Support for two languages: C# and Java
* Declaration parser for class members to edit them faster
* Strict syntactical/semantical controlling
* Configurable diagram styles
* Multilanguage user interface
* Printing/saving to image
Geplante Features
* Association name, role and cardinality fields
* Zooming in/out
* Packages
* Class and member comments for documenting
* Source generator
* Disassemble .NET assemblies
Es lohnt sich auf jeden Fall, das Projekt im Auge zu behalten.
| | | 1 Kommentar
- 1651 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Tipps zum Debugging
25.05.07 - .NET, Visual Studio Beitrag von Norbert Eder| | Visual Studio 2005 bietet kleine nette Features zum Thema Debuggen an, die nicht sehr häufig von Entwicklern genutzt werden. Dabei können diese kleinen Möglichkeiten das Leben durchaus erleichtern.
Setzen wir an einer bestimmten Stelle im Sourcecode (ich verwende hier ein paar wenige Sourcecode-Zeilen zur Veranschaulichung). Per rechter Maustaste auf den Breakpoint erhalten wir ein Kontextmenü mit einigen hilfreichen Einträgen.
Sehen wir uns den Punkt Condition... genauer an.
Beim Durchlaufen des Sources wird bei jedem Hit des Breakpoints die eingegebene Bedingung überprüft. Trifft diese zu (sofern der Punkt Is true gewählt wurde), wird an dieser Stelle unterbrochen, wie im nächsten Screenshot gut zu sehen ist.
Eine weitere Möglichkeit ist durch den Punkt When Hit... gegeben.
Durch diesen wird ein Einstellungsfenster geöffnet, in dem einige Settings vorgenommen werden können:
So kann bei jedem Hit des Breakpoints eine Message ins Consolen-Fenster geschrieben, ein Makro ausgeführt, oder unterbrochen werden.
Es lohnt sich auf jeden Fall, auch die anderen Punkte näher anzusehen, da bestimmte Features recht oft sinnvoll eingesetzt werden können. Damit läßt sich die Produktivität steigern und der Ärger des Debuggens senken.
Weitere Informationen zum Thema Debuggen:
Visual Studio 2005: Default Browser setzen
Webprojekte mittels Firefox debuggen
Unable to debug: The binding handle is invalid.
| | | Kommentar hinzufügen
- 2 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Genervt von Telefonmarketing-Anrufen?
25.05.07 - Kunterbunt Beitrag von Norbert Eder| | Es kommt ja immer wieder mal vor, dass unbekannte Personen von sogenannten Telemarketing-Unternehmen anrufen, um ihren Fragebogen herunterzuspulen. Da es mitunter auch oft geheime Telefonnummern erwischt (worüber diese Angerufenen dann meist nicht sehr erfreut sind), bietet es sich an, sich ein wenig zur Wehr zu setzen.
Dieses Anti-Telemarketing Gegenwehrskript bietet einen Ablauf, um den Anrufer aus dem Konzept zu bringen und den Spieß umzudrehen. Viel Spaß beim nächsten Telemarketing-Anruf.
| | | 4 Kommentare
- 1065 mal angesehen
| 1 Trackbacks
| Permalink | Trackback-URL |
MSDN in neuem Gesicht
24.05.07 - .NET, Allerlei Beitrag von Norbert Eder
Häufigkeiten von Wörtern in einer Liste berechnen
24.05.07 - .NET, Base Framework, Datenverwaltung Beitrag von Norbert Eder| | Heute fand ich eine Frage vor, wie denn ein Array bestehend aus unterschiedlichen Namen durchlaufen werden kann, um die einzelnen Namen und die Anzahl der Vorkommen ausgeben zu lassen. Mein Vorschlag wäre an dieser Stelle eine eigens abgeleitete List<string>. Dies würde so aussehen:
public class NameCounterList : List<string>
{
private Dictionary<string, int> _names =
new Dictionary<string, int>();
public new void Add(string item)
{
base.Add(item);
if (_names.ContainsKey(item.ToLower()))
_names[item.ToLower()]++;
else
_names.Add(item.ToLower(), 1);
}
public new void Clear()
{
base.Clear();
_names.Clear();
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
if (this._names.Count > 0)
{
Dictionary<string, int>.Enumerator en =
this._names.GetEnumerator();
while (en.MoveNext())
{
sb.Append(en.Current.Key);
sb.Append(": ");
sb.Append(en.Current.Value.ToString());
sb.Append(System.Environment.NewLine);
}
}
return sb.ToString();
}
}
Die Aufrufe können dann wie folgt aussehen:
NameCounterList ncl = new NameCounterList();
ncl.Add("Peter");
ncl.Add("Harry");
ncl.Add("Sabine");
ncl.Add("Sabine");
ncl.Add("Jörg");
ncl.Add("Harry");
ncl.Add("Harry");
Console.WriteLine(ncl.ToString());
Wodurch sich folgender Output ergibt:
peter: 1
harry: 3
sabine: 2
jörg: 1
Anmerkungen
An dieser Stelle können natürlich noch Verbesserungen vorgenommen werden. Beispielsweise wäre es denkbar, die Werte zu sortieren. Auf der anderen Seite muss jedoch auch erwähnt werden, dass es für große Datenmengen durchaus bessere Möglichkeiten gibt, eine derartige Funktionalität abzubilden. Für kleinere Anwendungsfälle sollte diese Variante aber durchaus ausreichen.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
ASP Konferenz
23.05.07 - .NET, ASP.NET, Internet, Community Beitrag von Norbert Eder| | Am 18. und 19. Juni 2007 findet die ASP Konferenz in Burghausen statt. Geboten wird viel, wenn man sich die Liste der 20 Sessions ansieht.
Themenübersicht
* AJAX
* Shortcut XAML
* IIS7 News
* CSS 2.0
* Expression Web Designer
* SharePoint Server 2007
* SQL Server 2005
* Blogging
* Live.com und Ihre Anwendungen
* Silverlight (ehemals WPF/E) in .NET 3.0
* Windows Cardspace in .NET 3.0
Vielleicht sehen wir uns ja dort.
| | | 2 Kommentare
- 972 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
UserControls im Skype-Stil selbst erstellt
22.05.07 - .NET, Grundlagen, Base Framework, WPF Beitrag von Norbert Eder| | Beiträge zur Erstellung von UserControls finden sich im Internet wahrlich viele. Dennoch wird immer wieder danach gefragt, wodurch ich mich schließlich hinreissen ließ, eine kurze Demo zu erstellen. Gezeigt wird, wie ein ProgressBar im Skype-Stil erstellt wird.
Grundlegend ist eine neue Klasse zu erstellen, welche von UserControl ableitet. Da das Control via GDI+ gezeichnet wird, muss an dieser Stelle das OnPaint-Event überschrieben werden, was wir entsprechend im Konstruktor mitteilen müssen:
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Wird ControlStyles.UserPaint auf true gesetzt, müssen alle notwendigen Aktualisierungen der Oberfläche selbst vorgenommen werden. Die beiden weiteren Styles sind lediglich Hilfen, die ein Flackern beim Neuzeichnen verhindern bzw. unterdrücken sollen.
Ist dieser Schritt getan, muss die Logik implementiert werden. Dazu gehören die entsprechenden Eigenschaften zur Bestimmung des Minimums, Maximums und des aktuellen Values (wie wir es von einer Standard-ProgressBar gewohnt sind). Wurde auch dies erledigt, geht es daran, das Control zu zeichnen.
Hierzu werden ich allerdings den gesamten Sourcecode des UserControls auflisten:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace SkypeLookControls
{
public partial class SkypeProgressBar : UserControl
{
private int _min = 0;
private int _max = 100;
private int _value = 0;
private Point[] _borderPoints = null;
private Color borderColor = Color.FromArgb(174, 179, 179);
private Color brightDisabledColor = Color.FromArgb(222, 222, 222);
private Color darkDisabledColor1 = Color.FromArgb(209, 209, 209);
private Color darkDisabledColor2 = Color.FromArgb(216, 216, 216);
private Color brightActiveColor = Color.FromArgb(0, 183, 254);
private Color darkActiveColor1 = Color.FromArgb(0, 167, 233);
private Color darkActiveColor2 = Color.FromArgb(0, 183, 254);
/// <summary>
/// Gets or sets the minimum.
/// </summary>
/// <value>The minimum.</value>
public int Minimum
{
get { return this._min; }
set { this._min = value; }
}
/// <summary>
/// Gets or sets the maximum.
/// </summary>
/// <value>The maximum.</value>
public int Maximum
{
get { return this._max; }
set { this._max = value; }
}
/// <summary>
/// Gets or sets the value.
/// </summary>
/// <value>The value.</value>
public int Value
{
get { return this._value; }
set { this._value = value; this.Invalidate(); this.Update(); }
}
/// <summary>
/// Initializes a new instance of the
/// <see cref="SkypeProgressBar"/> class.
/// </summary>
public SkypeProgressBar()
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Init();
this.Resize += new EventHandler(SkypeProgressBar_Resize);
}
void SkypeProgressBar_Resize(object sender, EventArgs e)
{
Init();
this.Invalidate();
this.Update();
}
private void Init()
{
this._borderPoints = new Point[9];
Point p1 = new Point(3, 1);
Point p2 = new Point(this.Width - 3, 1);
Point p3 = new Point(this.Width - 1, 3);
Point p4 = new Point(this.Width - 1, this.Height - 3);
Point p5 = new Point(this.Width - 3, this.Height - 1);
Point p6 = new Point(3, this.Height - 1);
Point p7 = new Point(1, this.Height - 3);
Point p8 = new Point(1, 3);
Point p9 = new Point(3, 1);
this._borderPoints[0] = p1;
this._borderPoints[1] = p2;
this._borderPoints[2] = p3;
this._borderPoints[3] = p4;
this._borderPoints[4] = p5;
this._borderPoints[5] = p6;
this._borderPoints[6] = p7;
this._borderPoints[7] = p8;
this._borderPoints[8] = p9;
}
/// <summary>
/// Raises the
/// <see cref="E:System.Windows.Forms.Control.Paint"></see>
/// event.
/// </summary>
/// <param name="e">A
/// <see cref="T:System.Windows.Forms.PaintEventArgs"></see>
/// that contains the event data.</param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Point[] points = new Point[4];
Point p1 = new Point(0,0);
Point p2 = new Point(this.Width, 0);
Point p3 = new Point(this.Width, this.Height);
Point p4 = new Point(0, this.Height);
points[0] = p1;
points[1] = p2;
points[2] = p3;
points[3] = p4;
e.Graphics.DrawPolygon(
new Pen(new SolidBrush(this.BackColor)), points);
PaintBorder(e);
PaintBar(e);
}
/// <summary>
/// Paints the border.
/// </summary>
/// <param name="e">The
/// <see cref="System.Windows.Forms.PaintEventArgs"/>
/// instance containing the event data.</param>
private void PaintBorder(PaintEventArgs e)
{
Pen p = new Pen(new SolidBrush(this.borderColor));
e.Graphics.DrawLines(p, this._borderPoints);
}
/// <summary>
/// Paints the disabled part of the progress bar.
/// </summary>
/// <param name="e">The
/// <see cref="System.Windows.Forms.PaintEventArgs"/>
/// instance containing the event data.</param>
private void PaintDisabledPart(PaintEventArgs e)
{
int y = (this.Height-6) / 2;
LinearGradientBrush lgb =
new LinearGradientBrush(
new Rectangle(3,y, this.Width-5, this.Height-y-3),
this.darkDisabledColor1,
this.darkDisabledColor2,
90f);
e.Graphics.FillRectangle(lgb,
new Rectangle(3, y+1, this.Width - 5, this.Height-y-3));
e.Graphics.FillRectangle(
new SolidBrush(this.brightDisabledColor),
new Rectangle(3, 3, this.Width - 5, y));
}
/// <summary>
/// Paints the active part of the progress bar.
/// </summary>
/// <param name="e">The
/// <see cref="System.Windows.Forms.PaintEventArgs"/>
/// instance containing the event data.</param>
private void PaintActivePart(PaintEventArgs e)
{
int y = (this.Height - 6) / 2;
double width = (this.Width - 6d) /
(double) this.Maximum * (double)this.Value;
if (Value == Maximum)
width = this.Width - 6d;
if (width > 0)
{
LinearGradientBrush lgb =
new LinearGradientBrush(
new Rectangle(3, y, (int)width, this.Height - y - 3),
this.darkActiveColor1,
this.darkActiveColor2,
90f);
e.Graphics.FillRectangle(lgb,
new Rectangle(3, y + 1, (int)width, this.Height - y - 3));
e.Graphics.FillRectangle(
new SolidBrush(this.brightActiveColor),
new Rectangle(3, 3, (int)width, y));
}
}
/// <summary>
/// Paints the progress bar.
/// </summary>
/// <param name="e">The
/// <see cref="System.Windows.Forms.PaintEventArgs"/>
/// instance containing the event data.</param>
private void PaintBar(PaintEventArgs e)
{
PaintDisabledPart(e);
PaintActivePart(e);
}
}
}
Wichtig ist, dass beim Setzen der Eigenschaft Value durch ein Invalidate das Neuzeichnen des Controls veranlasst wird. Durch den Aufruf der Update-Methode, wird die Aktualisierung sofort vorgenommen. Durch den Auftrag, das Control neu zu zeichnen, wird das OnPaint-Event ausgelöst, welches nun das Control tatsächlich via GDI+ zeichnet.
Das war es mit der "Hexerei".
Das Endergebnis sieht schließlich folgendermaßen aus:
| | | 1 Kommentar
- 1816 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Über die Motivation zum Bloggen ...
21.05.07 - Blog-Intern, Entwicklung, Diskussionen, .NET, Allerlei Beitrag von Norbert Eder| | ... wurden sicherlich schon zahlreiche Beiträge verfasst, auch wenn ich mir persönlich noch keinen dieser Beiträge gegeben habe (sei es aus Faulheit, oder einfach dadurch bedingt, dass ich derartige Artikel noch nicht gefunden habe).
Gerade eben habe ich jedoch eine Email erhalten, in der ich gefragt werde, wie ich denn die Motivation am Leben erhalte, mein Blog mit eben diesem zu befüllen. Ansich eine gute Frage, weiß ich doch selbst darauf keine Antwort. Das Bloggen ist so eine Sache. Einmal entspringen einem Ideen und Beiträge, dass es anderen ganz schwarz um den Augen wird, manchmal verbringt man Wochen darüber nachzudenken, was man denn (sinnloses) verbreiten könnte.
Tatsächlich ist die Motiviation selbst von einigen Faktoren abhängig:
- berufliche Situation
- private Situation
- Stress
- Zeit zum Testen/Spielen
- etc.
Je nachdem finden sich mehr oder weniger potentielle Beiträge. Ich persönlich kenne kaum einen Blogger, der mit jedem Beitrag den Nagel auf den Kopf trifft und permanent den richtigen Artikel zur richtigen Zeit bringt. Intuition und die richtigen Probleme zur richtigen Zeit sind ein gutes Mittel um gute Blog-Beiträge zu schreiben.
Anders verhält es sich natürlich bie den zahlreichen News-Bloggern oder denjenigen, die zu diversen Artikeln ihren Senf abgeben (das Bildblog fäll mir hier ein). Diese haben es wahrlich leichter, als dass sie lediglich auf bestimmte Ereignisse reagieren müssen. Ein Blog zu fachspezifischen Themen bietet an dieser Stelle nicht diese Vielfalt. Gilt es doch bestimmten Themenbereich einzuhalten. Und gerade dabei (und auch den nicht so zahlreichen Hits) spielt Motivation eine große Rolle.
Jedes seriöse Blog kann Stammleser vorweisen - so auch ich. Dennoch liest jeder das, wovon er sich am meisten verspricht. Dadurch werden Blogs auch schnell vergessen und gegen andere ausgetauscht, vor allem, wenn sich über einige Tage oder gar Wochen keine neuen Beiträge auffinden lassen. Aber gerade die blog-treue macht den Reiz der Blogs aus. Kaum ein Blog kann ohne Rückmeldungen leben. Schließlich möchten die meisten lernen und dies geschieht nur durch Kommunikation. Kay spricht es schon richtig an: gefragt ist auch eine Blogger-Ethik. Ohne diese können keine Blogs überleben und werden somit uninteressant. Leider gibt es immer wieder Personen, die einen persönlichen Vorteil daraus ziehen wollen und somit negative Beispiele abliefern.
Jedes Blog, welches sich ernsthaft mit eingegrenzten Bereichen auseinander setzt, verdient Aufmerksamkeit. In welchem Masse diese dem Blog "zugemutet" wird, findet sich wohl an der Qualität der Beiträge wider. Dennoch, die meisten Blogschreiber wenden sehr viel Freizeit auf, um detaillierte Beiträge zu verfassen. Eventuell sollte es an dieser Stelle entsprechende Richtlinien geben, um diese Arbeit zu honorieren, in welcher Richtung auch immer.
Nehmen wir ein x-beliebiges Blog, in dem weniger Einträge erscheinen als gewohnt: Es häufen sich Emails, warum denn auf einmal keine Beiträge mehr erscheinen. Anfangs recht nett, kristallisiert sich bald die "Elite" mit negativen Einträgen á la "hat es sich wohl nicht ausgezahlt" heraus. Unabhängig der dahinterliegenden Problematik (Stress, Krankheit etc.). Es wird also viel erwartet, wenn es aber darum geht, Antworten auf Fragen zu erhalten, dann stellt sich die "Community" taub.
Ja, jetzt wandere ich von einem Thema zum anderen. Aber warum auch nicht. Vor allem die .NET Community lag mir eigentlich bis dato ziemlich am Herzen. In der letzten Zeit musste ich aber feststellen, dass sich immer weniger innerhalb dieser Community tut - zumindest im deutschsprachigen Raum. Foren werden stillgelegt (oder erscheinen zumindest so), zu Projekten kann man kaum jemanden bewegen, kaum Rückmeldungen auf diverse Projekte und teilweise Grüppchenbildung. Ja, vor allem diese Grüppchenbildung entspricht zwar der typischen Verhaltensweise des Menschen, bringt aber eine Community nicht wirklich voran. Kaum ein Zusammenhalt in der .NET Community. Kaum tiegsinnige Diskussionen. Kleine Gruppen, die von sich behaupten, sie wären die besten, die einzigen. Ja, selbsternannte Heros.
Möglicherweise klingen die letzten Absätze nach Resignation. Das möchte ich in dieser Form nicht übermitteln. Vielmehr sollte an der Community wieder stärker gearbeitet werden, um vor allen "Neuankömmlingen" besseren Halt zu bieten. Meine eigenen Mittel in diese Richtung sind beschränkt. Ich kann lediglich auf Mißstände hinweisen und meine Mithilfe anbieten. Tatsächlich müssen alle mitwirken, um dieser Geschichte zu einem erfolgreichen Ende zu verhelfen.
| | | Kommentar hinzufügen
- 27 mal angesehen
| 2 Trackbacks
| Permalink | Trackback-URL |
Einstieg in Silverlight gesucht?
21.05.07 - .NET, Allerlei Beitrag von Norbert Eder| | Silverlight. Es streiten sich die Gemüter. Pro und Kontra. Wer sich den zahlreichen sinnlosen Diskussionen nicht hingeben will und sich lieber selbst ein Bild von Silverlight machen möchte, dem seien die Silverlight Quickstarts ans Herz gelegt. Zahlreiche Artikel führen in das Thema ein und helfen, schnell ein Basiswissen aufzubauen.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL | Zurück Weiter
|
|
|
|
|
|
|