Laden...
L
LonelyPixel myCSharp.de - Member
Softwareentwickler Erlangen Dabei seit 21.03.2007 333 Beiträge
Benutzerbeschreibung

Forenbeiträge von LonelyPixel Ingesamt 333 Beiträge

01.06.2014 - 16:33 Uhr

Ok, danke für das Feedback. Dann wird das mit den 30€-Angeboten wohl nicht so legal sein, wie die behaupten. Das sind etliche Seiten, die aber ähnlich aufbebaut sind, vermutlich gehören die dem selben "Veranstalter"...

Gibt's eigentlich die Premium-Edition nur mit dem MSDN-Abo? Pro gibt's ja auch ohne. Nur so aus Interesse. Ich muss dann eh erstmal klären, welche Edition wir brauchen. Das kann noch eine Weile dauern, aber jetzt weiß ich schonmal mehr.

27.05.2014 - 11:12 Uhr

Hallo,

ich bin grad am überlegen, wo man als einzelner Entwickler oder für kleine Teams am besten Visual Studio 2013 herbekommt. Einerseits gibt es ja die Retail-Packungen mit Medium für 500 € (Professional) oder 7000 € (Premium + MSDN). Zu finden im Preisvergleich bei einigen deutschen Händlern. Dann finde ich aber diverse dubiose Webseiten, auf denen man Product Keys für Pro/Prem/Ultimate für etwa 30 € kaufen kann, ohne Medium, teilweise mit Download-Link. Das sollen alles Originalschlüssel sein.

Dieser Preisunterschied ist ja enorm. Aber wenn man weiß, dass OEM-Versionen von Windows oder Office auch bloß wenige Euro kosten und VS in manchen Abos und für manche Zielgruppen kostenlos dabei ist, scheint das Angebot nicht ganz abwegig.

Wer kennt sich mit dieser unübersichtlichen Lage aus und kann mir empfehlen, was ich woher bekomme? Es geht nur um VS 2013, keine älteren Versionen, und nur in Professional oder Premium. Eine MSDN-Subscription für Windows, Office etc. wird nicht benötigt. Und eine DVD eigentlich auch nicht, ein ISO-Image zum Herunterladen ist genauso gut.

13.09.2011 - 19:26 Uhr

Hallo,

ich möchte eine neue Anwendung erstellen und bin mir unsicher, ob ich Windows Forms oder WPF verwenden soll. Mit Windows Forms kenne ich mich aus, und ich weiß auch, was alles nicht ordentlich funktionieren wird. Von WPF habe ich nur Grundlagen-Ahnung, d.h. ich habe alle Konzepte mal gesehen, könnte sie aber nicht auswendig hinschreiben oder sinnvoll einsetzen. WPF ist ja irgendwie wahnsinnig kompliziert, nicht nur die Konzepte sondern auch die vielen neuen Sprachen (XAML, {Binding}-Schreibweise usw.).

Was mir bei Windows Forms an komplexen Oberflächen gar nicht gefällt ist, dass es flimmert. Wenn ich ein paar Layout-Panels verwende und dann in einer Tabelle eine Zeile ein- oder ausblende, dann rutscht der Rest hoch oder runter, alles wird neu gezeichnet, und erst dann wird die Größe der verrutschten Controls an den neuen Platz angepasst. Oder ein abgeleitetes Panel zeichnet zuerst die Hintergrundfarbe und lässt an den Stellen, wo noch ein Label hinkommt, die Farbe stehen, und irgendwann kommt dann auch das Label auf den Schirm. Das sieht alles sehr unschön aus.

Da WPF ja zuhauf dieser Effekte und Verschachtelungen verwendet, außerdem alles animieren kann, da vermutlich ein völlig neu entwickeltes Darstellungskonzept (kein WM_PAINT mehr) zum Einsatz kommt, und noch dazu alles irgendwie GPU-beschleunigt sein soll, habe ich die Hoffnung, dass derartige Flimmereffekte bei WPF nicht mehr auftreten. Mangels jeglicher Erfahrung kann ich das aber aktuell nicht prüfen. Wer kennt sich damit aus?

Außerdem dauert es extrem lange, wenn ich viel Text abmessen muss, um in einer Tabelle die Spalten automatisch zu verbreitern. DataGridView mit AutoSize-Columns und ein paar tausend Zeilen sind nicht mehr interaktiv. Geht das mit WPF schneller?

Welche Vorteile habe ich denn sonst mit WPF gegenüber WinForms? Bessere OpenType- und Unicode-Unterstützung bei der Textdarstellung hab ich mal gelesen. Die ganzen tollen Animationen. Noch irgendwas nützliches, wichtiges?

Und wo finde ich verständliche Tutorials, die mir Data Templates, Data Binding und die Event-Geschichten erklären? Was Google bislang so gefunden hat, hat mich immer mit vielen Fragezeichen zurückgelassen. Teilweise war der Code auch sehr unvollständig, so dass ich nichtmal selbst experimentieren konnte. Außerdem verwenden da draußen scheinbar alle VS2008, von VS2010/.NET 4 sieht man kaum etwas.

25.07.2011 - 10:52 Uhr

Hallo,

Ich mache mir derzeit ein paar Gedanken darüber, eine Anwendung zu schreiben, die mit größeren Mengen an Vektorgrafiken arbeitet. Die Grafiken werden nach bestimmten Stilen dargestellt und können wie in einem Zeichenprogramm bearbeitet, gezoomt usw. werden. Manche der Objekte sind klein, manche können sehr groß sein und müssen dementsprechend am Viewport beschnitten werden. Außerdem müssen Texte an Pfaden entlang dargestellt werden, das sollte also möglichst einfach realisierbar sein.

Die Programmoberfläche (also das um den Zeichenbereich herum) sollte möglichst schick und modern aussehen. (Das kann man jetzt mit dem Aero-Stil hinbekommen oder alles in einem dunkleren "Graphit"-Design machen, bin ich offen.)

