Laden...
R
Rasta myCSharp.de - Member
Informatikkaufmann Dabei seit 19.09.2007 258 Beiträge
Benutzerbeschreibung

Forenbeiträge von Rasta Ingesamt 258 Beiträge

16.06.2010 - 11:41 Uhr

An WPF hatte ich auch schonmal gedacht. Aber bevor ich das mache, liefere ich erstmal ab, was ich habe. Der GUI-Teil ist nämlich gar nicht gefordert gewesen, nur der Parser. Aber ich wollte halt ne visuelle Überprüfung haben ob der auch richtig parst ^^

Wo ich den Artikel "Typography in WPF" so lese...das ist ja richtig gut was da geboten wird. Da kommt anscheinend so ein "WinForms sind tot"-Gedanke hoch 😉

Danke dafür.

Gruß, Rasta

16.06.2010 - 10:13 Uhr

Das Problem ist, dass ich einen Parser + GUI für ein Layoutformat baue.
Sowohl Zeichenhöhe als auch Zeichenabstand wird in Gleitkomma-Millimetern angegeben. Einfach Leerzeichen dazwischenschieben ist viel zu ungenau.

Der TextRenderer scheint aber schon vielversprechend zu sein. Momentan zeichnet er mir noch alles zu klein, woran könnte das liegen? Ich übergebe dem TR das gleiche Font-Objekt wie Graphics.DrawString.
Interpretiert der TR die Angabe "2.34mm" etwa anders? 😉

Danke schonmal, wenns nicht richtig klappt frag ich nochmal.

@herbivore: Das hat mir Google leider auch gesagt. In .NET war ein vernünftiger Schriftsatz scheinbar nicht vorgesehen (bzw. bei DrawString etc.).

Möglicherweise muss ich wirklich aus jedem Wort ein Char-Array machen und jeden Buchstaben einzeln mit dem richtigen Abstand zeichnen. Schaun wa moal...

Gruß, Sascha

16.06.2010 - 09:43 Uhr

Hallo,

gibt es eine Möglichkeit bei Graphics.Drawstring den Zeichenabstand zu verändern?
Weder bei System.Drawing.Font noch bei DrawString hab ich eine Letter-Spacing Eigenschaft gefunden.

Muss ich das selbst coden? Und wenn ja: Wie berechne ich die Breite eines Buchstabens, damit ich diese Breite auf die X-Koordinate aufaddieren kann?

Gruß, Rasta

10.06.2010 - 11:55 Uhr

Hab ich mir doch gedacht 😉

Zu meinem Problem mit dem skalieren...ich werde das jetzt ohne umwandeln lösen. Braucht zwar n bischen Mathematik (nicht gerade meine Stärke), ist aber langfristig vermutlich die bessere Lösung.

Danke schonmal.

Gruß Rasta

10.06.2010 - 11:45 Uhr

Ich hab das nur fürs Verständnis gesagt, ich rechne die Koordinaten einfach um.

Jack: Worin unterscheidet sich Graphics.Transform.Scale zu Graphics.ScaleTransform?

10.06.2010 - 11:31 Uhr

B ist das Property von b.

Ich werde mal das Problem beschreiben, damit vielleicht die Frage klarer rüberkommt:

Ich habe ein XML, in dem Textfelder gespeichert sind:

<Textvariable name="G_D03" posx="45,6" posy="62,6" />

Jetzt soll in eine Picturebox das Attribut "name" geschrieben werden und zwar an der angegebenen Position (wird mal ein Layout-Anzeigeprogramm).

Das Schreiben klappt schon ganz gut, allerdings hängen die Schriften alle ineinander weil die Picturebox ein anderes Koordinatensystem hat wie das XML. Wenn man die Picturebox auf die Größe 85x53 verkleinert stimmts...aber das ist so klein dass man nichts mehr lesen kann.

Jetzt wollte ich einfach ein Bitmap mit 85x53 erstellen und dann auf die volle Größe der Picturebox skalieren. Interpolation und Klötzchenbildung interessieren mich erstmal nicht.

Vielleicht gibts dazu ja noch einen einfacheren Ansatz.
Btw: Das Koordinatensystem des XMLs hat den Nullpunkt in der unteren linken Ecke, die Picturebox leider oben links. Der Nullpunkt bei "DrawString" ist oben links, bei meinem Layout auch unten links. Da werde ich vermutlich ziemlich viel rechnen müssen. Oder gibt es eine Möglichkeit dieses Verhalten zu ändern?

Gruß, Rasta

10.06.2010 - 11:01 Uhr
            B.ScaleTransform(0.5F, 0.5F);
            B.DrawImage(pictureBox1.Image,new Point(0,0));
            B.ScaleTransform(2.0F, 2.0F);
            B.DrawString("Horst", new Font("Arial", 10.0F), Brushes.Red,new PointF(20.0F,20.0F));


            pictureBox1.Image = b;

So hab ichs gemacht, funktioniert aber immer noch nicht.

Gibt es keine Möglichkeit, einfach die komplette PictureBox zu skalieren? Ich will eigentlich nicht jeden einzelnen String bearbeiten. Einfach alles doppelt so groß, das reicht mir schon.

