Laden...
Avatar #avatar-2076.jpg
Benutzerbeschreibung
Konto auf Wunsch des Benutzers gesperrt

Forenbeiträge von vbtricks Ingesamt 205 Beiträge

13.07.2007 - 09:10 Uhr

Salut,

where funktioniert einwandfrei.

Wenn ich die Liste nicht generisch machen würde, müsste ich jedesmal casten, wenn ich Methoden einfüge, die Objekte der Liste zurückgeben, so kann ich mir das sparen.

Stefan

12.07.2007 - 20:05 Uhr

Salut,

für eine Liste von Instanzen einer eigenen Klasse PackageInfo möchte ich einen eigenen Listentyp PackageInfoList erstellen (abgeleitet vom generischen List):


class PackageInfo
{
  public GUID
  { get {//...}}
}

class PackageInfoList<Type>: List<Type>
{
    public Type FindItem(Guid GUID)
    {
        foreach (PackageInfo package in this)
        {
            if (package.GUID == GUID) return package;
        }

        return null;
    }
}

Da im Projekt allerdings auch Klassen existieren, die von PackageInfo abgeleitet sind, würde ich gerne dafür sorgen, dass Type eine von PackageInfo abgeleitete Klasse sein muss.

So, wie das oben steht, funktioniert das natürlich nicht, soll aber verdeutlichen, was ich mir vorstelle.

Ist das möglich, oder wie realisiere ich das besser?

Danke im Voraus,

Stefan

29.06.2007 - 20:13 Uhr

Salut,

ich möchte mir ein kleines Tool schreiben, dass das Vordergrundfenster mit einem Schatten versieht. Es klappt auch fast alles.

Lediglich das Neuzeichnen des Fensters nach Anwenden des Stils will noch nicht richtig funktionieren:


    public partial class Form1 : Form
    {
        private const int CS_DROPSHADOW = 131072;

        private const int GCL_STYLE = -26;
        [DllImport("user32", EntryPoint = "GetClassLongA",
            CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern int GetClassLong(int lngHandler, int lngIndex);
        [DllImport("user32", EntryPoint = "SetClassLongA",
            CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern int SetClassLong(int lngHandler, int lngIndex,
            int lngNewClassinteger);
        [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true,
            ExactSpelling = true)]
        private static extern int GetDesktopWindow();

        public Form1()
        {
            InitializeComponent();
        }

        private void EnableDropShadow(int hwnd, bool DoEnable)
        {
            int classLong = GetClassLong(hwnd, GCL_STYLE);
            if (DoEnable)
            {
                classLong = classLong | CS_DROPSHADOW;
            }
            else
            {
                classLong = classLong & ~CS_DROPSHADOW;
            }
            SetClassLong(hwnd, GCL_STYLE, classLong);
            this.Visible = false; // Testweise für die aktuelle Form
            this.Visible = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            EnableDropShadow(this.Handle.ToInt32(), true);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            EnableDropShadow(this.Handle.ToInt32(), true);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            EnableDropShadow(this.Handle.ToInt32(), false);
        }
    }

So funktioniert das zwar, würde es vermutlich auch für Fremdfenster, aber dann verschwindet der Task in der Taskleiste kurz und erscheint wieder. Wie kann ich das besser lösen?

Danke im Voraus,

Stefan

28.06.2007 - 18:24 Uhr

Salut,

@Schamese
Die Version hier im Thread ist nicht mehr besonders aktuell. Den Fehler hatte ich in meiner lokalen Version bereits behoben. Ich habe mal eine aktualisierte Version reingestellt.

@BennyP
Die im verlinkten Thread vorgestellte Version arbeitet bei mir nicht ganz sauber, was Darstellungsfehler nach sich zieht.

Stefan

25.05.2007 - 08:24 Uhr

Salut,

da hast du natürlich auch wieder recht. Aber man bildet sich auch gerne weiter 😉. Und es hätte ja sein können, dass es eine trickreiche Datenstruktur gibt, die mir noch nicht begegnet ist.

Stefan

25.05.2007 - 08:23 Uhr

Salut,

ja, das ist natürlich richtig. Wobei ich dann im worst case vermutlich auch wieder auf O(n) komme. In der Praxis steckt mit deinem Ansatz aber noch einiges an Potential im Problem 😉.

Stefan

19.05.2007 - 20:11 Uhr

Salut,

ok, die doppelt verkettete Liste habe ich gefunden: System.Collections.Generic.LinkedList.

Nein, der Reflector ist schon praktisch. Allerdings hatte ich erst nicht bemerkt, dass Teile von System.Collections.Generic unter mscorlib und System aufgeteilt sind.

Dass die generische Liste ein simples Array ist, werde ich bei laufzeitkritischen Anwendungen nächstens bedenken müssen...

Danke euch beiden,

Stefan

19.05.2007 - 16:28 Uhr

Salut,

was ich da sehe, sieht stark nach Array aus...

Dann macht die Capacity-Eigenschaft auch plötzlich wieder Sinn.

Gibt es dann auch so etwas wie eine richtige Liste? Oder muss man das selbst programmieren?

Stefan

19.05.2007 - 15:36 Uhr

Salut,

weil ich mich gerade mit dem Thema Laufzeiten beschäftige und mir diese Frage schon länger durch den Kopf schwirrt, ich sie aber nicht gestellt habe:

Wie ist eigentlich eine ArrayList oder generische Liste intern implementiert?

In den ganzen Einführungen werden ja immer Arrays und verkettete Listen vorgestellt.
Die ArrayList scheint aber keiner der beiden Fälle zu sein, schließlich kann ich dynamisch Elemente hinzufügen und entfernen, auf die Elemente aber auch mit Index zugreifen. Oder wird beim Zugriff per Index bei den gefolgten Zeigern mitgezählt?

Stefan

18.05.2007 - 12:59 Uhr

Salut,

die Idee mit den Dictionaries ist natürlich in dem Fall, dass wie im Beispiel nur endlich viele X/Y-Koordinaten vorkommen, eine deutliche Verbesserung.

Bei der binären Suche nach dem Beschneidungspunkt kann ich dir nicht ganz folgen. Als Beispiel mal (Bild siehe Anhang)
(70,70)
(100,260)
(250,110)
(250,120)
(240,240)
(200,260)
(150,260)

sortiert nach X
(70,70)
(110,260)
(150,260)
(200,260)
(240,240) <<< beschränkt am meisten
(250,110)
(250,120)

sortiert nach Y
(70,70)
(250,110)
(250,120)
(240,240) <<<
(110,260)
(150,260)
(200,260)
Da sehe ich nicht, wie ich groß abkürzen könnte. Ich könnte jeweils nach der notwendigen Startkoordinate suchen (d.h. der Eintrag mit dem minimalen X/Y-Wert, sodass er im potentiellen Rechteck enthalten ist). Aber im schlimmsten Fall muss ich dann ja immer noch n-Einträge durchgehen.

Wenn ich für die Anzahl der Koordinaten keine endliche Menge habe (also z.B. die Menge der rationalen Zahlen, werde ich wohl kaum Optimierungsmöglichkeiten bei meinem Ansatz haben? Die Dictionaries helfen mir da ja nicht weiter, da ich z.B. alle Punkte auf einer Geraden haben könnte, folglich hat dann mindestens eines der beiden Dictionaries für jede Dimension n Elemente, im schlimmsten Fall beide.

Stefan

15.05.2007 - 07:20 Uhr

Salut,

@herbivore
Es reicht ein einziges Gegenbeispiel um den Algorithmus zu vernichten, die Korrektheit zu beweisen ist schon um einiges schwieriger. Deshalb hatte ich ja geschrieben, dass es "optisch" ganz gut aussieht (wobei man natürlich über diese Formulierung streiten kann).
Um mir das Testen zu erleichtern, habe ich die Start- und Stop-Buttons eingebaut, die per Timer immer einen Zufallspunkt in das aktuelle größte Quadrat setzen. Wenn der Algorithmus nicht korrekt wäre, würde ich ja dann irgendwann noch eine größere freie Fläche sehen, die der Algorithmus nicht findet.

Dass es mehrere gleichgroße größte Quadrate geben kann, stört mich nicht, ich benötige nur eines. Auch interessieren mich nur achsenparallele Quadrate. Hätte ich vielleicht dazuschreiben sollen...

Die Aufgabe habe ich übrigens aus einer Aufgabensammlung zur theoretischen Informatik. Ist aber ganz interessant, sich mal mit Problemen zu beschäftigen, die auf den ersten Blick leicht zu lösen aussehen, aber eine effiziente Lösung dann einiges an Überlegung benötigt.
War mein Praxisbeispiel so weit aus der Luft gegriffen? 😉

Stefan

14.05.2007 - 17:39 Uhr

Salut,

hm, laufzeittechnisch ist das aber doch eher schlechter, oder? Rechtecke bekomme ich dann (#Punkte + 1)^2 viele.

Anschließend kommt jedes dieser Rechtecke als obere linke Kachel in Betracht.

Und dann muss ich noch prüfen, wie viele Rechtecke ich dran basteln kann, d.h. ich gehe jede Zeile unterhalb der Kachel durch und schaue, wie weit ich nach rechts komme.

Das ist im worst case doch dann aber auch nochmal n2, macht nach meiner Milchmädchenrechung n4.
Lass mich da aber natürlich auch gern korrigieren...

Stefan

14.05.2007 - 16:54 Uhr

Salut,

ja, da bin ich mir sicher. Im Endeffekt soll das größte Quadrat rauskommen. Im Algorithmus selbst verwende ich erst mal Rechtecke, das ist richtig.

Ich habe jetzt doch noch eine Idee gehabt. Und zwar prüfe ich, ob die X- oder die Y-Koordinate des aktuellen Testpunkts im aktuellen Rechteck weiter entfernt von der linken oberen Ecke des Rechtecks entfernt ist. Anschließend "werfe" ich nur den Teil des aktuellen Rechtecks hinter der größeren Koordinate weg.

Rein optisch sieht das schon ganz gut aus. Muss mir da aber noch Gedanken über die Korrektheit machen. Außerdem ist das ganze noch kubisch vom Aufwand, das würde ich gerne noch reduzieren. Für weitere Ideen wäre ich deshalb dankbar.

Ein aktualisiertes Beispiel findet sich im Anhang.

Stefan

14.05.2007 - 16:14 Uhr

Salut,

vielleicht kann mir ja jemand bei meinem Problem weiterhelfen.

Ich habe ein Minenfeld, wobei ich die Koordinaten der Minen als Liste habe. Nun möchte in diesem Feld ein möglichst großes Quadrat finden, sodass keine der Minen auf diesem Quadrat ist.

Meine erste Idee war, dass ich mir jeweils zwei Punkte nehme und dann ein Rechteck einpasse, das die beiden Punkte und die rechte untere Ecke auf dem Rand hat. Anschließend prüfe ich, ob die anderen Punkte auf diesem Rechteck liegen. Tun sie das schneide ich rechts und unten von dem aktuellen Rechteck entsprechend viel abschneide. Das liefert aber keine korrekten Resultate.

Warum das so ist, ist mir klar, allerdings stehe ich wieder ohne konkrete Lösungsidee da. Im Anhang habe ich mal das Projekt mit obiger (falscher) Idee.

Danke im Voraus,

Stefan

07.05.2007 - 19:04 Uhr

Salut,

exakt das, was ich gesucht habe.

Dankeschön

05.05.2007 - 19:57 Uhr

Salut,

hm, beides nicht ganz das, was ich mir vorstelle.

Text kann ich durchaus im OwnerDraw-Mode malen, die Progressbar könnte ich mit Draw/FillRectangle grundsätzlich auch zeichnen. Allerdings würde ich gerne das Aussehen der "normalen" Progressbar imitieren. Ich meine irgendwo gelesen zu haben, dass das mit irgendeinem "Render" gehen würde...

Stefan

04.05.2007 - 20:11 Uhr

Salut,

in irgendeinem Thread meine ich mal gelesen zu haben, dass es möglich wäre Controls (so auch die ProgressBar) zeichnen zu lassen und nicht als Control zu verwenden.

Hintergrund: In den OwnerDrawn-Items einer ListBox möchte ich gerne einen Fortschritt anzeigen und würde dafür gerne eine Fortschrittsanzeige wie die ProgressBar malen.

Was ist dafür das passende Suchwort, bzw. wo finde ich entsprechende Links?

Danke im Voraus,

Stefan

29.04.2007 - 13:17 Uhr

Salut,

hm, die Lösung wie ich sie mir gewünscht hätte, ist leider nicht dabei. Ist dieses Thema derart abwegig, dass sich da bei den Betriebssystemherstellern noch keine Gedanken gemacht hat?

Aber Danke trotzdem,

Stefan

27.04.2007 - 11:09 Uhr

Salut,

ich kann gerne posten, was ich probiert habe:
Ich habe das Package für debian heruntergeladen und entpackt. Darin war dann eine data.tar.gz, die ich ebenfalls entpackt habe. Anschließend konnte ich eine Container-Datei erstellen, aber leider nicht mounten:


benutzer@rechner ~/Downloads/truecrypt-4.3/usr/bin >./truecrypt -c /home/benutzer/tc/test.tc
...

Done: 8.55 MB  Speed: 4.28 MB/s  Left: 0:00:00  pc
Volume created.
benutzer@rechner ~/Downloads/truecrypt-4.3/usr/bin >./truecrypt /home/benutzer/tc/test.tc /home/benutzer/tc/crypted
Administrator (root) privileges required
benutzer@rechner ~/Downloads/truecrypt-4.3/usr/bin >

Stefan

27.04.2007 - 11:01 Uhr

Salut,

unter Linux erhalte ich die Meldung, dass Administratorrechte benötigt würden. Die habe ich leider nicht.

Stefan

27.04.2007 - 10:35 Uhr

Salut,

da ich mit meinem USB-Stick auch Daten transportieren will, die einem potentiellen Finder nicht zugänglich sein sollen, bin ich auf der Suche nach einer Möglichkeit, die Daten sowohl unter Windows als auch Linux zu verschlüsseln.

TrueCrypt ist eine sehr schöne Lösung, allerdings ist dieses auf dem Ziel-Linux-Rechner nicht installiert, auf dessen Installation ich leider auch keinen Einfluss habe. Ohne Installation läuft das aber nicht.

Leider habe ich bis jetzt keine passende Lösung gefunden. Es kann doch nicht sein, dass man dann nur über verschlüsselte Archive arbeiten kann? Vielleicht hat ja jemand eine andere Lösung gefunden?

Danke im Voraus,

Stefan

05.04.2007 - 17:26 Uhr

Salut,

die Version vom Webserver kam in der Tat besser mit Vista klar. Allerdings musste ich da auch noch das WMI Repository reparieren lassen, was mich dann auch noch ein paar Installationsversuche kostete.
Danke.

Die ersten Gehversuche hab ich auch schon hinter mir. So habe ich eine Datenbank und eine Tabelle angelegt mit ein paar Datensätzen. Diese kann ich auch mit einer C# Applikation auslesen, falls diese mit Admin-Rechten gestartet wird.
Wie kann ich denn auch meinem Standard-Benutzer Zugriff gewähren?
Ich nehme an, dass ich da die Permissions für die entsprechende Tabelle setzen muss, allerdings will er da meinen String DOMAIN\Benutzer als Objektnamen partout nicht akzeptieren...
Weiß jemand Rat?

Danke im Voraus,

Stefan

04.04.2007 - 19:09 Uhr

Salut,

nachdem ich mit Datenbanken bisher nur unter PHP zu tun hatte, wollte ich nun auch mal Datenbanken unter C# Express testen.

Dazu habe ich den SQL-Express Server von der VC# CD nachinstalliert, worauf mir der Installer am Ende dann mitteilte, dass die Installation nicht erfolgreich verlaufen sei. Dennoch tauchen unter installierter Software drei neue Einträge

Microsoft SQL Server Native Client
Microsoft SQL Server Setup Support Files (English)
Microsoft SQL Server VSS Writer

auf.

Bei den Diensten taucht ein deaktivierter "SQL Server VSS Writer" auf.

Nach folgendem Blog-Eintrag habe ich auch noch das Microsoft SQL Server Management Studio Express installiert:
Getting things working on Vista

Jetzt habe ich folgende Fragen:1.Welche Updates und SPs brauche ich, um den SQL-Server unter Vista zum Laufen zu bekommen? 1.Ist das SQL Management Studio Express so etwas ähnliches wie phpMyAdmin (sprich Verwaltung DBs)? 1.Wie verbinde ich mich aus dem Management Studio mit dem Server (localhost hat z.B. nicht funktioniert)?

Für eine Klärung dieser Fragen wäre ich sehr verbunden,

Stefan

19.03.2007 - 18:25 Uhr

Salut,

das SDK habe ich nicht zusätzlich installiert, das Stichwort dexplore.exe hat mich aber auf die richtige Spur gebracht. Bei meiner VC#Express Edition reicht der Aufruf von dexplore.exe im Pfad

C:\Program Files\Common Files\microsoft shared\Help 8

Edit
Der Aufruf klappt nur, wenn die Hilfe bereits aufgerufen wurde. Mit

dexplore.exe /helpcol ms-help://MS.VSExpressCC.v80 /LaunchNamedUrlTopic DefaultPage /usehelpsettings WindowsSDK.1.0

funktioniert das auch ohne vorigen Aufruf

Danke,

Stefan

19.03.2007 - 17:46 Uhr

Salut,

gibt es eine Möglichkeit, die MSDN Express Edition direkt aufzurufen (also ohne zuerst die IDE zu starten)? Im Startmenü finde ich leider keinen Eintrag, im entsprechenden Programme-Ordner habe ich auch nichts passendes gefunden.

Danke im Voraus,

Stefan

13.03.2007 - 11:39 Uhr

Salut,

Original von LastGentleman
Wollte mal einen groben Überblick über Version 3.0 haben und hab das Buch bestellt, werde eine Rezision darüber schreiben. Ihr hört noch von mir.

Lg
L.G.

Hast du mal in das Buch reingeschaut? Wenn es gut ist, würde ich es mir evtl. auch kaufen 😉.

Stefan

13.03.2007 - 11:08 Uhr

Salut,

sag bloß, du hast noch nichts von der Windows-Version von Linux gehört. Die wurde von MS nach der Kooperation mit Novell doch schon im Herbst angekündigt. Endlich ein leicht zu installierendes Windows mit DRM und Aktivierung 😄.

Nein im Ernst, du hast ja Recht. Ich meinte eine Windows-Version von Lemmings.

Stefan

12.03.2007 - 16:24 Uhr

Salut,

leider hat die DHTML-Variante zu wenig Level. Und die Java-Version benötigt eine Lizenz für die Windows-Version von Linux. Auch ganz nett ist Pingus, das aber auch unter Level-Mangel leidet...

Stefan

08.03.2007 - 10:16 Uhr

Salut,

ich erreiche die Seite.

Stefan

05.03.2007 - 18:58 Uhr

Salut,

auf meiner ehemaligen Schule gibt es noch nicht mal die aktuellen Studenplan-Änderungen im Internet...

Stefan

22.02.2007 - 11:47 Uhr

Salut,

dann schau mal hier vorbei, da hab ich einiges gefunden:
InterfaceLIFT

Stefan

17.02.2007 - 18:31 Uhr

Salut,

naja, wenn ich das hier so frage, dann wohl nicht 😉.

Allerdings hatte ich auch nicht an .NET 3.0 gedacht. Zur Zeit zögere ich den Umstieg noch raus. Schließlich programmiere ich mit der Express Edition und mit der neuen Version fallen ja wieder einige Betriebssysteme (Win98 ) "hinten runter".

Vielleicht hat sich ja schon jemand mit .NET 2.0 darüber Gedanken gemacht?

Stefan

17.02.2007 - 17:03 Uhr

Salut,

diejenigen, die Vista bereits einmal gesehen haben, werden im Explorer auch die Spaltenheader bemerkt haben, die nun bei allen Anzeigemodi (also auch LargeIcon und List) zur Verfügung stehen, um den Inhalt des ListViews zu sortieren.

Hat schon jemand probiert, dass für ein ListView-Objekt in C# zu implementieren? Auf den ersten Blick habe ich nichts gefunden, was mir da weiterhilft. Da scheint die Anzeige der ColumnHeader an View.Details gebunden zu sein.

Danke im Voraus,

Stefan

06.02.2007 - 09:03 Uhr

Salut,

die T60 Serie gibt es jetzt auch im Breitbildformat.

Stefan

08.01.2007 - 13:58 Uhr

Salut,

wieder ein Update, diesmal wurde das TodoList PlugIn überarbeitet
.

Dieses ist nun kompatibel mit dem TodoList PlugIn für SharpDevelop 2.0, d.h., dass sich die Todo-Dateien sowohl in vbtricksMyTools als auch in SharpDevelop 2.0 bearbeiten lassen.

zum TodoList PlugIn für SharpDevelop 2.0
Dieses hatte ich noch nicht vorgestellt, es erlaubt die Protokollierung von Änderungen an einem Projekt und stellt außerdem eine Liste zur Verfügung, in der man anstehende Todos verwalten kann. Durch die farbliche Hervorhebung fällt es dadurch leicht, die entsprechenden Aufgaben in der Reihenfolge ihrer Priorität abzuarbeiten.
Außerdem generiert das PlugIn dann eine ChangeLog-Datei für den Endanwender.

Ein entsprechendes PlugIn für VisualStudio scheitert zur Zeit noch daran, dass ich nur die Express Edition habe.

Achtung
Da ich das zugrundeliegende Control für die TodoList neu programmieren musste, um beide Projekte zusammenzuführen, wurde auch das Dateiformat geändert.
Die alte Todo-Datei wird nicht überschrieben, aber nicht mehr genutzt. Die alten TodoEinträge finden sich in der Datei todos.xml im Unterverzeichnis AppData\Roaming\vbtricks\vbtricksMyTools (variiert leicht je nach Windows Version) eures Profilverzeichnisses.

Downloadlink siehe oben.

Stefan

05.01.2007 - 18:15 Uhr

Salut,

klar, das ist gefährlich.

Aber wie bekomme ich denn da mit, dass noch ein Doppelklick folgen wird?

Stefan

05.01.2007 - 17:55 Uhr

Salut,

wie verhindere ich denn am elegantesten, dass sich die Checked-Eigenschaft beim Doppelklick auf ein ListViewItem ändert?

Im DoubleClick-Ereignis das ganze wieder rückgängig zu machen, ist doch reichlich unelegant.

Danke im Voraus,

Stefan

05.01.2007 - 11:53 Uhr

Salut,

ok, Einwand akzeptiert. Ich downloade jetzt in ein Byte-Array. Beim obigen Testschreiben in eine Datei wird die Datei auch korrekt geschrieben, eine Exception bei FromImage wird nicht mehr geworfen, sodass ich das ganze auf folgendes reduzieren konnte:


        internal void PreviewContent(byte[] p)
        {
            Stream a = new MemoryStream(p);
            Image i = Image.FromStream(a);
            pictureBox1.Image = i;

        }

Jetzt tut's, danke,

Stefan

05.01.2007 - 09:53 Uhr

Salut,

einen StringReader verwende ich doch gar nicht?

Der MemoryStream scheint ja soweit in Ordnung zu sein, die Position steht auf 0, die Länge ist auch korrekt.

Habe das ganze jetzt mal in eine Datei schreiben lassen:


            Stream a = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(p));
            Image i = null;
            try
            {
                byte[] buffer = new byte[a.Length];
                a.Read(buffer, 0, Convert.ToInt32(a.Length));
                FileStream sb = new FileStream("D:\\test.txt", FileMode.Create);
                sb.Write(buffer, 0, Convert.ToInt32(a.Length));
                sb.Close();
                a.Position = 0;
                i = Image.FromStream(a);
            }
            catch (Exception ex)
            {
            }

Im Vergleich mit dem Hexeditor sieht's so aus, als ob die Codierung nicht stimmen würde. Kann mich jemand mit der Nase draufstoßen, welche Codierung ich verwenden muss?

Danke im Voraus,

Stefan

04.01.2007 - 19:48 Uhr

Salut,

ich versuche, ein Image aus der Antwort eines Servers zu laden.

In meiner Download-Klasse, füge ich den Inhalt des ResponseStreams mit einem StringBuilder zusammen:


StringBuilder requestData;
byte[] BufferRead;
// ...

requestData.Append(Encoding.ASCII.GetString(BufferRead, 0, read));

Anschließend lasse ich mir den Inhalt von requestData in einen String schreiben.

Aus diesem String möchte ich dann das Bild laden:


        internal void PreviewContent(string p)
        {
            // System.IO.StringReader a = new System.IO.StringReader(p);
            Stream a = new MemoryStream(System.Text.Encoding.Default.GetBytes(p));
            Image i = Image.FromStream(a);

            PictureBox b = new PictureBox();
            b.Dock = DockStyle.Fill;
            b.Image = i;
            this.Controls.Add(b);

        }

Allerdings bekomme ich dann bei der Zeile


Image i = Image.FromStream(a);

eine Exception "Parameter is not valid".
Die ReadTimeOut-Eigenschaft von a enthält den Wert 'a.ReadTimeout' threw an exception of type 'System.InvalidOperationException'.

Speichere ich den Inhalt des Strings in eine Datei (Encoding.Default), ist die Datei korrekt.

Leider kann ich nicht direkt auf den Stream der HTTPWebResponse zugreifen, da ich den Inhalt auch als String benötige.

Wie konvertiere ich den Inhalt korrekt in einen Stream?

Danke im Voraus,

Stefan

04.01.2007 - 18:59 Uhr

Salut,

512MB pro Gast-System ist etwas hoch gegriffen.

Mit 1GB fürs gesamte System habe ich keinerlei Probleme. Ich verwende Vista, was im Leerlauf zwischen 400 und 500MB verbraucht. Mit den Standardprogrammen (Browser, Email, Chat) und VC# Express sind es dann etwa 600MB. Dann bleiben für den Gast immer noch 400MB.
Damit kommt sowohl ein Ubuntu als auch Windows XP locker aus, da du im Gastsystem ja nicht nebenher zusätzlich noch einen Browser... laufen hast.

Für HTML reicht ein Editor mit Syntax-Highlighting.

NDoc ist noch praktisch.

WLAN-Scanner gibt's hier: http://www.netstumbler.com/.

Stefan

03.01.2007 - 19:53 Uhr

Salut,

ja, das passt so.

Vielen Dank,

Stefan

03.01.2007 - 19:23 Uhr

Salut,

vor einiger Zeit habe ich mal einen Tipp gefunden, wie man den Explorer aufruft, sodass dieser automatisch einen bestimmten Ordner anzeigt und eine Datei markiert.

Jetzt, wo ich es brauche, finde ich es leider nicht mehr.

Weiß jemand, mit welchen Parametern ich die Explorer.exe aufrufen muss?

Danke im Voraus,

Stefan

03.01.2007 - 19:18 Uhr

Salut,

die XML-Datei kannst du dann z.B. durch NDoc jagen und bekommst eine schöne, übersichtliche Dokumentation im chm-Format. Oder du lässt es als html... exportieren.

NDoc gibt es hier: http://ndoc.sourceforge.net/
leider gibt es bis jetzt noch keine offizielle Version für .NET 2.0, folgende Version funktioniert aber bei mir einwandfrei:
http://jonas.lagerblad.com/blog/?p=4.

Stefan

10.12.2006 - 11:41 Uhr

Salut,

die Handle des Fensters existiert doch nachdem ich die Show-Methode aufgerufen habe, ein manuelles CreateHandle danach liefert auch prompt einen Fehler...

Stefan

10.12.2006 - 11:18 Uhr

Salut,

soweit bin ich jetzt:


[DllImport("user32.dll")]
private static extern int GetSystemMenu(int hwnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int AppendMenu(int hMenu, int Flagsw, int IDNewItem,
    string lpNewItem);
[DllImport("user32.dll")]
private static extern int SetSystemMenu(int hwnd, int Menu);
[DllImport("user32.dll")]
static extern IntPtr CreatePopupMenu();


public Form1()
{
    InitializeComponent();
    this.Show();
    int Menu1 = GetSystemMenu(this.Handle.ToInt32(), false);  // get handle to system menu
    //int Menu1 = CreatePopupMenu().ToInt32();
    AppendMenu(Menu1, 0xA00, 0, null);   // makes a separator
    AppendMenu(Menu1, 0, 666, "C# Rules!");
    this.FormBorderStyle = FormBorderStyle.None;
    //SetSystemMenu(this.Handle.ToInt32(), Menu1);
}

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    if (m.Msg == 0x112)
    {    // WM_SYSCOMMAND is 0x112
        if (m.WParam.ToInt32() == 666)
        {   // the Menu's ID is 666
            //everything in here will run when menu is clicked
            MessageBox.Show("Yo!");
        }
    }
}

Wenn ich die Zeile


this.FormBorderStyle = FormBorderStyle.None;

auskommentiere, wird ein neuer Eintrag zum Systemmenü hinzugefügt, mit der Zeile klappts nicht. Lass ich die Zeile


SetSystemMenu(this.Handle.ToInt32(), Menu1);

wieder zu, tut es nicht. Da scheint die Deklaration nicht zu stimmen...

Stefan

10.12.2006 - 10:26 Uhr

Salut,

vom Namen her klingen die schon mal nicht schlecht, allerdings finde ich zu SetSystemMenu bei Google kaum was und die MSDN scheint die Funktion nicht zu kennen (wobei das nichts heißen muss, wenn ich was in der MSDN nicht finde, die gehört zu einer der unübersichtlichsten Seiten im Web).

Hast du vielleicht ein Beispiel zur Hand?

Stefan

10.12.2006 - 09:34 Uhr

Salut,

wieder was dazugelernt.

Stefan

09.12.2006 - 19:55 Uhr

Salut,

Original von herbivore
Hover: Mal abgesehen davon, dass CreateGraphics tendenziell ein Hinweis ist, dass was mit dem Design der Anwendung nicht stimmt (normalerweise kommt man mit den im OnPaint übergebenen Graphics-Objekten hin), bezieht sich ein Graphics-Objekt für eine Form meines Wissens immer auf die ClientArea und wird entsprechend an den Grenzen der ClientArea geclipt.

hm, ich male aber eigentlich im ClientArea der Form, ClipBounds und VisibleClipBound scheinen von den Werten in Ordnung zu sein.

Wenn ich kein CreateGraphics verwenden darf, wie male ich dann bei einem Hover auf die Form? Ein OnPaint wird da ja nicht ausgelöst und ein Me.Refresh() ist ja wohl nicht elegant.

Stefan

09.12.2006 - 10:17 Uhr

Salut,

ich bin gerade dabei, eine eigene Form-Klasse mit individuellem Design zu erstellen. Diese wird von System.Windows.Forms.Form abgeleitet. Inzwischen bin ich auch schon soweit, dass sich die Form in der Größe ändern lässt.

Leider gibt es noch ein paar offene Fragen:*Überladen der FormBorderStyle-Eigenschaft
Da die Klasse intern auf einer Form mit FormBorderStyle=None aufsetzt, würde ich die FormBorderStyle-Eigenschaft gerne überladen, um die Änderung dieser Eigenschaft nicht auf die interne Form zu übertragen

*Systemmenü
Gibt es eine Möglichkeit, das Systemmenü anzuzeigen, obwohl die Form BorderStyle=None hat oder alternativ ein eigenes Menü beim Rechtsklick auf die Schaltfläche in der Taskleiste anzuzeigen?

*Kein Refresh beim Hover
Eigentlich sollen die Buttons in der Titelleiste beim Hover mit anderen Grafiken übermalt werden, dafür erstelle ich mit CreateGraphics für die Form ein Graphics Objekt, aber wenn ich in dieses male, wird der Inhalt der Form nicht aktualisiert.

*Code einigermaßen im .NET-Sinne?

Selbstverständlich bin ich für alle Verbesserungsvorschläge offen.

Da das ganze relativ umfangreich ist, stelle ich den Code als VS-Solution zum Download: gui.zip

Wenn jemand die Zeit finden würde, und mir bei der Klärung obiger Fragen behilflich sein könnte, wäre ich sehr dankbar,

Stefan