Dabei muss aber die Performance von allem gut sein. Es darf nicht ständig irgendwo hakeln und ruckeln. Und wenn das Rein- und Rauszoomen noch flüssig animiert werden kann (so ähnliche wie z.B. bei Google Maps im Browser), wär's umso besser.

Ich kenne mich mit Windows Forms ganz gut aus und habe da schon einiges mit aufwändigem Zeichencode erstellt. WPF und DirectX sind mir ziemlich fremd, ich kenne zwar die theoretischen Konzepte, habe aber keine praktische Erfahrung damit.

Ich habe nun etwas gegoogelt und dabei kam raus, dass WPF wohl noch so einige Fehler hat und die Performance noch recht unausgegoren sein soll, gerade was die CPU-GPU-Schnittstelle angeht. Es beschweren sich wohl viele über unzureichende Performance mit WPF und erst recht mit 3D. Das Direct2D-API soll wohl besser sein, scheint aber noch sehr neu zu sein und nicht so einfach für .NET verfügbar.

Was verwende ich nun am besten? WPF für alles? WPF und Direct2D? WinForms für alles? WinForms und Direct2D oder ein anderes DirectX? OpenGL? Wer hat da ein paar Hinweise für mich?

23.03.2011 - 13:43 Uhr

Und wenn Du genau mit dieser Fehlermeldung suchst (z.B: Google) dann findest Du auch den Grund...

Sorry, dieser Beitrag war nicht hilfreich. Nach einigen Suchergebnissen der deutschen und englischen Formulierung des Fehlers habe ich keine Information gefunden, die du gemeint haben könntest.

Ich habe vorerst eine andere Lösung gefunden. In OnPaintBackground verwende ich VisualStyleRenderer.DrawParentBackground, um den Hintergrund zu zeichnen. Das funktioniert zumindest in Windows 7 mit allen Levels von Themes (von Glass bis ganz aus) und in TabPages und direkt in Forms. Der Code sieht dann so aus:


protected override void OnPaintBackground(PaintEventArgs pevent)
{
	if (VisualStyleRenderer.IsSupported)
	{
		// The VisualStyleElement does not matter, we're only drawing the parent's background
		VisualStyleRenderer r = new VisualStyleRenderer(VisualStyleElement.Window.Dialog.Normal);
		r.DrawParentBackground(pevent.Graphics, ClientRectangle, this);
	}
	else
	{
		base.OnPaintBackground(pevent);
	}
}

18.03.2011 - 15:04 Uhr

Seit wann unterstützen Windows-Forms-Controls denn echte Transparenz? Soweit ich weiß, muss jedes Control sein eigenes Rechteck vollständig zeichnen, sonst bleiben dort Fragmente stehen oder es wird schwarz.

Beim Versuch, BackColor auf Transparent zu setzen, bekomme ich folgende (bekannte) Fehlermeldung: "Das Steuerelement unterstützt keine transparenten Hintergrundfarben."

17.03.2011 - 11:56 Uhr

Ich habe ein user control das transparente Bereiche im Hintergrund hat. (Es soll zumindest so aussehen.) Die OnPaintBackground-Methode habe ich nicht überschrieben, es wird also immer der graue Hintergrund angezeigt. Wenn ich das Control jetzt aber in einer TabPage einfüge, ist der Hintergrund ja nicht grau, sondern weiß. Mein Control hat aber immer noch den grauen Hintergrund. Wie bekomme ich das jetzt hin, dass sich der Hintergrund des UserControls nach dem des Parent richtet?

Erschwerend kommt vllt. noch hinzu, dass sich das UserControl in einem anderen CustomControl und dort in einem TableLayout befindet. Das ändert aber alles nichts an der Hintergrundfarbe des Tabs.

(Windows 7 mit dem Aero-Theme, sollte aber auch XP Luna betreffen)

08.05.2010 - 11:02 Uhr

Also, danke für die Links, aber da war leider nichts neues dabei.

Ich hab nun noch etwas weiter gefrickelt und hab zumindest rausgefunden, wie man richtig zeichnen kann. Dazu braucht man folgendes:


protected override void OnPaintBackground(PaintEventArgs pevent)
{
	pevent.Graphics.Clear(Color.FromArgb(0));
}

Danach hat man eine saubere leere Glass-Fläche, auf die man dann mit den gewohnten Zeichenmethoden zeichnen kann (Linien, Flächen, Bilder, alles kein Problem, auch schwarz).

Übrig bleibt nur noch der Text. Mit TextRenderer sieht man sehr wenig bis gar nichts, je nach eingestellter Farbe. In keinem Fall aber das, was man will. In folgendem Screenshot sind jetzt untereinander folgende Text-Darstellungsmethoden gezeigt:

* DrawThemeTextEx (ohne Glow; mit käme das raus, was man erwarten würde)
* Graphics.DrawString
* TextRenderer.DrawText

Im 2. Bild passt der Text nicht rein, weil ich mit TextRenderer.MeasureText ausmesse und nicht mit Graphics.sonstwas. Da sieht man auch, dass der Text größer wird.

08.05.2010 - 00:15 Uhr

Ich hab nochmal weiter gesucht, aber ich find einfach keinen Beispielcode, der irgendwas in Client-Glas zeichnet. Ich finde nur Artikel darüber, wie man dort WinForms-Controls reinsetzen kann, aber nichts selbstgezeichnetes. Davon sehe ich immer nur Screenshots, aber keinen Code.

Meine Probleme sind jetzt konkret folgende:

* Was muss ich im Hintergrund zeichnen (OnPaintBackground)? Wenn ich in der Methode gar nichts mache, wird großer Müll angezeigt aber es ist zumindest stellenweise das Glas zu sehen. Beim Neuzeichnen bleiben natürlich Reste des vorherigen Inhalts stehen. Wenn ich schwarz oder BackColor fülle, ist genau diese Farbe zu sehen aber kein Glas. Wenn ich Transparent fülle, hat das den gleichen Effekt, wie wenn ich gar nichts in der Methode mache. Wenn ich die Methode nicht überschreibe, ist es als ob ich in BackColor füllen würde.