10.06.2010 - 10:16 Uhr

Hallo,

ich erstelle ein Bitmap mit Text, das ich dann einer PictureBox übergebe.

Allerdings würde ich das ganze jetzt gern skalieren und genau das funktioniert nicht.

            Bitmap b = new Bitmap(pictureBox1.Image);

            Graphics g = Graphics.FromImage(b);
            g.DrawString("Horst", new Font("Arial", 10.0F), Brushes.Red,new PointF(20.0F,20.0F)); //Funktioniert
            g.ScaleTransform(1.5F, 1.5F);//Funktioniert nicht

            pictureBox1.Image = b;

Das "Horst" erscheint in roter 10pt Schrift, allerdings sollte es durch das skalieren größer sein.

Was mache ich falsch?

Gruß, Rasta

07.06.2010 - 10:13 Uhr

Stimmt, da hab ich Lambda und anonyme Methoden verwechselt. Ich benutze den Kram noch nicht lang 😉

@JunkyXL:

Meinst du z.B. so (ich wusste bis gerade gar nicht, dass man das sogar mehrfach verwenden kann):


Fulltextlist.FindAll(str => str.Contains("*tt=") || str.Contains("*zsl=")

Ihr habt natürlich beide Recht, das war auch der Grund für meinen Post.
Der Code wird allerdings nur einmal aufgerufen (Ganz am Anfang, um nach "tt" und "zsl" aufzutrennen).
tt und zsl sind die Kürzel für TrueType und Unicode-Schriftarten. Das Format was ich parse ist so unglaublich selten dass es sogar bei verschiedenen Maschinen des gleichen Herstellers variiert 😉

Das mit den Breakpoints klappt allerdings nicht. Es wird der ganze Block von oben bis unten rot hinterlegt. Wenn man allerdings dann mit F11 durchgeht, wird jede einzelne Anweisung durchgegangen. Da aber gleich am Anfang ein FindAll auf ne Liste aufgerufen wird die ungefähr 50 Einträge hat, muss man verdammt oft auf F11 hauen bevor das erste if() aufgerufen wird. Das stört mich ein bischen.

EDIT: Hab mich geirrt, innerhalb des Delegaten klappts.

Gruß, Rasta

07.06.2010 - 09:37 Uhr

Hallo,

für einen Parser hab ich gerade folgende "Zeile" geschrieben:

            Dictionary<int, Schriftart> Schriftart_List = Fulltextlist.FindAll(
delegate(string str)
{
    return str.Contains("*tt=") || str.Contains("*zsl=");
}
).ConvertAll(
delegate(string str)
{
    Schriftart schrift;
    schrift.Typ = "";
    schrift.Name = str.Substring(str.IndexOf('=') + 1, str.IndexOf(' ') - str.IndexOf('=') - 1);
    schrift.ganze_zeile = str;

    if (str.StartsWith("*tt="))
    {
        schrift.Typ = "TrueType";
    }
    else if (str.StartsWith("*zsl="))
    {
        schrift.Typ = "Unicode";
    }

    return schrift;
}).ToDictionary(p => Fulltextlist.IndexOf(p.ganze_zeile));

Abgesehen von den Variablennamen (ich programmiere immer eine Methode on-the-fly und machs nachher schön)...mich überkommt der Eindruck dass man den ganzen Kram nicht mehr in einen einzelnen Befehl packen sollte. Ein Nachteil der mir direkt aufgefallen ist: Der Debugger behandelt das Ding als eine Zeile, wodurch man keine Haltepunkte setzen kann.

Wie macht ihr das? Habt ihr eine bestimmte Menge an Befehlen, bis zu denen ihr noch Lambda verwendet und ab der ihr eine Methode schreibt?

Gruß, Sascha

09.03.2010 - 10:10 Uhr

s4rge: Klar, ipconfig kann das 😉

08.03.2010 - 10:49 Uhr

Wenn ihr ne gute Firewall mit Authentifizierung habt, würde ich mir ein Programm schreiben was einer Gruppe die Internetberechtigung an der FW entzieht.

Wenn das nicht der Fall ist, könnte man wirklich Gateway und DNS aus der ipconfig der Rechner löschen, vermutlich hat das aber auch unerwünschte Nebenwirkungen. Beispielsweise keine Namensauflösung im Intranet, Netzlaufwerke sind vermutlich auch nicht begeistert...

Gehe ich recht in der Annahme dass der Lehrer-PC noch Internet behalten soll?
Meiner Meinung nach kommst du um einen Verzeichnisdienst nicht herum.

Setz die Lehrer-PCs z.B. im Active Directory standardmäßig in ne Gruppe "Internet", die SchülerPCs fügst du mit Kommandozeilenbefehlen aus deinem Programm hinzu. Wenn Internet aus sein soll holst du Sie wieder aus der Gruppe raus.
An der Firewall musst du dann noch einstellen dass die Gruppe "Internet" auch Internetzugriff hat - und zwar nur die.
Vorteil: Kannst du auch auf Userebene machen damit die Schüler nicht einfach mal Internet haben weil Sie sich an den Lehrer PC gesetzt haben (Oder sich den einfach schnappen und an nem Schülerplatz aufbauen 😉).

Man könnte auch ein MAC-Filtering am Switch/Router umsetzen. Je nach Infrastruktur (baum) sperrt man damit aber auch den Schul-Fileserver aus.
Wenn man einen Router mit Web-Interface hat kann man da was basteln. Dürfte aber recht lange dauern nen richtigen HTML-Stream zurückzuschicken, denke ich. Zumindest ohne Doku.

Man könnte auch die DNS-Einstellung der PCs auf 0.0.0.0 setzen und dann "ipconfig /flushdns" ausführen. Auf diese Weise gibts dann aber auch kein Schul-Intranet mehr (Zumindest nicht mit Namensauflösung). Ich glaube aber nicht dass sich ein Schüler mehr als eine IP merken kann (bzw. überhaupt darauf kommt sich die aufzuschreiben).

Mit GPOs kenn ich mich nicht so aus, aber da man da jeden Shice einstellen kann gibts dafür bestimmt auch ne Einstellung.

Gruß, Sascha

27.10.2009 - 13:53 Uhr

Stimmt, wenns deine eigene Assembly ist, kannst du irgendein Attribut damit vollknallen. Wenns eine ist, auf die du keinen Einfluss hast, weiss ich sonst auch nicht mehr weiter.

27.10.2009 - 12:55 Uhr

Ich würde das "Änderungsdatum" Attribut der exe/dll aulesen, das ist die Zeit, in der die Datei erstellt wurde.

Reicht dir das?

27.10.2009 - 12:51 Uhr

An der Stelle wundere ich mich auch immer wieder mal, warum ich nix bekomme, obwohl der Stream tausende Bytes hat. Das mit dem Seek(); muss einem schon in Fleisch und Blut übergehen, damit das nich mehr passiert.

27.10.2009 - 12:45 Uhr

Spätestens der CLR Code ist sowieso voller goto, das einzige was dran schlimm ist, ist der undurchsichtige Programmablauf. Das bekommt man aber mit sprechenden Label-Namen und Code-Dokumentation wunderbar in den Griff.

27.10.2009 - 12:32 Uhr

Nach dem, was ich über Win7 bisher gelesen habe, unterstützen diese Bibliotheken nur Netzlaufwerke, die mit win7 oder server 2008 freigegeben werden.

23.10.2009 - 13:12 Uhr

Wow, das is ja n cooles Programm. Direkt mal ausprobiert 😉

23.10.2009 - 12:51 Uhr

Ist bei mir auch so, unsere Firewall erlaubt nur den Firefox für direkt Internetkommunikation.

Falls du nur ausprobieren willst, wie pop-verkehr funktioniert, kannst du dich ja vertrauensvoll an einen internen Mailserver wenden. Zur Not installierst du einen auf einem anderen Rechner.

Gruß, Rasta

23.10.2009 - 12:45 Uhr

Wie das jetzt hardware- und treibertechnisch in .NET umgesetzt ist, weiss ich nicht, es ist halt so, dass der Stream die Daten nicht enthält, die du haben willst, sondern dass in einem Stream immer nur Abschnitte gelesen werden, sobald man das will (z.B. mit ReadLine();).

Zu DirectSound gibts auf CodeProject gute Anleitungen, da kannst du dich mal durcharbeiten.

Gruß, Rasta

23.10.2009 - 12:43 Uhr

Die bekannten Programme wie jDownloader machen das entweder über eingebaute OCR oder verwenden den (sehr guten) Abby Finereader für ihre Zwecke. Diesen Weg würde ich auch gehen. Allgemein gilt halt, dass du das Bild herunterladen musst, den Wert ermittelst und dann in die Textbox daneben diesen wert reinschreiben musst.

Wenn das nicht unbedingt nötig ist, nimm den jdownloader, der macht seine Sache gut. 😉

BTW: Rapidshare hat keine Captchas mehr, aber die meisten anderen Filehoster schon.
Dafür hat RS eine Zeitverzögerung für alle Free-User eingebaut, da musst du deinem Programm halt sagen, es soll warten, bis die Zeit auf 0 Sek steht.

Gruß, Rasta

23.10.2009 - 12:38 Uhr

Google ist dein Freund: Adress Resolution Protocol. Wandelt IPs in physikalische Adressen um, bei Windows PCs sind das MAC Adressen. Auf MAC-Rechnern heisst das ganze LLC, glaub ich.

23.10.2009 - 12:36 Uhr

Es gibt übrigens das commandlinetool getmac, das bei windows dabei ist:

C:\Dokumente und Einstellungen******>getmac

Physikal. Adresse Transportname
=================== ==========================================================
00-21-5A-C5-EE-09 \Device\Tcpip_{03868360-CB56-457D-A837-DA2E7EC6DBE7}

Bau das doch einfach ein, da brauchst du nur ein Process.Start und fertig ist der lack 😉

Gruß, Rasta

23.10.2009 - 12:32 Uhr

Wäre das ARP ne Option? Das ist ja genau dazu gedacht, das zu tun.

Was du da geschrieben hast, verstehe ich ehrlich gesagt gar nicht, SELECT ist für mich ein SQL Befehl oO

Für ARP brauchst du meines Wissens nur die IP, und die sollte ja herauszubekommen sein. Entweder so, oder per DNS auflösen.

Gruß, Rasta

23.10.2009 - 12:26 Uhr

Der Plan war folgender: **Du liest die Kommunikation mit und merkst dir die Stelle, an der das gesendet wird, was wie ne Device ID aussieht **(musst du wissen). Dann kannst du an jedem weiteren Gerät die ID mit regex erkennen.

das bringt mir ja nichts weiter zumal die sniffer-software nur auf meinen rechner installiert ist. ich kann doch nicht auf 50rechner die software installieren 😃

was ich bräuchte wäre ein c#-sniffer code 😃

Hi,

  1. brauchst du hier keinen fertigen code zu erwarten, das verstößt sogar gegen die Posting Regeln. Da ich kein Paragraphenshicer bin wie manch andere hier, werde ich die jetzt nicht haarklein posten.

  2. Du hast doch jetzt die Device ID. Nimm dir doch die Stelle, an der die gesendet wurde, und schreibe ein C# Prog, dass genau die Kommandos zum Gerät schickt, die der Sniffer mitgelesen hat. Versuche also, Schritt für Schritt die kommunikation, die der Sniffer dir jetzt gezeigt hat, selbst nachzubauen.

Also: Openport();
Sendmessage("GET DEVICE ID"); //halt, was der sniffer sagt, ich weiss es ja nicht
Receivemessage();
Closeport();

Der C# Code ist trivial, zum Thema Serial Port musst du nur kurz googlen und findest haufenweise Treffer. Aber was du senden musst, und was du daraufhin zurückbekommst, das weisst nur du, denn du hast ja ne Beispielkommunikation mitgesnifft.

Zum Thema Legalität: Das interessiert mich gar nicht, jeder muss selbst wissen was gut ist und was nicht. Solange ich keine Anzeige wegen Beihilfe bekomme ist mir das alles egal.

mfg, Rasta

22.10.2009 - 09:58 Uhr

Ja, aber wo sollte ich denn dazu Code haben? Ich kenne dein Gerät doch überhaupt nicht.

Der Plan war folgender: Du liest die Kommunikation mit und merkst dir die Stelle, an der das gesendet wird, was wie ne Device ID aussieht (musst du wissen). Dann kannst du an jedem weiteren Gerät die ID mit regex erkennen.

sowas wie int index = regex.ismatch ("device id:").index //pseudocode!
string ID = substring(index,20);

Das meinte ich.
Dass du nichts auslesen kannst liegt daran, dass das Gerät nicht weiss, was es dir senden soll. Du musst das richtige Kommando schicken (sowas wie GETDEVICEID). Was das für ein Kommando ist, musst wiederum du wissen oder herausbekommen.

Mit C# hab die ganze Sache bisher recht wenig zu tun, programmieren kannst du erst, wenn du die ganzen Infos hast.

22.10.2009 - 09:16 Uhr

Also ich würde auch einfach mal mitlesen, was da durch die Leitung rauscht. Bei 9600 Baud kannste ja eh fast mitlesen 😉

Verschlüsselung: ja, aber vermutlich nicht für die Device ID. Oder das berühmte "Security through Obscurity": Die Device ID wird BinaryBase64 codiert, rückwärts gedreht und davon nochmal n symmetrischer Hash berechnet.
FALLS das so ist: Viel Glück.
FALLS nicht, sollte es recht einfach sein, zumindest die ID zu bekommen, die muss ja irgendwo da drin stehen.

Gibts irgendwo ne Doku über dein Gerät? Ich hab schonmal ne serielle Kommunikation zu nem selbst programmierten Mikrocontroller gemacht, die Schnittstelle für sich gesehen ist einfach wie Sau. Aber die richtigen Strings zu schicken kann einen manchmal in die Verzweiflung treiben (Vor allem wenn Software Handshakes verwendet werden für die berühmte 3-Wire Verdrahtung).

Gruß, Rasta

29.09.2009 - 15:29 Uhr

Quake gibts ja sogar als Nachbau für den rockbox-ipod xD

Aber das in Assembler für nen Taschenrechner zu schreiben...Respekt. Ich programmiere ja sogar meine AVRs in C++ ^^

14.09.2009 - 17:33 Uhr

Bin mir nicht sicher, aber ich glaube du musst deinen Startbeitrag editieren.

Gibts vllt eine nicht obsolete Lösung? Oder gehts wirklich nur so?

14.09.2009 - 15:50 Uhr

Ich hab mir grad nochmal den Startpost durchgelesen.

Wie kommst du denn in das externe, private Netz, per VPN und NAT? Dann wärs gut möglich, dass der ICMP Echo Reply Befehl zwar ankommt, aber die Antwort nicht zu dir zurück. In diesem Fall müsstest du dich mal mit dem Administrator im anderen Netz auseinandersetzen, wie bei denen die Firewall konfiguriert ist.

Nach Möglichkeit mal Wireshark auf deinem und dem Remoterechner laufen lassen, dann sieht man genau was wo durchläuft.

Warum ping -a das kann und dein Programm nicht...keine Ahnung. Vermutlich ist das ping Programm einfach auf mehr Eventualitäten hin entwickelt worden als die .NET Ping Klasse (die ja noch nichtmal Benutzerdefinierte Daten ins Paket schleusen kann).

Es gibt übrigens Ping Bibliotheken im Netz, falls du ping nicht als Prozess starten und an der Console auslesen willst, könntest du das nehmen. Damit hab ich mal (über die Console, nicht in C#) ICMP Pakete mit "Hallo Welt!"-Inhalt durch die Firewall zu mir nach Hause geschleust(Ist aber auch nicht schwierig weil ICMP von innen komplett erlaubt ist).

mfg, Rasta

14.09.2009 - 08:29 Uhr

Wenn du die ursprüngliche Form des Bilds beibehalten willst, ist es doch klar, dass das Bitmap insgesamt größer werden muss. Schliesslich gucken jetzt die Ecken raus 😉

14.09.2009 - 08:26 Uhr

Also, mein Programm, von dem ich den Quelltext oben gepostet habe, macht den Reverse Lookup von externen IPs.

Aus 74.125.43.147 wird bw-in-f147.google.com.

Probier mal genau meinen code bei dir aus, dann kannst du dir sicher sein, worans liegt. Wenns nämlich nicht klappt gibts bei dir ein Netzwerkproblem (z.B. Firewallfilter).
Oder du hast ein anderes Internet als wir xD

mfg, Rasta

10.09.2009 - 15:04 Uhr

NetBIOS...Hab ich ja gar nich mehr dran gedacht. Wie läuft denn das, braucht man da nen extra NetBIOS-Server für?

10.09.2009 - 15:00 Uhr

Ich hab mal ein Programm geschrieben, das PGP verschlüsselte Dateien über IMAP empfangen und dann entschlüsselt und weiterverarbeitet hat (Verschlüsselte Anhänge).

Senden kannst du entweder im .NET über die SMTP Klasse (SMTP is ja kein schwieriges Protokoll) oder du suchst dir eine SMTP Library.

Für die Verschlüsselung musst du PGP installieren, den private Key einspielen, dem Empfänger den öffentlichen und die Passphrase geben und dann per PGP API (nsdpgp.dll und Interop.nsdpgp.dll) die Verschlüsselung machen.

Den Code zur Verschlüsselung habe ich noch, da musst du einen entsprechenden Verweis in VS hinzufügen UND die DLL registrieren. Wie das ging, weiss ich nicht mehr, ist aber fummelig. Die Interop bindest du ins Projekt ein, die nsdpgp.dll kommt in system32 und dann musst du "installutil" oder sowas benutzen. Gibt aber bei PGP ein TXT, wo das erklärt ist.


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using NSDPGP;

namespace Priority_Pass
{
    class PGP
    {
        public void PGPDecode(string inFile, string outFile, string Password)
        {
            try
            {
                NSDPGPClass foo = new NSDPGPClass();
                // foo.EncryptFileEx(Key, "NOSIGN", inFile, outFile, "");
                foo.DecryptFile(inFile, outFile, Password);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Benutzt den Windows-Temp-Pfad
        /// </summary>
        /// <param name="Password">Die Passphrase.</param>
        public string PGPDecode(string inFile, string Passphrase)
        {
            try
            {
                string TempPath = Path.GetTempPath();

                //Datei dekodieren
                NSDPGPClass foo = new NSDPGPClass();
                foo.DecryptFile(inFile, TempPath + "temp001.txt", Passphrase);

                //Datei auslesen
                StreamReader sr = new StreamReader(inFile);
                string decoded = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();

                //Datei löschen
                File.Delete(TempPath + "temp001.txt");

                //Dekodierte Daten zurückgeben
                return decoded;
            }
            catch (Exception)
            {
                return "FAIL";
            }
        }
    }
}


Hoffe, du kannst damit was anfangen. Für den IMAP Empfang hab ich mir ne Library besorgt, sowas gibts bestimmt auch für SMTP. Guck mal auf Codeproject und Sourceforge.

EDIT: Vermutlich wirst du dich irgendwann mit "quoted printable" herumschlagen müssen, da kann ich dir aber auch nur eine Methode geben, die decodiert, nicht encodiert.

mfg, Rasta

10.09.2009 - 14:53 Uhr

Habs mal grad geschrieben:

        //IP zu Name
        private void btIP_Click(object sender, EventArgs e)
        {
            IPHostEntry iphost = Dns.GetHostEntry(tbIP.Text);
            tbHost.Text = iphost.HostName;
        }
        //Name zu IP
        private void btHost_Click(object sender, EventArgs e)
        {
            IPHostEntry iphost = Dns.GetHostEntry(tbHost.Text);
            tbIP.Text = iphost.AddressList[0].ToString();
        }

Löst bei mir im Firmennetz wunderbar alles auf (getestet mit meiner eigenen IP und der von nem Switch, den ich grad im Kopf hatte). Vorsicht: Es wird nur der DNS Server abgefragt, von dem erwähnten Switch weiss ich, dass er gerade stromlos auf dem Boden liegt. Ist also nicht geeignet, um aktive Geräte zu finden.

Was klappt bei deinem Programm genau nicht? Gibts ne Exception?

mfg, Rasta

10.09.2009 - 14:40 Uhr

Zur genauen CSharp Umsetzung kann ich dir nichts sagen, ausser folgendes:

Du brauchst, um IP Adressen in Namen umzuwandeln, den sogenannten Reverse Lookup. DNS ist ein System, um Namen in IPs zu verwandeln, nicht umgekehrt. Der Reverse Lookup ist die genaue Umkehrung davon, verwendet aber auch den DNS.

Du brauchst für eine Namensauflösung zwingend ein DNS System.

IPHostEntry hostEintrag = Dns.GetHostEntry(Hostname);

Das ist ja komplett logisch falsch: Du gibst einen Host an, um einen Host zu bekommen. Was du (nicht getestet) brauchst, ist eher folgendes:


IPEndPoint ipdeshosts = new IPEndPoint(Hostname);

Was aber am einfachsten gehen sollte, ist einfach den Host zu pingen, dann bekommst du die IP automatisch im IPEndPoint. Soviel ich weiss unterstützt die .NET Ping Klasse auch Namen anstatt nur IP Adressen.

Btw: Deine Hostname zu IP Methode sollte eher IPAdress als Rückgabewert haben als einen String, aber das ist ne Designsache...

mfg, Rasta

09.09.2009 - 12:48 Uhr

Brat mir einer nen Storch, das hat geklappt!

            //Basisstream für die XML Conversion
            MemoryStream smmem = new MemoryStream();

            StreamWriter sw = new StreamWriter(smmem,Encoding.GetEncoding("windows-1252"));
            
            xct.Transform(smXML, null, sw);

            StreamReader sr = new StreamReader(smmem, Encoding.GetEncoding("windows-1252"));
            

            File.AppendAllText(@"C:\smxml.xml",smXML.InnerXml);
            //webBrowser1.Url = new Uri(@"C:\smxml.xml");
            smmem.Seek(0, SeekOrigin.Begin);
            webBrowser1.DocumentText = sr.ReadToEnd();

Danke für den Tipp mit dem Reader/Writer, klappt super.

Thema ist damit erledigt.

mfg, Rasta

09.09.2009 - 12:39 Uhr

Mein eingestelltes Encoding des XML ist Windows-1252.

Ich versuchs mal über die Streamreadwriter. Mal sehen, was rauskommt...

09.09.2009 - 10:57 Uhr

So, ich hab jetzt ne semioptimale Lösung gefunden:

  1. XSL für die XslCompiledTransform Klasse aus dem Inet ziehen
  2. Transform machen
  3. Das ganze in einen MemoryStream
  4. Seltsame Byte-Converts
  5. DocumentText füllen

Raus kommt aber leider sowas:


-<ppe>
- 
-<!--  Id des PPE (GUID)
 -->
 <id>4f98554a-96db-43ad-b308-b79a41ce5759</id>
</ppe>

Das ist nicht das komplette XML, aber man sieht, was los ist.

Hier ist mein neuer Code:

            System.Xml.Xsl.XslCompiledTransform xct = new XslCompiledTransform();
            xct.Load(new Uri(@"C:\defaultss.xsl").ToString());
            
            MemoryStream smmem = new MemoryStream();
            xct.Transform(smXML, null,smmem);



            byte[] buf = smmem.ToArray();
            StringBuilder sb = new StringBuilder();
            
            foreach (byte b in buf)
    {
                sb.Append(Convert.ToChar(b));
    }

            File.AppendAllText(@"C:\smxml.xml",smXML.InnerXml);
            //webBrowser1.Url = new Uri(@"C:\smxml.xml");

            webBrowser1.DocumentText = sb.ToString();

mein Problem ist also das Format bei der Rückkonvertierung von byte zu String. Da gehen Umlaute kaputt und noch mehr. jemand hier ne Idee?

08.09.2009 - 13:35 Uhr

Über DocumentText hab ichs auch schon probiert. Seltsamerweise enthält ja DocumentText nach der Aktion mit dem DocumentStream schon mein XML...Es wird nur nicht richtig angezeigt.
Ich nutze jetzt auch das DocumentCompleted Event, weil ich irgendwo gelesen hab, dass das Document asynchron geladen wird. Daher kam wohl mein Update zu schnell. Gebracht hat das aber auch nichts...

08.09.2009 - 13:15 Uhr

Hallo Leute.

Ich habe eine Anwendung geschrieben, die ein XML aus gewissen Daten generiert. Dieses XML wird zur Kontrolle in einem Webbrowser Control angezeigt, hübsch mit Baumansicht und Highlighting, wie man das aus dem IE kennt.
Das klappt aber nur so:


                SMXMLFilepath = sfd_XML.FileName;

                SM sm = new SM();

                //SM-XML erstellen und abspeichern
                StreamWriter sw = new StreamWriter(SMXMLFilepath);
                sw.AutoFlush = true;
                XmlDocument smXML = sm.Karten_zu_XML(ASatz, ESatz, BSaetze);
                sw.Write(smXML.InnerXml);
                sw.Close();



                //Den Webbrowser mit dem SM-XML füttern
                //webBrowser1.Url = new Uri(SMXMLFilepath);
webBrowser1.Update();

sfd_XML ist ein SaveFileDialog. Das XML wird auf der Platte am angegebenen Speicherort abgespeichert und dann in den Webbrowser gefüllt.

Auf diese Art und Weise klappt das ganze. Nett wäre es aber, wenn ich erst das XML anzeigen könnte und DANACH hat der User die Möglichkeit zum Speichern.

Ich habs also so versucht:


#region Test webbrowser ohne gespeicherte Datei füllen
                List<byte> buf = new List<byte>();

                foreach (char c in smXML.InnerXml.ToCharArray())
                {
                    buf.Add((byte)c);
                }
                byte[] buffer = buf.ToArray();
                MemoryStream ms = new MemoryStream(buffer);

                webBrowser1.DocumentStream = ms;
                    
                
#endregion
                webBrowser1.Update();

Wenn ich das allerdings auf diese (umständliche) Art und Weise mache, zeigt mir der Webbrowser die XML Baumstruktur nicht an. Die Ausgabe sieht eher aus, als hätte ich XMLDocument.InnerText anstatt InnerXML benutzt...Beim Debuggen sieht aber alles normal aus. Scheinbar verwirft das Control die XML-Nodes, weil sie keinen HTML Inhalt haben. Aber auch mit händisch eingefügten HTML Starttags klappts nicht. (A lâ "<HTML><Head>...+InnerXML+Endtags)

Hat jemand eine Idee, wie ich das XML in den Webbrowser geprügelt bekomme, ohne eine Datei zwischenspeichern zu müssen?

mfg, Rasta

27.08.2009 - 13:08 Uhr

Hallo,

Wenn ich den Dialog aufrufe, ist er richtig gefüllt, wenn ich jetzt auf den Druck-Button links oben klicke, kommt nur eine weisse Seite raus. Das PrintDocument habe ich verknüpft.

Der Code dazu:


       private void btprintPreview_Click(object sender, EventArgs e)
        {            
            try
            {
                printFont = new Font("Arial", 10);
                printDocumentKI.PrintPage += new PrintPageEventHandler
                   (this.pd_PrintPage);
//Hier hatte ich vorher printDocumentKI.Print(); stehen, aber dann hat er mir direkt beim öffnen des Dialogs die Seiten ausgedruckt (aber dafür richtig).
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                lvgedrucktezeilen = 0; //Wieder zurücksetzen für zweiten Druck etc.
            }

            previewdlg.ShowDialog();

            
        }

        private Font printFont;


        int lvgedrucktezeilen = 0;
        // The PrintPage event is raised for each page to be printed.
        private void pd_PrintPage(object sender, PrintPageEventArgs ev)
        {
            float linesPerPage = 0;
            float yPos = 0;
            int count = 0;
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            string line = null;

            // Calculate the number of lines per page.
            linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);

            while (count < linesPerPage && (lvgedrucktezeilen < lvKI.Items.Count) && ((lvKI.Items[lvgedrucktezeilen]) != null))
            {
                line = lvKI.Items[lvgedrucktezeilen].Text;

                yPos = topMargin + (count *
                   printFont.GetHeight(ev.Graphics));
                ev.Graphics.DrawString(line, printFont, Brushes.Black,
                   leftMargin, yPos, new StringFormat());
                count++;
                lvgedrucktezeilen++;
                if (count >= linesPerPage - 1) //Marge, damit nichts abgeschnitten wird
                {
                    ev.HasMorePages = true; //wenn mehr gedruckt werden muss, als auf die Seite passt, muss noch eine gedruckt werden
                    count = 0; //Seitencounter zurücksetzen
                    break;
                }
                else
                {
                    ev.HasMorePages = false;
                }
            }
        }


Irgendwo habe ich vermutlich was vergessen, aber mir fällts ums verrecken nicht ein, was das sein könnte...

btw: den Code habe ich aus der MSDN kopiert und dann für meine Zwecke verändert (Druck eines Listview statt StreamReader).

mfg, Rasta

25.08.2009 - 13:51 Uhr

Was sind das denn für Items?

Buttons? Text?

Du könntest dir ein komplett eigenes Control basteln, ich würde es so machen (hab da aber nicht so viel Erfahrung drin):

|Button mit Pfeil links| Item1 Item2 usw. | Button mit Pfeil rechts

die Pfeile als Icons über den Buttons, sollte klar sein.

Die Items kannst du in ein Listview mit Scrollbar = disabled setzen, aber andere Controls gehen natürlich auch.

Jetzt einfach bei ButtonClick die Items entsprechend verschieben(Wenn ich jetzt nicht komplett falsch denke über SelectedItem oder so ähnlich).

Dann sollten sich die Items entsprechend nach rechts und links bewegen.

Das ist meine Überlegung dazu und mein erster Ansatz, wenn ich sowas brauchen würde. Ich habs aber weder getestet noch sonstwas, kann auch schiefgehen. Vorteil: Sollte sich in wenigen Minuten bauen lassen.

mfg, Rasta

28.11.2008 - 10:06 Uhr

Wenns etwas schöner werden soll:


String.Replace("\\r\\n",Environment.Newline); //ungetestet, aber ist klar, was gemeint ist
28.11.2008 - 09:50 Uhr

und man kann einen Text von der Rede zum Mond schreiben, nicht mal einen ganz um die Erde. Und sowas sind ja durchaus beliebte Aufgabenstellungen. 😉 Zumindest, wenn man von 4mm ausgeht, wie in der Rechnung oben, reicht es knapp bis Hollywood.

herbivore

Ruf doch mal in nem Filmstudio an und sag "Hey, wir haben eine String gefunden, der bis zu euch geht" 🙂
@kleines_Eichhörnchen:

Guter Punkt, in meiner jugendlichen Naivität habe ich mal folgendes gebracht:

An nem Server bei uns war der Log-Level noch ganz oben, nachdem der Fehler schon gefunden war. Paar Tage später fiel dann das 4GB-Log auf. Ich: "Machs doch mal auf, mal sehen, was drinsteht" 😜

28.11.2008 - 09:09 Uhr

Die Frage nach der maximalen Länge eines Strings hatte ich mir auch mal gestellt, aber wie es scheint, ist die Länge ja mehr als ausreichend 🙂

8500km (+ n paar zerquetschte), das is extrem, da kann man ja n String in üblicher Auflösung mehrmals durch Deutschland ziehen xD

mfg, Rasta

28.11.2008 - 08:54 Uhr

Join wartet nur darauf, dass der Thread meldet, dass die Berechnung abgeschlossen ist, die Priorität wird nicht geändert (sonst würde ja jedes Join die Prio verändern, das wäre ja äusserst unübersichtlich).

Deine Berechnung im separaten Thread wird also mit BelowNormal ausgeführt.

mfg, Rasta

21.11.2008 - 11:26 Uhr

Naja, durch die Vererbung bekommst du "int Value" mitgeliefert. Ob und wie man das explizit ausblenden kann, weiss ich nicht.

Ich habs grad mal bei ServiceBase.ToString() ausprobiert, man muss "override" hinzufügen. Allerdings hat meine Methode keinen unterschiedlichen Datentyp.

Wenn ich "int" als Rückgabetyp setze, muss das so aussehen:

        public new int ToString()
        {
            return 1;
        }

Wenn ich jetzt "this.ToString()" aufrufe, wird nur "int" angezeigt, "string" ist nicht mehr wählbar.

Probier mal aus, ob das so bei dir klappt.

EDIT: Ich sehe grade, du hast ja ein Property und keine Methode, da ist die Problematik möglicherweise anders...

mfg, Rasta

21.11.2008 - 11:18 Uhr

Gibt es beim SQL Server nicht die Option, für eine neue Zeile (also nach einem Insert) eine aufsteigende Nummer zu vergeben? Die benutzen wir bei uns, klappt das bei dir nicht?

Dann hättest du nämlich die ganze Arbeit umsonst gemacht xD

mfg, Rasta

21.11.2008 - 08:33 Uhr

@TheProg:

Spiele sind in der Regel so gestaltet, dass man nicht cheaten kann (was ich dir nicht unterstelle), daher wird es sehr schwer, irgendetwas auszulesen. Und Eingaben kannst du nur über Windows machen(sendkeys, einfach mal auf pinvoke.net suchen), du kannst dem Spiel nicht sagen, es soll eine gewisse Operation ausführen(GOTO Bombenplatz, place Bomb oder so^^), das soll schliesslich der Spieler von Hand machen.

Manche Informationen werden in der Registry oder in ini-Files in Dokumente&Einstellungen oder im Programmverzeichnis gespeichert, sieh da mal kurz nach, aber brauchbares wirst du da möglicherweise nicht finden.

Es gibt natürlich Lösungen, aber die würden so extrem viel KnowHow und Zeit erfordern, dass sich das vor allem für einen Anfänger als sinnloses Unterfangen herausstellt

Mir würde z.b. folgendes einfallen: VNC-artig den Bildschrirminhalt als Bild herauslesen und das dann mit einer Bilderkennung auf bestimmte Bereiche scannen. Beispielsweise der Abby FineReader hat eine API, die man dazu benutzen könnte, der Sourcecode von VNC liegt frei, soweit ich weiss.

Nachteile:
-Schwer zu realisieren, zeitaufwendig
-Bilderkennungssoftware ist nicht perfekt und bestimmte Dinge kannst du daher möglicherweise gar nicht erkennen
-Nachdem das Bild fehlerfrei ausgelesen wurde, musst du die Tastatureingaben daran anpassen - Wenn sich die Fenster im Spiel verschieben lassen, müsstest du die Position der Buttons/etc. ermitteln, was wiederum sehr sehr schwierig werden könnte
Selbst wenn die Positionen immer fix sind (WC3 würde mir einfallen), müsstest du für jeden "Screen" eine Informationsdatei anlegen, wo Buttons zu finden sind, wo welche Information ausgelesen werden kann etc.

Alles in allem ist das wohl ein Projekt für langhaarige Bombenleger ohne Freunde...

mfg, Rasta