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

28.06.2007 - 16:08 Uhr

500 kB Code für ein GridView? Naja, die Anzeige allein, mit allen CellStyles, die ich brauch, hab ich momentan in weniger als 500 Codezeilen. Nur funktioniert das Scrolling halt überhaupt nicht brauchbar. Aber ich schau mal, ob ich das auf CodeProject.com finde oder wie weit man das MS-GridView anpassen kann.

28.06.2007 - 11:04 Uhr

Hallo,

ich versuche gerade, ein eigenes GridView zu implementieren. Das soll so aussehen, wie das DataGridView oder wie das Ding von Microsoft heißt. Allerdings sagt mir dieses Control optisch nicht so recht zu und es bietet mir auch nicht den Gestaltungsfreiraum, den ich haben möchte. Daher wollte ich so eine Tabelle gleich selbst zeichnen.

Leider haut das aber nicht hin, weil dieses Panel, von dem ich mein Control ableite, ein gewisses Eigenleben führt. Ich habe oben eine Zeile, in der die Spaltennamen stehen, die immer angezeigt werden soll. Darunter stehen dann die eigentlichen Daten, durch die man blättern können soll. Aber wenn ich blättere, mit der eingeblendeten Scrollbar (aktiviert durch AutoScrollMinSize), dann schiebt das Panel den bisherigen Inhalt nur durch die Gegend und zeichnet nur die neu sichtbaren Bereiche. Das kommt sich aber mit dem Spaltenheader in die Quere. Und außerdem zeichnet er nur beim Runterblättern; beim Hochblättern macht er irgendwas anderes. Es erscheint nur zeilenweise vervielfältigtes Material von weiter oben, ruft dafür aber nicht die OnPaint-Methode auf.

Weiß jemand, wie man das automatische Zeichnen ausschalten kann oder welchen anderen Weg man für sowas gehen kann? Ich könnte vielleicht auch 2 Teile aus dem ganzen Control machen, oben die Spalten und unten das Grid. Nur wenn ich nach rechts blättere, will ich nicht, dass sich die Spalten zeitverzögert mitbewegen, das soll nicht wie stümperhaft zusammengeflickt aussehen... Außerdem erhöhe das die Komplexität von einer auf 3 Klassen.

27.06.2007 - 17:36 Uhr

Wie groß ist eure Koeffizientenmatrix denn so? Ich les überall, dass 3x3 optimal wäre. Damit ist auch die potentiell unerreichbare Fläche am Bildrand recht gering.

Ich hab mir mal verschiedene Lösungen angeschaut, und letztlich die hier im Forum (LowLevelGraphicsLibrary) zur Vorlage genommen, die ja im Wesentlichen auch nur auf dem leicht zu findenden Codeproject-Artikel basiert. Den unsafe-Code hab ich durch entsprechende byte[]-Operationen ersetzt und das Pixelformat von 24bit-RGB auf 32bit-RGBA geändert (ich brauche Transparenzunterstützung). Das funktioniert schonmal ganz gut, das Blurring ist sichtbar.

Leider erreiche ich erst bei 10-20 Iterationen (mit einem Zentralgewicht in der Matrix von 0) einen ausreichenden Effekt, um ihn als Fensterschatten herzunehmen. Bei 40 Iterationen wird's langsam gut, dauert aber länger. Bei 60 oder 100 Iterationen entstehen störende Artefakte im Randbereich, weiß nicht, woher die kommen.

Nun hab ich mir gedacht, bringt es vielleicht was, eine größere Matrix zu verwenden? 9x9 z.B., damit sollte doch gleich mal eine effektivere Unschärfung möglich sein. Der Verschnitt am Bildrand ist mir nicht so wichtig, den Bereich neben dem Bild kann man ja durch den Algorithmus (oder durch entsprechende Dimensionierung des Bitmaps) als "transparent" definieren. Wie sähen dann eigentlich die Koeffizienten für eine größere Matrix aus? Bei Google findet man fast nur Angaben zur 3x3-Implementierung.

Meint ihr, das klappt mit einer größeren Matrix? Der Schreibaufwand wäre schon beträchtlich, ich würde statt dem statischen Code, der auf die einzelnen Matrix-Felder zugreift, wahrscheinlich eine zweidimensionale Schleife schreiben, die das macht.

27.06.2007 - 15:09 Uhr

Bei mir läuft auch sehr oft Musik, wenn ich am PC sitze. In der Arbeit auch manchmal, aber da sind die kleinen Lautsprecher eher schlecht. Aber besser als Radio... Ich mach es da eher nicht so laut, dann beschwert sich mein Kollege gelegentlich, dass er gar nichts hören kann. 😁

Wichtig ist bei mir auch, dass ich den Knopf für's nächste Lied schnell erreichen kann. Es kommt schon gelegentlich vor, dass ich mitten in einer Codezeile ein paar Mal diesen Knopf drücke, weil mir das Lied grad so gar nicht zusagt. Es kommt aber auch vor, dass ich die Musik gar nicht mehr wahrnehme, während ich irgendwas am austüfteln bin. Nur wenn sie zu laut wird, stört es mich plötzlich wieder. Ansonsten läuft hier auch alles quer durch die Bank.