* Wie bekomme ich schwarzen Text sichtbar? Ich möchte wirklich sehr gerne den TextRenderer verwenden, weil das die einzige Möglichkeit ist, Text so zu zeichnen, wie das der Rest von Windows auch tut. Mit Graphics.DrawString sieht es immer ein kleines bisschen anders aus. Und mit Label-Controls wollte ich da jetzt nicht anfangen, zumal die intern auch nur den TextRenderer verwenden (laut Reflector).

07.05.2010 - 20:14 Uhr

Ich weiß nicht, ob das so gut rübergekommen ist, aber so soll es mal aussehen:

Edit: Dass die Tabs hier in der Caption Bar drinstecken, brauche ich nicht. Das wird wohl nochmal ne Ecke komplizierter und unter XP ist dann eh Schluss. Aber wenn die Tabs bei mir so aussehen würden, wär das toll.

07.05.2010 - 20:08 Uhr

Ne, keine Bilder. Das sind Linien, die ich aus einem Point-Array als GraphicsPath zusammensetze. Die genaue Position der Punkte (pro Tab-Header sind das 14 Stück, 7 links und 7 rechts) ist etwas Tüftelei, aber mit etwas geometrischem Geschick schon machbar. Dann setze ich SmoothingMode auf AntiAlias und fülle erst den Hintergrund mit FillPath, zeichne dann den Schatten (beim aktiven Tab) bzw. das Highlight (beim inaktiven Tab) mit einer leicht veränderten Punktmenge und zum Schluss kommt der eigentliche Rand drüber mit DrawPath.

Wenn das alles gemalt ist, setze ich halt mit TextRenderer noch den Text oben drauf.

Der Inhalt der einzelnen Tab-Seiten sind UserControls. In diesem Test hab ich nur eins davon, das halt für alle Seiten jeweils einmal instantiiert wird. Deshalb sehen die alle gleich aus (kommt auf den Screenshots nicht so raus... 😉). Der Button ist aber immer so weit weg von der oberen linken Ecke.

Ich bin mir im Übrigen auch nicht sicher, ob mir das DrawThemeText was nutzt, da ich ja gar nicht (mit Glow und so) direkt auf Glas schreiben möchte, sondern ganz normal auf eine Fläche, die ich vorher gefüllt habe. Später kommen dann noch Icons und ein Close-Button (den zeichne ich wohl auch mit Graphics-Methoden dazu) dazu. In diesen Icons kann auch schwarze Farbe vorkommen, das sollte dann auch sichtbar bleiben. Aber so haut das ja noch überhaupt nicht hin.

07.05.2010 - 19:51 Uhr

Mhm, gleich mal ausprobieren...

und was mach ich mit dem Hintergrund? Der ist ja noch alles andere als ordentlich. Wo der Button-Rest ganz oben links herkommt, hab ich absolut keine Ahnung. Da ist gar kein Button.

Update: Das Zeichnen der Linien haut in meinem Beispiel aber auch noch nicht hin. Da sind total hässliche dunkle Ränder rum. Wo kommen die denn her?

07.05.2010 - 19:38 Uhr

Ach ja, und so sieht es ohne den ganzen DWM-Schnörkel aus:

07.05.2010 - 19:36 Uhr

Das hat gar keinen Unterschied gemacht. Ich hab davon gelesen, aber nur im Kontext mit Windows-Forms-Controls, die ich ja nicht verwende. Ich hab mal 2 Screenshots gemacht. Im ersten wird in OnPaintBackground nichts gemacht und im 2. wird die Methode gar nicht überschrieben.

07.05.2010 - 18:44 Uhr

Hallo,

ich hab heute mal probiert, was in den Aero-Glass-Bereich eines Fensters zu zeichnen. (Windows 7, VS 2008 SP1, C#) Dazu habe ich die Funktion DwmExtendFrameIntoClientArea aufgerufen und mir oben etwas Glass hinmontiert. Das klappt ja ganz gut, aber das Zeichnen dadrin geht schief. Ich kann mir jetzt aussuchen, ob der Hintergrund das übliche Grau sein soll (also das Glas vollständig übermalt), oder ob alles was in schwarzer Farbe gezeichnet wird, durchsichtig sein soll, oder ob alles schwarz wird. Es haut einfach nicht hin. Einfache Codebeispiele hab ich keine gefunden.

Konkret möchte ich einen Tab-Header in die erste Zeile des Fensters setzen. Den zeichne ich komplett selbst. Die Umrandung der einzelnen Tabs ist teilweise transparent (leichter Schatten), der Text im Inneren wird mit TextRenderer.DrawText angezeigt. Im Prinzip sieht das so aus wie in Google Chrome. Ohne Glas funktioniert das einwandfrei, nur mit nicht.

Kann mir da jemand erklären, worauf ich alles achten muss? Insbesondere würde mich interessieren, was ich in OnPaintBackground machen muss und wie ich schwarzen Text auch zu sehen bekomme.

09.04.2010 - 19:32 Uhr

Hallo mal wieder,

ich sitze grad an einem Problem, das sich irgendwo zwischen .NET, COM, einer DLL und ein paar Schnittstellen befindet, ich weiß nur noch nicht genau wo.

Die Aufgabe lautet, eine DLL mit einer Funktion zu erstellen, die ein COM-Objekt zurückgibt. Die COM-Schnittstellen sind nicht im System registriert, müssen also im "Server" und im "Client" unabhängig voneinander definiert werden. Der "Client" ist eine unverwaltete Windows-Anwendung, die die DLL als Plug-in lädt. Der "Server" ist eine C#-DLL, natürlich verwaltet. Dazwischen befinden sich die CLR, ein CCW (COM Callable Wrapper) und ein Haufen Interop Marshaling als Komponentenkleber.

Ich habe bereits eine C#-DLL, die Funktionen exportiert*. Ich habe die Schnittstellen in C# und exemplarisch für die unverwaltete Anwendung in C++. Ich habe C-Code, der die DLL lädt und über eine Funktion ein COM-Objekt abruft. Unter geeigneten Umständen kann der C-Code auch eine Methode auf dem COM-Objekt aufrufen, ohne dass es den Stack zerbröselt. Aber leider nicht immer. Und sowas wie QueryInterface geht noch gar nicht.

Dies ist ein interdisziplinäres Problem, das Kenntnisse in C#, .NET CLR, C++, DLLs, COM und *Interop erfordert.

Ich habe eine Projektmappe erstellt, die eine C#-DLL und ein C++-MFC-Programm enthält, um dieses Zusammenspiel zu demonstrieren. Die konkreten Probleme, die bei mir auftreten, sind in ComClientDlg::OnInitDialog() kommentiert. In dieser Methode befindet sich der ganze Testcode zwischen den beiden Balken.

Mag sich das vielleicht mal jemand anschauen? 😃

Bei Fragen kann ich haufenweise weiterführende Links zu den verwendeten Techniken liefern, die müsste ich jetzt bloß alle zusammensuchen.

*) Zum Exportieren von statischen Methoden als DLL-Funktionen wird das Programm NetDllExport verwendet, das ich geschrieben und in den Buildprozess integriert habe. Es disassembliert im wesentlichen die compilierte DLL, nimmt ein paar Änderungen im IL-Code vor und baut es wieder zusammen. Es werden alle öffentlichen statischen Methoden der Klasse DllExport exportiert, der Namespace ist egal. Wer mag kann sich das Programm ja im Reflector anschauen.