Jetzt, wo ich meinen Rechner nicht mehr höre, kann ich die Musik auch etwas leiser einstellen, dann lenkt sie nicht mehr so sehr ab. Wenn es längere Zeit ganz still ist, ist es aber auch manchmal wieder "unangenehm", so "verlassen"... 😉

26.06.2007 - 15:05 Uhr

Welchen Wert hat denn dein "Handle"? (Nicht verwechseln mit Form.Handle.) Wenn es IntPtr(0) ist, hat FindWindow das Fenster nicht gefunden.

Kennst du das Programm Spy, das früher bei Visual C++ immer dabei war? Weiß grad nicht, ob es beim aktuellen Visual Studio noch dabei ist. Damit kannst du jedenfalls alle Fenster im System hierarchisch auflisten lassen, die Handles und tausend weitere Eigenschaften anzeigen lassen und ein Fenster/Control aus der Baumansicht auch auf dem Bildschirm blinken lassen, damit du weißt, ob du das richtige gefunden hast. Man kann auch mit der Maus ein Fenster auf dem Bildschirm auswählen, das einem dann in der Baumansicht ausgewählt wird. So kannst du das richtige Fenster finden. Deine Funktion kannst du so ja erstmal mit dem Texteditor ausprobieren, da funktioniert die ganz bestimmt.

26.06.2007 - 14:11 Uhr

Achso, okay. Die VK_*-Konstanten sind in der MSDN beschrieben. Einfach mal im Index (ungefiltert) nach VK_ suchen, dann auf irgendeinen der Einträge klicken. Bei den Namen steht auch der nummerische Wert dabei. Ansonsten: Alle Konstanten findet man wie immer in den *.h-Dateien im Verzeichnis C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\Include. Alle Dateien nach dem gewünschten Namen zu durchsuchen bringt meist den gewünschten Erfolg. So mach ich das meistens, da weiß man auch sicher, dass es stimmt.

26.06.2007 - 12:55 Uhr

Original von matzze2000
Der Typ oder Namespace 'DllImport' konnte nicht gefunden werden.

Du solltest Visual Studio 2005 verwenden. Da kannst du einfach den Cursor auf einen Klassennamen setzen, und wenn er noch nicht türkis eingefärbt (= erkannter Klassenname) ist, erscheint so ein kleines "SmartTag", in dem du entweder den vollständigen Namespace oder eine passende using-Anweisung einfügen lassen kannst. VS2005 findet so alle Klassennamen von allein, du musst dir gar nicht mehr um die entsprechenden Namespaces Gedanken machen.

Und wo bekomm ich nun genau die Werte für die Konstanten her?

Die hab ich doch mit definiert.

Und was bedeutet das "0xC0000000" als letzter Parameter in Postmessage?

Das ist der Parameterwert für die WM_KEYUP-Nachricht, der aussagt, dass die Taste einmal gedrückt wurde und jetzt losgelassen wird. Genauere Infos findest du in der MSDN unter WM_KEYUP.

26.06.2007 - 11:18 Uhr

Das mit dem Ersetzen der beiden PostMessage(WM_KEY{DOWN,UP})-Aufrufe lass ich besser bleiben. SendKeys("~") sendet zwar den Tastendruck an das fokussierte Control, das dadurch auch einen Klick auslöst, allerdings wird dabei dem Fenster der Fokus geklaut. Keine Ahnung, wo der hinwandert, aber so macht das natürlich keinen Spaß.

26.06.2007 - 11:13 Uhr

Okay, danke erstmal für den Ansatz. Ich schau mir das mal genauer an. Werd mich auch nicht beschweren. 🙂 Da ich am Schluss sowieso eine funktionierende Lösung brauche (eigentlich: sehr gerne hätte), kann ich die gerne wieder veröffentlichen.

Zur Sortierung mit den führenden Nullen: Mir fällt als einziger Entscheidungsgrund die Zeichensatzreihenfolge ein, die für normale Zeichenkettenvergleiche hergenommen wird, und da kommt 0 eben vor den anderen Zahlen. Ist aber wirklich nur ein kleines Detail, auf das es im "täglichen Einsatz" eher kaum ankommt.

26.06.2007 - 11:07 Uhr

Kannst du die DLL nicht selbst so umschreiben, dass sie die gewünschten Nachrichten meldet? Du hast doch bestimmt auch den Quelltext dazu.

26.06.2007 - 11:04 Uhr

Ich würd es mal so versuchen:


const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int VK_LEFT = 0x25;

[DllImport("user32")]
static extern bool PostMessage(IntPtr hWnd, int msg, uint wParam, uint lParam);

PostMessage(hWnd, WM_KEYDOWN, VK_LEFT, 0);
PostMessage(hWnd, WM_KEYUP, VK_LEFT, 0xC0000000);

Mit SendKeys hab ich auch grad Probleme...

25.06.2007 - 22:21 Uhr

Hi,

ich bin grade dabei, mich näher mit der natürlichen Sortierung von Zeichenketten zu beschäftigen. Konkret möchte ich das für eine Datenbankanwendung in C# verwenden und benötige dafür nur die eigentliche Vergleichsfunktion.