23.12.2009 - 13:30 Uhr

Also den ToolTip unter [edit: neben, seitlich versetzt] dem Mauszeiger anzeigen? Hm, ich fand es schön, den ToolTip genau da anzuzeigen, wo der abgeschnittene Text steht.

Wenn man z. B. in der MSDN-Hilfe im Index die Maus über einen abgeschnittenen Text fährt, erscheint der Text ja auch genau über dem Listeneintrag, verschwindet aber genau dann, wenn man das Rechteck des Listeneintrags verlässt. Die Maus über dem ToolTip blendet es nicht aus und bei Alt+Tab bleibt es nicht stehen. Genauso hätte ich das auch gerne. 😃

23.12.2009 - 13:12 Uhr

Hallo,

ich schreibe gerade ein UserControl, in dem selbstgezeichnete Rechtecke mit einem Text drin angezeigt werden. Die Größe der Rechtecke ist vorgegeben und es kann daher vorkommen, dass der Text nicht hineinpasst. Dann soll beim Drüberfahren mit der Maus über das Rechteck ein ToolTip erscheinen, der den ganzen Text anzeigt.

Soweit geht das ja alles. Nur gibt es das Problem, dass dieser ToolTip immer für die vorgesehene Zeit stehen bleibt, auch wenn mittlerweile mit Alt+Tab das Fenster gewechselt wurde. Daher habe ich einen weiteren Event-Handler hinzugefügt, der den ToolTip wieder ausblendet, sobald die Maus das UserControl verlässt.

Leider verlässt die Maus das UserControl formell auch dann, wenn sie über dem ToolTip ist. Oder andersherum: wenn das ToolTip unter der Maus erscheint. In diesem Fall wird das ToolTip sofort wieder ausgeblendet, um es eine Sekunde später (mein Timer) nochmal zu versuchen.

Da ich an der Stelle später noch längere Texte anzeigen möchte, wäre es aber sehr ungünstig, wenn die nicht größer als das Rechteck sein dürfen. Es ist aber auch blöd, wenn der ToolTip länger angezeigt bleibt als es sinnvoll erscheint. Was kann man da tun?

Da die ToolTip-Klasse keine Mouse-Ereignisse anbietet, kann ich auch nicht darauf reagieren...

08.12.2009 - 08:45 Uhr

Stimmt, das geht. Es geht aber nicht mehr, sobald man die Text-Eigenschaft des LinkLabels setzt. Dann ist TabStop wieder effektiv true. Interessant ist, dass man erst Text und danach TabStop setzen muss, dann funktioniert es tatsächlich wie gewünscht... Anscheinend wird das Control beim Ändern von Text intern so neu erstellt oder zurückgesetzt, dass TabStop neu gesetzt werden muss, was das Control intern aber verpennt, obwohl man annehmen sollte, dass es das tut. Naja, danke für den Hinweis...

23.11.2009 - 12:08 Uhr

Hi,

ich möchte in meiner WinForms-Anwendung ein LinkLabel weiterverwenden, aber so, dass es nicht mehr in der Tab-Reihenfolge vorkommt. Die LinkLabels sind zwischen mehreren TextBoxen verteilt. Die Funktion der LinkLabels habe ich im Kontextmenü der TextBoxen dupliziert, sie ist also nach wie vor erreichbar. Für Mausschubser ist das LinkLabel aber trotzdem bequemer.

Deshalb habe ich LinkLabel.TabStop auf false gesetzt. Leider hat das überhaupt keinen Effekt. Die LinkLabels werden trotzdem von Tab angesprungen. Dass diese Eigenschaft gut versteckt ist und in keiner Liste auftaucht, habe ich bereits mehrfach gelesen und kann ich auch nachvollziehen. Dass es nach "blinder" Eingabe trotzdem funktionieren soll, habe ich auch oft gelesen, das stimmt aber nicht. Haben die das überhaupt mal ausprobiert?

Laut .NET Reflector überschreibt LinkLabel die Eigenschaft Label.TabStop nicht, und Label verändert die Funktion von Control.TabStop auch nicht, weshalb ich mir nicht erklären kann, warum es trotzdem nicht funktioniert. Jemand ne Idee?

20.11.2008 - 08:16 Uhr

DataSet.Read/WriteXML hat keinen Effekt, der schreibt zwar die Datei, aber sie ist leer.

Ich hab das mit dem DataSet jetzt aufgegeben. Dieses Tutorial redet ewig im Kreis rum und macht alles mögliche im Schneckentempo, da wird man ja nie fertig. Ich will auch keine verdammte Access-Datei verwenden und wie man woanders eine neue Datenquelle anlegt, wird gar nicht beschrieben. Ich hatte halt auf ein paar Code-Zeilen gehofft, an denen man erkennen kann, wie es geht und die man dann verwenden könnte. Anscheinend ist es aber doch nicht so einfach. Da bin ich schneller fertig, wenn ich's gar selber mach. Da weiß ich wie es geht und es geht vor allem schnell und genauso wie ich es haben will...