Ich hab bereits eine Weile rumgesucht und folgende Ergebnisse gefunden:

Numeric String Sort in C#
Berücksichtigt keine nicht-englischen Zeichen; die nötige Änderung wird aber in einem Nutzerkommentar beschrieben (ungetestet)

ListView Sorterung
Dieser Thread befasst sich mit der schrittweisen Entwicklung eines passenden Algorithmus, ist mir aber zu unübersichtlich. Gibt es da jetzt ein Ergebnis?
Anmerkung dazu: Gleiche Zahlen mit mehr führenden Nullen sind nicht größer, sondern (nach left-to-right zeichenweisem Vergleich) kleiner (Explorer macht's auch so).

Sortierung der ListView Items
Hier gibt's noch ein Code-Beispiel, das nicht bewertet ist. (C-Code)

http://www.sqlite.org/cvstrac/fileview?f=sqlite/src/util.c&v=1.42
Die Funktion sortStrCmp() erfüllt diesen Zweck in einer älteren SQLite-Version, Unterstützung nicht-englischer Zeichen unbekannt. (C-Code)

Seit Windows XP soll wohl auch im WinAPI eine Funktion dafür enthalten sein, die interessiert mich aber wegen der sehr restriktiven Versionseinschränkung nicht.

Hat sich in den letzten zwei Jahren zufällig schon jemand mit dieser Thematik befasst? Falls nicht, werde ich mich in den nächsten Wochen gelegentlich weiter damit befassen und die verschiedenen Lösung analysieren und bewerten, vllt. noch weitere suchen. (Ich hab meine Google-Suche erstmal unterbrochen, da ich auf dieses Forum gestoßen bin. 😉) Im Laufe der Suche bin ich also auf folgende Problemstellungen getroffen:

* Nicht-englische Zeichen sollen sinnvoll sortiert werden [1]
* Führende Nullen müssen beachtet werden
* Negative und reelle Zahlen sind außerdem wünschenswert
** Negative Zahlen lassen sich nur am Anfang einer Zeichenkette sinnvoll verarbeiten
** Reelle Zahlen können einen Punkt oder ein Komma als Trennzeichen verwenden (Tausenderpunkte brauchen nicht berücksichtigt zu werden)

[1] Char-Werte werden scheinbar streng nach Wert sortiert, nur String-Werte können nach lokalen Gegebenheiten sortiert werden. Welchen Einfluss das auf die Geschwindigkeit hat, weiß ich (noch) nicht.

19.06.2007 - 20:24 Uhr

Huch, es gibt "SendKeys"? Tatsächlich. Und ich hab mir in der Arbeit vor 1, 2 Jahren noch die Mühe gemacht, den ganzen Kram mit WinAPI-Funktionen von C++ zu übersetzen... So kann's gehen. In der Tat hab ich das jetzt mit dem virtuellen Drücken der Eingabetaste gemacht. Zwar mit WM_KEYDOWN und WM_KEYUP, aber das wird sicher auch noch ersetzt. 🙂 So geht es zumindest mal.

Ist nämlich toll, wenn man bei LinkLabels mit UseMnemonic und Text = "&Hotkey" einen Buchstaben unterstreichen kann, sich das Button-ähnliche Control beim Drücken von Alt+H aber doch lieber wie ein Label verhält, und bloß den Fokus auf das nächste Control (oft wieder ein LinkLabel) schiebt, aber keinen Klick macht. Hab mir einen MessageFilter mit Event-Callback gebastelt, mit dem ich diese WM_SYSKEY-Nachrichten jetzt recht komfortabel selbst verteilen kann. Erscheint vermutlich demnächst in meinem Web-Labor.

Dieses CAB-Ding sieht auf den ersten Blick recht umfangreich aus. Aber deine Code-Samples haben mich neugierig gemacht. Hab mir mal ne Verknüpfung ins "Zu-Lesen"-Verzeichnis gelegt. 🙂

Ja, so ein PerformClick für LinkLabels wär natürlich toll. Schade, dass man in C# Klassen nicht nachträglich erweitern kann wie in, wo war das, Ruby? Dann könnte man sich das ganze Ableiten und eigene Controls verwenden sparen. Naja, kommt vielleicht noch, in C# 4.0 oder so. 😉

19.06.2007 - 09:29 Uhr

Gna, das ist es ja, was ich erklären wollte. Ich kenne diese Methode nicht. Ich habe ein LinkLabel im Form-Designer erstellt und einen Event-Handler zugewiesen. Soweit alles normal. Jetzt hab ich eine Schleife, die über alle Controls rennt, und wenn sie ein bestimmtes LinkLabel gefunden hat, soll sie so tun, als hätte jemand draufgeklickt. Invoke(control.Name + "_LinkClicked") vielleicht? Ist aber zu unsicher, da es sich auf bestimmte Namenskonventionen verlässt, die niemand garantieren kann.

19.06.2007 - 08:41 Uhr

Hi,

kennt jemand eine Möglichkeit, ein Ereignis durch eigenen Programmcode auszulösen, und zwar von außerhalb der Klasse? Ja, klingt kompliziert, ich weiß auch nicht, wonach ich eigentlich suchen soll. Konkret will ich das LinkClicked-Ereignis eines LinkLabels auslösen, ohne dass der Benutzer da explizit mit der Maus draufgeklickt hat. Ereignisse kann man ja normalerweise nur innerhalb der Klasse auslösen, aber das geht mit einem Control ja nicht, da ich die Klasse nicht verändern kann. Und die Klasse abzuleiten wäre hier irgendwie zuviel Aufwand.

Ich hätte also gerne sowas:

LinkLabel ll = new LinkLabel();
// ...
ll.LinkClicked();

(Und nein, der Name des registrierten Event-Handlers ist nicht bekannt, es soll mit jedem beliebigen Control (zunächst vom Typ LinkLabel) funktionieren.)

Aber sowas geht ja nicht. Mit PostMessage die Nachrichten WM_LBUTTONDOWN und WM_LBUTTONUP zu senden scheint auch keinen Effekt zu haben.

15.05.2007 - 21:57 Uhr

Ich hatte es zuerst in nem Worker-Thread versucht, mir aber zunächst gedacht, dass das vllt. noch komplizierter ist. Danach hab ich meine Demo-Exception (eine ApplicationException) in einem normalen Event-Handler im MainForm untergebracht, also im UI-Thread.

15.05.2007 - 21:14 Uhr

Hi,

ich wollte in meinem C#-Programm einen globalen Exception-Handler einbauen, der alles auffängt, was nicht bereits woanders behandelt wurde. Diesen habe ich um Application.Run() herumgesetzt, also an der äußersten Stelle der Anwendung. Wenn ich das Programm debugge (F5), wird der Code bei einer im Programm platzierten Ausnahme aufgerufen. Wenn ich ihn ausführe (Strg+F5), ignoriert .NET den Exception Handler komplett und zeigt stattdessen den Standard-Dialog von wegen "unbehandelte Ausnahme" an, den mit "Weiter" und "Beenden". Das ist für das Debug- und das Release-Profil gleichermaßen. Weiß jemand, warum mein try/catch-Block nicht beachtet wird? Genaueren Code als diese Beschreibung kann ich erstmal nicht liefern, da da noch einige tausend Codezeilen dranhängen. In anderen Anwendungen hat das schonmal funktioniert, nur jetzt geht's grad nicht.

(Wie sich bei meinen letzten Problemen mit dem Visual Studio 2005 auf mehreren Computern rausgestellt hat, kann es bereits helfen, ein paar Tage zu warten und den Rechner neuzustarten. Aber vielleicht gibt's ja noch ne systematischere Lösung, falls das nichts bringt.)

26.04.2007 - 22:04 Uhr

Falls hier jemand mal auf das Problem stoßen sollte, im MSDN-Forum gibt's eine Antwort darauf:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1524299&SiteID=1

22.04.2007 - 18:33 Uhr

Danke für die Antwort.

Ich hab auch nicht gedacht, dass der BackgroundWorker nicht funktioniert. Nur werden die weiteren Aufgaben eben im UI-Thread aufgrund der ProgressChanged- und Completed-Ereignisse vorgemerkt, und wenn hier zeitlich was nicht stimmt, könnte es evtl. sein, dass die Queue leerläuft. (Wobei das auch ein anderes Verhalten gezeigt hätte...) Muss das aber mal genau verfolgen.

22.04.2007 - 18:20 Uhr

Hallo,

mich würde grade mal interessieren, ob die ReportProgress-Methode eines BackgroundWorker im Worker-Thread sofort zurückkehrt, oder ob sie so lange wartet, bis das Ereignis im "UI-Thread" vollständig bearbeitet wurde. An sich wird kein Rückgabewert erwartet und auf die Übermittlung einer Fortschirttsmeldung müsste der Arbeiter auch nicht grade warten, aber da hier ein Methodenaufruf in einen anderen Thread stattfindet, bin ich mir nich sicher. In der MSDN wird diese Frage leider nicht geklärt.

Auch wenn der Aufruf asynchron stattfindet, gehe ich mal stark davon aus, dass, auch bei schneller zeitlicher Abfolge, die Reihenfolge der Aufrufe garantiert wird. Sprich, dass alle ProgressChanged-Ereignisse in der aufgerufenen Reihenfolge vom UI-Thread bearbeitet werden und erst ganz am Schluss das Completed-Ereginis.

Ich hab in meiner Anwendung eine Kette von Worker-Thread-Aufrufen, deren Arbeit vom UI-Thread aus über eine Queue koordiniert wird. Ganz sporadisch (bisher 2 oder 3 Mal) ist diese Kette aber mittendrin abgerissen, scheint es. Nachdem eine Aufgabe bearbeitet war, wurde die nächste nicht gestartet. Jetzt such ich grade nach der Ursache. Kann aber auch sein, dass mein Locking oder was anderes noch nicht ordentlich laufen...

04.04.2007 - 11:45 Uhr

Okay, ähm, ich weiß nicht, wie's euch geht, aber ich find Gtk unter Windows potthässlich. Außerdem hatte ich in einer gewöhnlichen .NET-Anwendung schon vor, auch die System.Windows.Forms zu verwenden und nicht Gtk-Controls. Daher hab ich Gtk natürlich nicht. Soweit ich weiß, würde das außerdem noch ein zusätzliches Installationsprogramm erfordern, um meine Anwendung nachher zum Laufen zu bringen, und so langsam sammelt sich dann ein halbes Linux auf dem Rechner an.

Naja, momentan ist die Entscheidung noch nicht so dringend, aber derzeit sieht's danach aus, dass ich zur Darstellung von Nachrichten den HTML-Quelltext parsen und komplett neu aufbauen werde, wobei alles rausfliegt, was ich nicht kenne. Das sollte ungültige Daten praktisch verhindern. Allzu komplexe Webseitenmails kann ich immer noch im Reintext lesen oder ignorieren (ist eh oft Werbung). Zum Schreiben von Nachrichten sollten grundlegende Formatierungen ausreichen, dafür kann ich die RichTextBox verwenden und das RTF in HTML übersetzen. Hyperlinks kann man dann eben nicht visuell bearbeiten, aber ich schreib ja eh schon kaum überhaupt HTML-E-Mails...

Der neue HTML-Editor ist damit bis auf weiteres gestrichen, Alternativen zum IE gibt es wieder mal keine brauchbaren und das Thema ist nun eigentlich abgeschlossen. Schade, dass man selbst vor der Planung großer Projekte hier ebenso große Angst hat.

01.04.2007 - 10:55 Uhr

Natürlich mach ich das Mailprogramm für mich, und zwar in erster Linie. Das tolle an einem selbstgeschriebenen Programm ist ja grade, dass man es genau so machen kann, wie man es haben will. (Jetzt kommt mir bitte niemand mit "Du kannst Thunderbird auch verändern" - hat das mal jemand versucht? Allein bis ich die Mozilla-Build-Umgebung fertig hab, hab ich mein Programm auch soweit.)

30.03.2007 - 18:07 Uhr

Hab ich Gtk# oder wie? ... Ja, ich glaub hier bin ich irgendwie falsch.

30.03.2007 - 17:25 Uhr

Okay, Gecko# geht wohl nicht ohne Mono und scheidet deshalb aus.

Naja, vergesst das mit dem E-Mail-Programm besser wieder und beachtet meine Vergleiche mit anderen Engines nicht weiter. Ich würde das gerne als Übungsaufgabe hernehmen. Ob was produktiv einsetzbares dabei rauskommt, werden wir dann sehen. Einen HTML-Parser brauch ich nicht, sowas krieg ich noch selber hin.

Es geht also nur darum, eine interne Darstellung von etwas, das so ähnlich wie ein DOM-Tree sein könnte, in einem RichTextBox-ähnlichen Editor darzustellen und bearbeitbar zu machen. Die Punkte, von denen ich dabei am wenigsten Ahnung habe, sind, wie man Text in verschiedenen Größen und Formatierungen in einer Zeile darstellt, so Dinge wie Absatzformatierung und Zeilenumbruch regelt, und andere Objekte wie Bilder einfügt. Das reicht für den Anfang und ist besser als gar nichts. Kennt jemand Informationsquellen für solche Programmieraufgaben?

Während ich hier schreibe, habe ich eine Version des RichTextBox-Quelltexts gefunden (aus Mono). Mal sehen, was sich damit anfangen lässt.

30.03.2007 - 12:57 Uhr

Original von DarKlajid
Das klingt nach "mal eben" einen EMail Client zu bauen der besser ist als alle anderen..

Hab ich "mal eben" gesagt? Ich hab momentan wirklich nicht sehr viel Zeit, aber ich dachte, dass ich das Mailprogramm bis Jahresende (2007) in einem verwendbaren Zustand hab. Es ist halt nur eine Freizeitbeschäftigung, die ich aber schon zuende bringen will.

Der Markt ist recht klein, es gibt eigentlich nur wenige "populaere" Clients und du willst kurz mal einen der groesseren aus dem Nichts erschlagen?

Nein, größer soll es nicht werden. Ich brauche im Alltag eigentlich nur wenige der Funktionen, die z.B. Thunderbird bietet. Ob mein Programm anderen gefällt, weiß ich jetzt noch nicht. Ich werd es zuerst so machen, dass es mir gefällt. Danach werd ich sehen, ob andere lieber etwas anders hätten. Falls das jetzt nötig ist: Ich kenne wohl nicht alle Mailprogramme, about Outlook Express kann nichtmal PGP-signierte Nachrichten anzeigen (Windows Mail/Vista ist kaum weiterentwickelt), Outlook kann kein IMAP-SSL (länger als 2 min) und ist mir zu groß, Mulberry (oder wie das IMAP-Monster gleich hieß) ist mir zu kompliziert, Thunderbird versagt bei großen Nachrichten (> 10 MB) und läuft nicht stabil mit TLS/SSL, Opera M2 hab ich nicht dazu bewegen können, meine E-Mails mehr als einmal runterzuladen. Mein Hauptkritikpunkt ist aber die Nachrichtenverwaltung. Ich mag einfach keine Ordner. Und die Trennung zwischen "Gesendet" und dem Rest führt zu wildem Hin- und Herblättern um Unterhaltungen zu folgen... Naja, Details zu meinem Vorhaben gehören hier eigentlich nicht rein. Die Serverkommunikation ist bereits halb fertig, die Oberfläche halb entworfen.

Ob du das allein jetzt besser hinbekommst sei dahingestellt.

Das wäre nicht das erste mittelgrößere Projekt, das ich alleine (unter Verwendung von Bibliotheken) erstelle. Wenn man nicht die richtigen Teampartner findet, steht man sich doch nur im weg rum. Vielleicht sind auch nur meine Ansprüche an Code-Qualität zu hoch...

Warum verbesserst du nicht den TB selbst?

Weil ich es dann halb neu schreiben müsste. Und das ist den riesigen Aufwand der Einarbeitung nicht wert. Außerdem liegen auch hier die Probleme teilweise in der Stabilität des Mail-Editors.

Mono (mono-project.com) bietet wie hier schon genannt eine Gecko# Implementierung an.

Ich schau mir das gerade an und werd dann sehen, ob ich das auch ohne Mono zum Laufen bekomme.

es gibt sogar ein (bisher infantiles) Projekt das als Safari-alike Browser fuer Windows zu nutzen (Such nach "Swift").

Das hab ich gefunden. Das Weblog des Entwicklers hat mir genug über seine Einstellungen erzählt, um mich nicht weiter um das "Projekt" zu kümmern. Außerdem scheint mir die KHTML-Lib für den Moment zu komplex zu handhaben.

Ich bin ebenfalls kein Fan des IE, du solltest aber auch vor regelmaessigen FF (den ich ebenfalls nutze) Bugs die Augen nicht verschliessen..

Das ist mir bewusst, aber ich halte FF (Gecko) immer noch für das wesentlich kleinere Risiko. Die geringen Renderinganforderungen, die ich für E-Mails habe, kann der IE locker erfüllen, bestimmt auch in Version 6. Um auch nochmal auf burning snow Bezug zu nehmen: Ich kann den HTML-Code filtern, ja. Wenn ich alle Verstecke, Dateien nachzuladen, finde (z.B. sehr ausgefallene HTML-Kodierung von relevanten Zeichen). Nur wie soll ich dann gute von bösen Bildressourcen unterscheiden? Wenn ich Bilder sehen will (z.B. in eine Nachricht eingebettete), dann will ich nicht, dass mir dadurch gleich irgend ein Stück Code mit installiert wird (wie erst mit WMF- und jetzt mit ANI-Dateien). Außerdem werden solche Bugs bei FF (Gecko) AFAIR wesentlich schneller behoben.

Also ich geh jetzt mal weiter Gecko# lesen...

30.03.2007 - 10:13 Uhr

Original von burning snow
Die Gecko Engine ist keine "private" Entwicklung

Ich habe gesagt, dass das ActiveX-Control eine private Entwicklung ist. Siehe http://www.iol.ie/~locka/mozilla/faq.htm#general

und es gibt schon einige Implementierungen

wovon?

Wenn du es mit managed Code benutzen möchtest, kannst du die Implementierung von MONO benutzen.

Werd ich mal schauen, ob ich das finde, was du meinst.

Desweiteren wird KHTML nicht aussterben, da erstens unter KDE und unter Apples Safari Browser benutzt wird.

Ich habe von mehr Problemen mit KHTML-Browsern als mit Gecko- oder Opera-Browsern gehört. Jetzt hab ich nochmal genauer nachgelesen. Apple Safari verwendet KHTML nur als Grundlage, hat aber wohl viele Änderungen daran vorgenommen, die nicht in KHTML zurückgeflossen sind. Gut, KHTML gibt's dann wohl doch noch ne Weile. Hier hab ich aber keinerlei Erfahrungen über die Integration in Windows-C#-Anwendungen. Gibt's das überhaupt für Windows? Kann mir jemand nützliche Links dazu geben?

Über den Internet Explorer so herzuziehen finde ich nicht unbedingt herzhaft. Wie du schon sagst sind das nur Rendering-Engines und du musst selber die HTML Nachricht ändern, damit du Sicherheitslücken ausmerzen kannst. Das musst du bei jeder Engine durchführen.

Oh, ich wollte deine persönlichen Gefühle nun wirklich nicht verletzen. Ich habe lediglich versucht, die erkannten Probleme darzustellen und deren Gewicht für mich zu erklären. Wenn du möchtest, kann ich dir außerhalb des Threads auch objektive Beispiele liefern, müsste sie aber erst zusammenstellen. Weiterhin ist mir nicht bekannt, wie ich fehlerhafte .ani-Dateien erkennen soll, die Erkennung durch Virenscanner (sofern vorhanden) ist nicht verlässlich. Und gestern Absturz durch JavaScript, heute unauffällige Code-Ausführung durch Grafikdateien, was kommt wohl morgen? (Obwohl, schlimmer geht's eigentlich nicht mehr.) Die Aussichten sind in meinen Augen einfach zu schlecht, dass ich mein Programmkonzept darauf aufbauen möchte. (Vielleicht bin ich als bekennender Firefox-Benutzer hier auch einfach nur falsch?)

Ich hoffe weiterhin auf konstruktive Antworten.

30.03.2007 - 08:01 Uhr

Hallo,

ich arbeite derzeit an einem E-Mail-Programm für den Windows-Desktop. Prinzipiell sowas wie Thunderbird, nur mit einer anderen Organisation der Nachrichten und einfacher in der Bedienung. Eine höhere Stabilität und Zuverlässigkeit sollte ohne allzu großen Aufwand erreichbar sein. Der größte Problemfall, um den sich immer wieder alles dreht, ist allerdings die HTML-Unterstützung. Den HTML-Editor von itwriting.com (stellt den IE-Editor in C# zur Verfügung) habe ich jetzt schon eine Weile lang getestet, und so allerhand Probleme damit festgestellt.

Zum einen produziert das Teil ziemlich viel Müll. Von validem HTML sind wir weit entfernt, nichtmal korrekte Tag-Verschachtelung (wie AFAIK bereits von SGML gefordert) spuckt der aus. Von XHTML reden wir lieber gar nicht erst, aber das wird im E-Mail-Bereich denk ich auch nicht gefordert. Außerdem bekommt man allein beim Einfügen von Text aus Microsoft Word Tonnen von Word-HTML-Code (und -Nicht-HTML-Code) mitgeliefert, den man erstmal filtern muss, was einige Zeit braucht. Diese Filter- und Cleanup-Methoden machen mir noch gewaltig zu schaffen.

Außerdem fühle ich mich einfach sehr unwohl dabei, einen Microsoft-Browser zur Darstellung von Inhalten zu verwenden, die direkt aus dem Internet kommen. JavaScript wird freilich rausgefiltert, aber ob ich das zuverlässig schaffe, weiß ich noch nicht. Gestern kam erst wieder der Bug mit den ANI-Cursorn raus, den ich persönlich als höchst kritisch einstufe und der mich sofort dazu bewegen würde, den Internet Explorer nicht mehr zu verwenden. (Wenn ich das noch täte.) Sollte Microsoft den zum nächsten Patchday in 2 Wochen tatsächlich beheben, wird er bis dahin bereits einiges Unheil angerichtet haben.

Leider scheint es auf der Welt nur vier HTML-Rendering-Engines zu geben:

  1. Microsoft Internet Explorer - bereits beschrieben
  2. Mozilla Gecko - eine Integration in andere Anwendungen ist höchst kompliziert. Das Mozilla ActiveX-Control funktioniert zwar prinzipiell, ist aber umständlich zu verteilen, privat entwickelt (keine Verfügbarkeitsgarantie), nicht mehr aktuell und unterstützt noch keinen EditMode.
  3. Opera - nicht für eigene Anwendungen verfügbar
  4. "KHTML" - keine Ahnung, ob das noch eine Zukunft hat (wechseln ja wohl alle zu Gecko)

Nun, sieht nicht gut aus. Bliebe noch die Möglichkeit, zumindest zum Schreiben von formatierten Texten die RichTextBox herzunehmen. Mehr als die grundlegenden Formatierungen, Bilder und Links will ich gar nicht unterstützen. Ah ja, richtig, Links. Genau die werden in der Richtext-Spezifikation von Microsoft nirgends erwähnt. Demnach unterstützt das Control auch keine und jeder Versuch, sie doch einzufügen (über IE Copy&Paste oder Word RTF), führt entweder dazu, dass die URL (einzig sowas kann linkifiziert werden) explizit eingefügt wird oder der Link nach blauer Farbe und Unterstreichung jede Interaktivität verliert.

Was bleibt? Ich muss es wohl selbst machen. Ich brauche ja "nicht viel". Allzu ausgefallende Layouts haben in E-Mails bitte nicht vorzukommen. JavaScript hat dort ebenfalls nichts verloren und wird nicht beachtet. CSS sollte in eingeschränktem Umfang (zur Schriftformatierung und einfachen Positionierung) ausreichen, falls übrhaupt nötig (schön wär's schon). Bleiben noch Text- und Absatzformatierung, Bilder, Links - was noch? Valider und möglichst effizienter HTML-Code sollten hinten rausfallen. Eine EditMode-Unterstützung ist natürlich erforderlich, zur reinen Anzeige von HTML sollte der Editor aber am besten auch gleich taugen. (Mit der Option, externe Daten nachzuladen oder zu blockieren.) Und am allerbesten wäre eine problemlose Integration in C#-Anwendungen.

Ich habe mir letztens mal die TextBoxBase-Klasse angeschaut, von der eigene Texteditor-Felder wohl abgeleitet werden sollen. So recht schlau bin ich daraus leider nicht geworden. Meine ersten Versuche, eigene grafische Elemente zu zeichnen, haben auch nicht funktioniert (war einfach nichts zu sehen). RichTextBox ist wohl auch nur pro forma davon abgeleitet, basiert intern aber wohl auf einem Windows-eigenen Control, das wohl seit 10 Jahren in irgend einer System-DLL liegt (und bereits in MFC 4 verfügbar ist).

Dann hab ich an euch gedacht. Hier werden ja z.T. fertige Komponenten und Controls entwickelt und veröffentlicht. Ist da auch jemand dabei, der etwas Ahnung von HTML-fähigen Editoren hat? Hat schonmal jemand versucht, so etwas zu schreiben? Ist das überhaupt machbar? (Kann ich derzeit noch gar nicht einschätzen.) Es ist zwar verrückt, für ein neues E-Mail-Programm einen neuen HTML-Editor zu entwickeln, da der wohl weit mehr Aufwand als der Rest des Programms verursacht. Aber wenn dabei was vernünftiges und stabiles rauskommt, profitieren davon denk ich noch eine Menge anderer Anwendungen. Sollte uns eine Fully Managed Implementierung gelingen, sogar auch auf anderen Plattformen als Windows.

Ich bin auf euer Feedback gespannt.

24.03.2007 - 23:45 Uhr

Ich hab neben einem ThinkPad mit Fingerprint-Reader, der die Fingerabdrücke im TPM speichert, wo man mit eigenen Anwendungen wohl kaum reinkommt, nur soviel Ahnung von gewöhnlichen Fingerprint-Readern, dass ich sie nicht zur Sicherung meiner Haustüre einsetzen würde. Außer du lässt die Terrassentür eh immer offen.

24.03.2007 - 23:35 Uhr

Ich versteh deine Situation nicht genau, aber hilft dir das params-Schlüsselwort vielleicht weiter? Damit kann man beliebig viele Parameter an eine Funktion übergeben und auf alle einzeln in einem Array zugreifen.

24.03.2007 - 23:30 Uhr

Der Rückgabetyp von Activator.CreateInstance ist ObjectHandle. Wenn du in der Methodensignatur (in der MSDN) auf genau diesen Link klickst, bekommst du ein Beispiel, wie man mit so einem ObjectHandle umgehen muss. Da ist das eigentlich gut beschrieben. (Hab's jetzt aber nicht ausprobiert.)

21.03.2007 - 13:54 Uhr

Kein Problem. Ich weiß nur nicht, ob ich immer daran denke, das hier zu aktualisieren, wenn ich was dran ändere, was bei meinen öffentlichen Code-Schnipseln durchaus mal vorkommt.

21.03.2007 - 13:08 Uhr

Hi,

braucht hier jemand eine Klasse, mit der man Funktionen unkompliziert zu einem späteren Zeitpunkt aufrufen kann? Interessant ist das z.B., wenn man gerade noch ein Control initialisiert, aber eine bestimmte Aktion erst durchführen kann, wenn es damit fertig ist. Wenn man weiß, dass das in 30 Millisekunden der Fall ist, kann man die Funktion ja dann erst aufrufen. Ein anderer Einsatzzweck ist z.B. der Abbruch von bestimmten Aktionen, wenn sich nach einer vorgegebenen Zeit (z.B. 2 Sekunden) nichts getan hat. Man könnte auch TreeNodes nach 0,5 s Mouse-Hover-Dauer aufklappen oder so. Die Einsatzmöglichkeiten sind sehr vielfältig. Ich habe für meinen Brötchenfinanzierer mal ein größeres Programm entwickelt, in dem diese Klasse entstanden ist und in dem ich sie auch sehr gut einsetzen konnte.

Da die Klasse bereits im Web veröffentlicht ist, spare ich mir mal, sie hier nochmal einzupacken, und gebe gleich den Link darauf:

http://beta.unclassified.de/code/dotnet/delayedcall/

P.S.: Ich hoffe, dass ich den Zweck dieser Sammlung nicht falsch verstanden habe und dass es jemand nützlich findet. 🙂

[EDIT]Neuere Version weiter unten[/EDIT]

21.03.2007 - 12:51 Uhr

Hallo zusammen,

heute hab ich den Link zu dieser Seite in alten Aufzeichnungen gefunden, mich mal etwas umgeschaut und möchte auch gleich mit einer (scheinbar noch nicht behandelten) Frage anfangen.

Die Cursors-Klasse enthält einige Mauszeiger, die man Controls etc. zuweisen kann. Manche davon kann man in der Systemsteuerung einstellen, viele aber nicht. Insbesondere der Mauszeiger, der über Hyperlinks (z.B. LinkLabels) angezeigt wird, also Cursors.Hand, richtet sich ebenfalls nicht nach meinen Benutzervorgaben, obwohl das eigentlich möglich wäre und viele nicht-.NET-Programme (wie Firefox) das auch tun.

Nun habe ich versucht, selbst die Einstellung aus der Registry zu lesen und mit der Cursor-Klasse diese .cur-Datei einzulesen. Auf meinem PC in der Arbeit hab ich momentan die Cursor von Windows Vista (auf XP) eingestellt, den wollte die Klasse aber nicht laden. Stattdessen gab's ne Exception, dass diese Datei nicht unterstützt würde. Details hab ich leider grad nicht da, kann ich aber bei Bedarf nochmal nachstellen.

Weiß hier jemand, wie man nun doch noch den System-Mauszeiger für Hyperlinks in seine eigenen Anwendungen bekommt? Ich find die zeigenden Hände von Mac OS X und auch von Vista nämlich bedeutend schöner als das langweilige Standardbild aus dem .NET-Framework. 🙂