04.11.2008 - 14:26 Uhr

Danke für die Hinweise. Werd ich demnächst mal reinschauen.

Ich wollte zuerst eine XML-Datei verwenden, weil es wirklich nicht viele Daten sind (jeden Tag ein Datum, 3 Zeiten, eine Zahl und ein kurzer Text, und das über wenige Jahre wenn's hochkommt; keine Sortierung oder Filterung nötig). Aber im VS Designer stand XML nicht zur Verfügung. Also war die Compact-Datenbank von MS das naheliegendste. (Meine nächste Erfahrung diesbzgl. ist mit SQLite.NET.)

Woher soll .NET wissen, dass es meine Änderung speichern soll? Naja, ich habe die Verbindung zur DB angelegt und Bearbeiten/Hinzufügen im DataGrid aktiviert. Warum sollten Änderungen (nach dem Verlassen der Zeile, siehe Icon ganz links, so wie in MS Access) nicht auch gespeichert werden.

Nein, ich meinte schon "ich kann damit nichts anfangen". Deshalb, weil ich den Eindruck hatte, dass mit der Einrichtung im Designer alles erledigt wäre. Es sah ja auch so aus, nur dass nichts gespeichert/geladen wurde. Der ConnectionString ist z.B. bereits in einem der Konfigurationsdialoge aufgetaucht. Warum sollte ich ihn nochmal im Code eintragen? Da man alles komfortabel und manuell machen kann, sah es für mich so aus, als wäre in der MSDN der "manuelle" Weg beschrieben. Aber das werd ich ja noch erfahren, wenn ich mich da mal durchlese.

04.11.2008 - 12:05 Uhr

Hallo mal wieder,

ich will mir hier grade eine ganz einfache und kleine Anwendung zusammenstöpseln, in der ich Fahrtzeiten eintrage, die mir dann mit meiner eigenen Darstellungslogik visualisiert werden. Excel ist für diesen Zweck völlig ungeeignet, also muss ein eigenes Programm her. Da ich nicht viel Arbeit da reinstecken wollte, dacht ich mir, ich probier mal die volle Datenautomatik im VS2008 aus (mit Windows Forms, .NET 3.5).

Mein Form hat jetzt ein DataGridView, als Datenquelle hab ich mir eine SQL-Server-Compact-Datenbank erstellen lassen. Über den Dataset-Designer habe ich dort eine Tabelle angelegt. Die konnte ich als Datenquelle im DataGridView auswählen und er hat mir die Spalten eingefügt.

Wenn ich das Programm starte, kann ich Daten eingeben. Aber nach dem Beenden des Programms sind die weg und kommen beim nächsten start auch nicht wieder. Muss ich da irgendwas manuell laden oder speichern? In der MSDN stehen nur Codebeispiele, die alles manuell machen, inkl. ConnectionString. Ich gehe davon aus, dass ich damit nichts anfangen kann. Im Web wird auch nur auf diese MSDN-Doku verwiesen. Hier im Forum habe ich diese Frage nicht gefunden. Wie geht das also nun? Bislang war's ja ganz einfach, aber es funktioniert halt bloß leider nicht.

Bislang habe ich das DataGridView nur "manuell" verwendet, also Zeilen per Code mit Inhalten gefüllt, die ich mit eigenen SQL-SELECT-Abfragen aus einer Datenquelle gelesen habe. Da musste ich sie auch mit UPDATE/INSERT selbst wieder reinschreiben. Das wollte ich mir nun alles sparen. Soll ja wohl irgendwie gehen, nehm ich mal an.

13.08.2008 - 13:25 Uhr

Hallo,

ich habe nun mal wieder recht viel mit XML-Daten zu tun (Excel 2003 XML) und stelle wieder mal fest, dass es recht aufwändig sein kann, mit etwas komplexeren XML-Dokumenten zu arbeiten, Werte zu finden und zu lesen oder Elemente und Attribute an bestimmten Stellen einzufügen. Das Auslesen klappt mit XPath-Ausdrücken schon ganz gut. So kann man locker über mehrere Ebenen springen, Attribute adressieren und global nach ganz bestimmten Konstellationen suchen (z.B. ss:Worksheet/ss:Table/ss:Row/ss:Cell[@ss:StyleID="s21"] oder o:Color/o:Index[text()=18]).

Wenn man nun aber dafür sorgen will, dass an einer bestimmten Stelle im XML-Dokument ein bestimmter Wert zu finden ist, muss man sich wieder mühsam vom Anfang dorthin hangeln, immer schön prüfen, ob das nächste Element existiert und es ggf. erst anlegen und einfügen, dann weiter zum nächsten Knoten usw., bis man letztlich endlich den Text oder Attributwert setzen kann. Hier wäre es viel angenehmer, wenn man einfach einen XPath-Ausdruck angibt, dem man einen Wert zuweisen will, und wenn der Pfad dorthin nicht vollständig existiert, wird er eben angelegt - mit allen Zwischenknoten und Attributwerten, die angegeben wurden. (Bestimmte Mengenausdrücke (Union, Größe der Ergebnismenge > 1), NOT- oder OR-Bedingungen sollte man hierfür ausschließen, da das Verhalten beim Anlegen der Struktur mglw. undefiniert wäre. Im Normalfall ist diese Einschränkung aber nicht relevant.)

Kennt jemand eine Möglichkeit, sowas zu machen? Hier im Forum und in der MSDN-Bibliothek habe ich nichts gefunden. Selber machen bedeutet einen XPath-Parser zu schreiben und damit (einmalig) sehr viel Arbeit.

24.07.2008 - 22:22 Uhr

Ist dieses Schriftproblem das gleiche, wie im Property Grid im VS 2008, wenn man ein WPF-Projekt öffnet, kurz nach dem Blättern? Ich hab das nur mal kurz ausprobiert, aber dieser Effekt im Property Grid unten rechts ist mir unangenehm aufgefallen: Blättert man, glätter er die Schrift irgendwie. Hört man auf zu blättern, blendet er den Text nach einem Moment in etwas über, das an ganzen Bildschirmpixeln ausgerichtet ist. Ganz übel sowas. Ich war angenehm überrascht, dass dieser Effekt bei .NET-3.5-WinForms-Anwendungen nicht auftritt. Sonst hätte ich VS 2008 wohl nicht haben wollen.

19.06.2008 - 16:44 Uhr

Mal vom Aufwand, die Hardware zu identifizieren, abgesehen (vielleicht gibt's da ja ein Windows-API für...), zwei Anmerkungen:

* Dass man anstatt der lokalen, im Computer verbauten Netzwerkkarte irgend einen Router/Switch/sonstwas auslesen würde, halte ich jetzt mal für ne sehr gewagte These. Bis jetzt hab ich mit ipconfig immer noch die MAC-Adresse des lokalen Netzwerk-Adapters rausbekommen, egal wie groß das (nicht) angeschlossene Netzwerk war.

* Anstatt sich auf ein einzelnes Gerät festzulegen könnte man ja auch mehrere alternativ auslesen. Wenn MAC oder Mainboard-Serial-Number oder CPU-Serial-Number oder sonstwas stimmt, ist gut, sonst nicht. Die Gefahr, dass die Hardware dann nicht mehr passt, reduziert sich dann fast auf den Austausch des kompletten Rechners. Da all diese Nummern für sich eindeutig sein sollten, seh ich darin auch keine Schmälerung des Schutzes.

Letztlich scheint es aber wohl zu stimmen: Das Umgehen der Prüfung ist oft einfacher als das Erfinden eines gültigen Schlüssels. Insbesondere bei .NET-Anwendungen. Wer hier noch nie was von Code Obfuscation gehört hat, braucht sich über Serial Keys erst gar keine Gedanken zu machen...

26.03.2008 - 16:15 Uhr

Tatsächlich. Okay, das lässt die ganze Namespacerei wieder etwas plausibler erscheinen. 🙂

26.03.2008 - 14:24 Uhr

Aha, sehr schön. Um mit XPath irgendwas zu finden, das einen Standardnamespace hat, muss man für diesen zuerst einen Alias anlegen, um ihn zu adressieren. Einfach geht da gar nichts. Hier die Lösung:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(response);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
nsMgr.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");
nsMgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
foreach (XmlNode node in xdoc.SelectNodes("/atom:feed/atom:entry", nsMgr))
{ ... }
26.03.2008 - 12:44 Uhr

Hallo,

ich versuche gerade, einen ATOM-Newsfeed einzulesen. Der sieht ja in etwa so aus:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>...</title>
    <entry>
        <title>...</title>
    </entry>
</feed>

Dieser Standard-Namespace bringt mich noch in den Wahnsinn. Ich habe es bereits geschafft, XMP-Daten einzulesen, da gibt's aber nur andere Namespaces, keinen "xmlns:". Hier ist mein Code:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(response);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
nsMgr.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");
foreach (XmlNode node in xdoc.DocumentElement.SelectNodes("entry"))
{ ... }

Alternativ hab ich auch sowas versucht:

foreach (XmlNode node in xdoc.SelectNodes("/feed/entry"))

Nichts hat funktioniert. Das Ergebnis ist immer dasselbe: SelectNodes liefert keinen Node zurück. Er findet einfach nichts. Woran kann das liegen? Ich hab das ganze jetzt schon x-mal durch debuggt, kann aber keinen Fehler finden. Ich hab aber mit XPath auch nicht viel mehr Erfahrung, als man vom CSS-Schreiben bekommt und mit Namespaces steh ich auf Kriegsfuß. 🙁

12.02.2008 - 11:10 Uhr

Das hier könnte dir helfen, die CSV-Dateien vor dem Import in die gewünschte Kodierung zu bringen:
http://beta.unclassified.de/projekte/fileconvert/

04.02.2008 - 22:23 Uhr

Das wird aber schön flimmern. Wie ich woanders gelesen habe, wo mit Outlook verglichen wurde, wird dort die Selektion scheinbar erst beim Loslassen der Maustaste geändert, wodurch Drag-Operationen nicht beeinflusst werden.

Ich hab gestern noch etwas im .NET-Code gestöbert und ein verzweigtes Geflecht aus Aufrufen gefunden, wo die Selektion geändert wird. Alles in DataGridViewOnMouseDown() ausgelöst.

Wo ich aber grade nochmal reinschaue, sehe ich, dass das externe Ereignis (DataGridView.MouseDown) ausgelöst wird, bevor der selektionsverändernde Code ausgeführt wird. Wenn das Ereignis synchron aufgerufen wird (wovon ich ausgehe), müsste man es nur schaffen (meinetwegen mit Reflection-Hacks), die Ausführung des nachfolgenden .NET-Codes zu beeinflussen. Ich glaub ich schau da später nochmal rein...

(So lange muss ich zum Draggen halt die rechte Maustaste verwenden. Mausgesten werden keine verwendet und mit dem Kontextmenü kollidiert das zum Glück auch nicht.)

03.02.2008 - 12:40 Uhr

Hallo,

ich hab grade ein Problem mit dem lieben DataGridView. Das ist auf FullRowSelect eingestellt, markiert also immer ganze Zeilen. Das Markieren mehrerer Zeilen ist auch kein Problem. Nun habe ich Drag&Drop-Funktionalität hinzugefügt. Leider ist das etwas umständlich, wenn man sich selbst um das Behandeln der Mausereignisse kümmern muss, aber es geht.

Nur hat die Sache einen riesengroßen Haken: Wenn ich mit der linken Maustaste etwas packe, werden sofort alle anderen markierten Zeilen demarkiert und ich kann immer nur eine einzige Zeile irgendwohin ziehen. Hat es schonmal jemand geschafft, mehrere Zeilen aus einem DataGridView (mit der linken Maustaste!) rauszuziehen? Wie geht sowas?

03.01.2008 - 14:37 Uhr

Hallo,

ich bin mittlerweile in der Lage, mit meinem C#-Programm die EXIF-Daten aus einer JPEG- oder TIFF-Datei auszulesen. Aber leider stehen im MakerNote-Feld weitere Angaben, die ich auch wissen will, sie aber nicht lesen kann. Ich habe im Internet ein paar Informationen dazu gefunden, die ich aber auch nicht interpretieren kann. Hat jemand einen Codeschnipsel oder eine verständliche Spezifikation zur Hand, mit der ich den Code selbst schreiben kann?

U.a. möchte ich die Angaben "Focus mode", "Subject Distance" und "Owner Name" der Canon EOS 400D auslesen. IrfanView kann die Daten anzeigen, aber der Quelltext dafür ist nicht verfügbar. Die PHP-Erweiterung exif habe ich im Quelltext, aber damit kann man das nicht alles auslesen.

15.11.2007 - 12:30 Uhr

Noch ein Thread zum Thema:
caspol.exe

04.11.2007 - 12:53 Uhr

Original von Pharao2k
ich meinte nicht minimierte, sondern einfach nur nicht sichtbare fenster. also sodass ich alle offenen fenster als piktogramm nebeneinander ausgeben könnte.

Wenn du mit den üblichen Mitteln versuchst, einen Screenshot eines Fensters zu machen, wirst du bis Windows XP nur das bekommen, was gerade auf dem Bildschirm sichtbar ist. Ist das Fenster teilweise oder vollständig außerhalb des Bildschirms oder minimiert, gibt's nix zu sehen. In Vista hat sich das mit Aero geändert, da hier jedes Fenster den aktuellen Inhalt zwischenspeichert und er nicht von der Anwendung neu gezeichnet werden muss. Demnach bekommst du auch teilweise unsichtbare oder überdeckte Fenster vollständig abgebildet. (Allerdings scheinbar nicht mit vollständigem Rahmen, den müsste man also noch komplett abschneiden.)

04.11.2007 - 12:45 Uhr

Original von MysticEmpires
Aber irgent wie sehe ich nicht ganz ein wegen einem Befehle eine 100kb große DLL und eine 122 große XML in meinen Programm zu benutzen.

Die XML-Datei dient vermutlich sowieso nur der Dokumentation, wenn du die DLL im Visual Studio einbinden möchtest. Bei System.Data.SQLite entsteht die XML-Datei z.B. auch, aber zur Ausführung des Programms wird sie nicht benötigt. Seh die einfach als Debug-Unterstützung an, so ähnlich wie *.pdb.

04.11.2007 - 12:41 Uhr

Da ich die relevanten Stichwörter in diesem Thread nicht gefunden hab, traue ich mich, diesen Link zu posten, ohne alle Beiträge gelesen zu haben:

http://www.codeproject.com/cpp/AESProductKey.asp
Product Keys Based on the Advanced Encryption Standard (AES)

Man kann die Benutzerinformationen mit einem privaten Schlüssel zu signieren und als "Product key" rauszugeben. Der Key wird von der Anwendung mit dem darin gespeicherten öffentlichen Schlüssel geprüft. So ist man relativ sicher gegen "Keygens" und Manipulationen am Schlüssel. Der genannte Artikel rät zwar glaub ich von RSA ab, aber ich hab es in einer meiner (noch nicht veröffentlichten) Anwendungen bereits verbaut und es scheint gut zu funktionieren. Ein Schlüssel ist Base64-kodiert z.B. 83 Bytes lang. Abtippen sollte man den nicht mehr, der wird gleich per Zwischenablage in ein Textfeld kopiert.

04.11.2007 - 12:14 Uhr

Ja, so in etwa. Ich versuche zunächst, aus Interpret und Titel die URL zu bauen ("http://lyricwiki.org/" + artist + ":" + title), wobei darauf zu achten ist, dass bei denen jedes Wort mit einem Großbuchstaben beginnt. Wenn's nicht klappt, häng ich noch die üblichen Alternativen von "The", "Der", "Die", ... vorne dran, die ich in meiner Datenbank alle rausgeworfen hab. Wenn in der Seite "<div class='noarticletext'>" vorkommt, gab's keinen Treffer und ich lad den Browser mit der Suchseite zum manuellen Suchen und Kopieren. Ansonsten les ich den Teil "<div id=&quot;lyric&quot;>(.*?)</div>" aus, der den eigentlichen Inhalt enthält.

Hier der Code:

private string GetLyric(string artist, string title)
{
	artist = EasyConvert.UCWords(artist);
	title = EasyConvert.UCWords(title);
	artist = EasyConvert.EncodeWebUrl(artist, Encoding.UTF8).Replace(" ", "_");
	title = EasyConvert.EncodeWebUrl(title, Encoding.UTF8).Replace(" ", "_");

	WebClient wc = new WebClient();
	wc.Encoding = Encoding.UTF8;
	string content = wc.DownloadString("http://lyricwiki.org/" + artist + ":" + title);
	if (!content.Contains("<div class='noarticletext'>"))
	{
		// Page seems to exist, load the data
		Match m = Regex.Match(content, "<div id=\"lyric\">(.*?)</div>");
		if (m.Success)
		{
			// Found data, convert and insert it
			string lyric = m.Groups[1].Value;
			lyric = lyric.Replace("<br/>", Environment.NewLine);
			lyric = lyric.Replace("&nbsp;", " ");
			lyric = lyric.Replace("&lt;", "<");
			lyric = lyric.Replace("&gt;", ">");
			lyric = lyric.Replace("&amp;", "&");
			return CleanLyric(lyric);
		}
	}
	return "";
}
30.10.2007 - 17:57 Uhr

Original von kleines_eichhoernchen
weil Deutsch einfach 100 Begriffe kennt, wo man in Englisch ein und dasselbe Wort verwendet

So wie mit "safety" und "security"? 😉 (Okay, dieses Beispiel musste kommen...)

27.10.2007 - 23:57 Uhr

Wie, du willst auf etwas klicken, das gar nicht sichtbar ist? Wie soll das denn gehen?

Außerdem würd ich vielleichet eher PostMessage anstatt SendMessage verwenden, nicht dass du auf deinen eigenen (blockierten?) Thread warten musst...

Die meisten WM_*-Werte liegen im positiven int-Bereich, sodass es keinen Unterschied macht.

Was ist denn nun eigentlich deine Frage? Oder wolltest du uns nur zeigen, wie man die Maus fernsteuern kann? 😁

27.10.2007 - 22:01 Uhr

detai...? Ich glaub da fehlt ein Stück von deinem Link. Nächstes Mal bitte nicht den gekürzten Linktitel sondern die vollständige Adresse übers Kontextmenü im Browser kopieren.

Zum Thema: Hast du mal im Office Setup die ".NET-Programmierunterstützung" für Outlook angehakt? Das hat bei mir mal gefehlt und ich hab mich gewundert warum's nicht geht. Die Einstellung "Bei erster Verwendung installieren" (Vorgabe für diese Option in allen Office-Komponenten) ist leider reichtlich zweckfrei, da die Verwendung überhaupt nicht festgestellt werden kann, wenn es gar nicht da ist.

27.10.2007 - 21:56 Uhr

Und was ist dein konstruktiver Vorschlag, um ein FullTrust von LocalIntranet zu vermeiden? Ein Zertifikat kaufen und jedes Programm brav signieren?

27.10.2007 - 13:07 Uhr

Kündigung? Mitarbeiter? Wo steht das? Vielleicht geht's hier ja auch um den Admin, der das so einstellen möchte? Oder gar einen Home-User? Wenn ein Mitarbeiter gegen Firmenregelungen verstößt, ist das in keinem Fall gut, aber was veranlasst dich, an dieser Stelle so energisch darauf hinzuweisen?

26.10.2007 - 23:00 Uhr

Werden die Daten mit C# in die SQLite-Datenbank geschrieben und mit dem gleichen Programm auch wieder gelesen? Und das klappt nicht? Seltsam. Ich hab jetzt schon in mehreren Programmen ohne irgendwelche Zeichensatz-Vorkehrungen einfach drauf los Daten reingeschrieben und wieder rausgelesen - das geht mit Umlauten, griechisch oder japanisch einwandfrei. Ich weiß gar nicht mal, wie die Datenbank das genau auf der Platte speichert, vermutlich UTF-8 (das ist glaub ich die Vorgabe). Und da C# durchweg mit Unicode-Zeichenketten arbeitet, ist mir das auch ziemlich egal.

Zur Info: Ich verwende diese Bibliothek für SQLite.NET:
http://sqlite.phxsoftware.com/

26.10.2007 - 22:54 Uhr

Ja, die MSDN-Foren sind (im Firefox, vllt. liegt's daran) ziemlich "unschön" gestaltet. Ne ganze Weile lang ist das System wegen technischer Probleme auch mal komplett "read-only" gewesen... Naja, irgendwann hat Microsoft auch seine eigene Forensoftware fertig. Aber es tummeln sich dort eben auch einige MVPs und ab und zu ist auch bei kniffligen Fragen mal ne brauchbare Antwort dabei, die man noch nicht gefunden hat. Reinschauen lohnt sich, sagt man da glaub ich. 😉

26.10.2007 - 22:48 Uhr

Ich lad Liedtexte automatisch von lyricwiki.org runter. Der Liedname muss allerdings ziemlich exakt stimmen, sonst findet man nichts. Die Suchergebnisseite zu lesen hab ich noch nicht in Code versucht.

26.10.2007 - 22:45 Uhr

Ähm ja, falls noch von Interesse, ich hab soeben diesen Schnipsel auf meinem Rechner gefunden:

%windir%\Microsoft.NET\Framework\v2.0.50727\caspol.exe -m -cg LocalIntranet_Zone -allcode FullTrust

Der Befehl soll wohl der gesamten Intranet-Zone volles Vertrauen aussprechen.

22.10.2007 - 15:20 Uhr

Erst die Ankündigung von Klickbetrug, dann ein (vergeblich werbefinanziertes) Programm mit der Beschreibung "Musik - Freigabe - Kopieren - "Backup" - Quota - Verwahrung"... Klingt aber schon a bisserl merkwürdig, oder? (Hab aber zugegeben noch nicht reingeschaut.)

Ach ja, zum Thema: Du möchtest ein Programm (welches auch immer) veröffentlichen und dafür sorgen, dass es möglichst viele Leute kennen und verwenden. Die Grundvoraussetzung dafür dürfte wohl sein, dass es möglichst viele Leute überhaupt gebrauchen können. Es muss also funktionieren, darf möglichst nichts kaputt machen und sollte auch bedienbar sein. Und dann musst du es öffentlich zugänglich machen, z.B. auf deiner genannten Webseite. Schließlich heißt es "Werbung" zu machen. Melde dein Projekt bei Freeware-Sammlungen an (Google "freeware" sollte eine gute Basis bilden), sprech deine Freunde drauf an und lass dir viele Links auf deine Seite setzen. Mit den Links kommen dann (möglicherweise) auch Besucher, die dein Programm kennen lernen können, es ggf. nützlich finden und dann letztlich auch verwenden. q.e.d.

Zusammenfassung:
* Muss nützlich sein
* Muss gefunden werden können
* Ach ja, sollte möglichst auch legal sein... man weiß ja nie...

19.10.2007 - 14:05 Uhr

Das scheint mir ein eher spezielles bzw. tiefgreifendes Problem zu sein. Hast du mal im MSDN-Forum nachgefragt? Vielleicht geht's ja auch gar nicht.

18.10.2007 - 14:34 Uhr

Google hat mir noch diesen Link wiedergefunden, den ich irgendwann schonmal gesehen hab: (id3 .net lib)

http://sourceforge.net/projects/csid3lib

Hab ich aber noch nichts mit gemacht, also keine Erfahrungen zur Verwendbarkeit.