Laden...

Forenbeiträge von CoLo Ingesamt 224 Beiträge

01.08.2012 - 09:43 Uhr

Hi,

war Get-/SetPixel nicht extrem langsam?
Ich würde:
*einen Speicher (z.B. Bytearray) vorhalten. *Control.MouseDown-/Move -> setze Control.Invalidate(Ausschnitt) *Control.Paint-> kopiere Bytearray Ausschnitt zu ein Bitmap oder Bitmap Ausschnitt über Bitmap.LockBits *Control.Paint-> zeichne Bitmap Ausschnitt

Evtl. hat noch jm. bessere Ideen. Sowas in der Art gab es bestimmt schon 100x im Forum.
Hier z.B.:

GetPixel und SetPixel um Längen geschlagen. 800 mal schneller

Gruß,
CoLo

25.07.2012 - 15:04 Uhr

  //Mit folgenden Basisinformationen:
  string sourceRoot      = @"C:\Eigene Dateien\Program Data\";
  string destinationRoot = @"D:\Backup\";
  string relativeDir     = @"DurchsuchenderOrdner\";

  //Kannst Du Dir das zu prüfenden Verzeichnis zusammenstellen:
  string sourceDir       = Path.Combine(sourceRoot,      relativeDir);
  string destinationDir  = Path.Combine(destinationRoot, relativeDir);
  
  //Anschließend kannst Du einen rekursiven Aufruf starten
  //...
  
  //Mit folgenden Basisinformationen:
  string sourceRoot      = @"C:\Eigene Dateien\Program Data\DurchsuchenderOrdner\";
  string destinationRoot = @"D:\Backup\DurchsuchenderOrdner\";
  string relativeDir     = @"WeitererOrdner\";
  //...
  //...
  //...    

Edit:Typo

25.07.2012 - 14:24 Uhr

Hi Manda,

Dein Problem liegt wohl wo anders, denn Dein Code sieht soweit gut aus. Siehe Test:


        private void Test()
        {
            string[] columns = new string[] { "Hallo", "Welt", "123" };
            int iCol = columns.Length;

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < iCol; i++)
            {
                sb.Append(columns[i]);

                if (i < iCol - 1)
                {
                    sb.Append(","); //Sieht gut aus
                }
            }
            MessageBox.Show(sb.ToString());// "Hallo,Welt,123"
        }

Zeige mal die Cloumns-Werte und Dein Ergebnis (Bzw. Teil davon).
Gruß, CoLo

19.07.2012 - 15:07 Uhr

Wo genau entsteht denn nun der Fehler?
Also welche Zeile entspricht "Program.cs:Zeile 23." ?

Edit: verdammt, ich sehe schon... bei FirstOrDefault.

19.07.2012 - 14:50 Uhr

Wenn Du auf 'null.OrderNo' zugreifst

bekommst du natürlich eine NullReferenceException.

18.07.2012 - 16:02 Uhr

Hi dN!3L, die Vereinfachung ist Spitze 👍:-D

18.07.2012 - 15:26 Uhr

Oder wie kann ich das anstellen, wenn die Anzahl der Bits nicht bekannt ist?

Wieso sollte die nicht bekannt sein bzw. wo ist das der Fall?
MSDN: int = struct Int32...

18.07.2012 - 15:18 Uhr

Ich kenne leider keine.
Aber zu Fuß geht's auch recht einfach:


        private void button1_Click(object sender, EventArgs e)
        {
            int BinaryValue = 0x2D;
            List<int> Integers = BinaryToIntegers(BinaryValue);
            Ausgabe(BinaryValue, Integers);
            //Ausgabe = "0x2D -> {0x20, 0x8, 0x4, 0x1}"
        }

        private List<int> BinaryToIntegers(int BinaryValue)
        {
            List<int> Integers = new List<int>();
            for (int i = 0; i < 32; i++)
            {
                int x = 1 << i;
                if (BinaryValue == (BinaryValue | x)) Integers.Add(x);
            }
            return Integers;
        }

        private void Ausgabe(int binaryValue, List<int> Integers)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("0x" + binaryValue.ToString("X") + " -> {");
            for (int i = Integers.Count - 1; i >= 0; i--)
            {
                if (i < Integers.Count - 1) sb.Append(", ");
                sb.Append("0x" + Integers[i].ToString("X"));
            }
            sb.Append("}");
            MessageBox.Show(sb.ToString());
        }

17.07.2012 - 12:14 Uhr

Okay, okay, okay, okay ... überredet ... =)

16.07.2012 - 10:31 Uhr

Vielen dank für die Antworten.
Ich glaube ich werde in Zukunft mehr mit checked arbeiten. Auf jeden Fall mehr darüber Nachdenken. Vielleicht werde ich später mal die Überlaufsprüfung in den Compileroptionen einschalten.

Gruß, CoLo =)

13.07.2012 - 11:22 Uhr

Hi, also das mit der Konvertierung lässt mich jetzt nicht locker. Ich habe dazu jetzt einen neues Thema erstellt:

Konvertierung - Unterschied Convert.ToByte(i) und (byte)i

Gruß, CoLo

13.07.2012 - 11:17 Uhr

Hi Leute, habe eine Grundlagenfrage.

Gibt es einen Unterschied zwischen nachfolgenden Konvertierungen
und was muss man bedenken?:


  int i;
  byte b;
  //(...)
   b = Convert.ToByte(i);
   checked { b = (byte)i; }

Ich habe das mal mit

 Int16 i;

grob ausprobiert für einige Zahlen aus 32767 bis -32768. Scheint alles gleich. (Ein vollständiger Test dauert Ewigkeiten.)

Ich verwende gerne

b = (byte)i;

und bin mir bewusst, dass beim Überlauf der Teil beim Überlauf abgeschnitten wird. Den Umstand nutze ich auch gerne aus.

Nun lese ich, dass einige in den Compileroptionen die Überlaufsprüfungen einschalten, so dass aus

b = (byte)i;

automatisch

   checked { b = (byte)i; }

wird. Alles hat ja seinen Grund. Wie macht Ihr das bzw. was haltet Ihr davon?

13.07.2012 - 09:40 Uhr

Guter Hinweis. Ich habe das jetzt mal bei mir getestet:


        private void btnCheckTest(object sender, EventArgs e)
        {
            int i = 1234;
            byte b;

            b = (byte)i;
            b = Convert.ToByte(i);//Hier knallt's
            unchecked { b = (byte)i; }
            checked { b = (byte)i; }//Hier knallt's

            MessageBox.Show("Done");
        }

12.07.2012 - 18:21 Uhr

Hi, hier mein Vorschlag.:


        public static byte Docrc8(string s)
        {
            byte j;
            byte crc8 = 0;
            for (int m = 0; m < s.Length; m++)
            {
                byte x = (byte)s[m];
                
                for (int k = 0; k <= 7; k++)
                {
                    j = (byte)(1 & (x ^ crc8));
                    crc8 = (byte)((crc8 / 2) & 0xff);
                    x = (byte)((x / 2) & 0xff);
                    if (j != 0) crc8 = (byte)(crc8 ^ 0x8C);
                }
            }
            return crc8;
        }

Wenn ich das richtig verstanden habe, schneidet Fix bei positiven Werten einfach nur die Nachkommastellen ab.

12.07.2012 - 13:18 Uhr

Ersetze ich ein solches verwaschenes png durch ein neues png aus der gleichen Quelle (also manuell zur Entwurfszeit)

Wird denn die Datei auf der Festplatte verändert? Dann kannst Du bei der Datei mal den Schreibschutz setzen. Beim Programmstart stürzt die App hoffentlich ab und der Bug ist gefunden. Das meinte ich.

11.07.2012 - 18:41 Uhr

Könnte es sein, das sich die Ecken von manchen Bits abnutzen ??? Ich drehe bald durch !

Ja 😄. Wenn z.B. ein Bild überarbeitet oder konvertiert wird.
Bei Dir hört es sich genau danach an.
Als würde ein und das selbe Bild jedes mal gelesen, geändert und zurückgespeichert wird.

Hau da mal einen Schreibschutz rein und schaue mal, was passiert.

06.07.2012 - 09:38 Uhr

Was genau macht denn Dein Javascript?
Eine Übersetzung zu übersetzen erinnert mich an
einen Ofen in einem Ofen, um backen zu können während man backt.

Erwünschte Anwendung -> Javascript, Javascript->C#

Kann man einfacher lösen durch:
Erwünschte Anwendung -> C#

05.07.2012 - 12:04 Uhr

Hi ModelViewPresenter,

Deine Idee finde ich gut.

So würde ich es machen:
Ich würde eine Spalten-CSV anlegen.
In dieser steht, welche Spalte eine Nummern-, Datums-, ..., Textspalte ist.

Dann würde ich die Daten-CSV Datei laden.
Der jeweilige Datentyp muss dann der entsprechenden Spalte aus der Spalten-CSV entsprechen.

Eventuell kann man statt der Spalten-CSV Datei auch eine Assembly Datei laden.
Aber um so komplizierter etwas ist, um so anfälliger ist es.

Gruß,
CoLo

04.07.2012 - 12:23 Uhr

Doch, wenn f und e Felder der Klasse Method sind 😜

Aha. In c# wird der Typ einer Variable in der Regel vorher festgelegt.
Hier ein Beispiel mit 'Feldern' 😄:


    class MeineKlasse
    {
        private int _MyInt;
        private string _MyString;
        private char _MyChar;

        public void MethodeVariablenFuellen()
        {
            _MyInt = 1234;
            //_MyInt = "Hallo";//Geht nicht. Falscher Typ.
            _MyString = "Hallo";
            _MyChar = 'H';
        }
    }

02.07.2012 - 11:18 Uhr

GUI laufe zwar jetzt flüssig. Aber muss man denn nicht trotzdem 20 Sekunden lang warten, bis der Thread fertig ist?

Zumal finde ich die Datenmenge relativ groß.
50 Spalten * 2000 Datensätze * 256 Zeichen(das habe ich mir jetzt so ausgedacht)
= 24,4 Megabytes.

Selbst wenn es 0,1 Megabyte ist, könnte man da nicht noch drehen?

Gruß,
CoLo

26.06.2012 - 14:52 Uhr

Eigentlich ist das ja eine Formel.
Für die Formelsuche fange ich schonmal an.

A = alle Leute
S = Anzahl der Stichproben Leute
R = Anzahl der restlichen Leute (R=A-S)

a = Alle Stimmen aller Leute
s = Alle Stimmen der Stichproben Leute
r = Alle Stimmen der restlichen Leute (r=a-s)

G = prozentuales Gesamtergebnis (G = a/A)
W = Wahrscheinlichkeit, dass ein Stimmergebnis einer Zufallsstichprobe von der Gesamtheit abweicht

G = (a/A) = (s+r)/(S+R)

Gesucht ist W aus Kombination mit dem oben genannten xD

21.06.2012 - 11:53 Uhr

Ich habe hier was unter folgenden Link gefunden:
How To Fix 0x0eedfade Errors

0x0eedfade = "Unknown software exception".
Zitat aus dem oben genannten Link:

  • Your coputer is unable to read some of its files correctly
  • Windows is out of date / damaged
  • The software you’re trying to use is corrupted

Ich denke das ist es. Falls jemand dazu noch was einfällt...
Ansonsten ist das Thema für mich abgeschlossen. =)

21.06.2012 - 11:19 Uhr

Oh, anscheinend heisst es
0x0eedfade = "Unknown software exception".

Jetzt muss ich noch herausfinden,
ob es bedeutet "Software ist unbekannt" oder "Software hat unbekannten Fehler".

Der Fehler wird bei mir geschmissen, wenn ich die TCP-IP Verbindung der Delphi Anwendung trenne. Anwendung funktioniert danach noch. Ein "Software ist unbekannt" Fehler ergibt für mich momentan noch keinen Sinn. 🤔

Ich habe gestern 2 Stunden danach gegoogelt, bevor ich ins Forum gepostet habe.
Aber irgendwie stand ich gestern auf dem Schlauch und habe alle "Unknown software exception" Dinger als falschen Treffer ignoriert. Darum Frage ich nach.
Unglaublich, dass ich das sagen würde: danke Herbivore. 😁

20.06.2012 - 17:35 Uhr

Sorry, Missverständnis.

Über die Methode WaitForDebugEvent warte ich auf die nächste DEBUG_EVENT Meldung.
WaitForDebugEvent

Wenn das DEBUG_EVENT vom Typ EXCEPTION_DEBUG_EVENT ist,
lese ich aus dem DEBUG_EVENT die EXCEPTION_DEBUG_INFO aus,
lese ich aus der EXCEPTION_DEBUG_INFO den EXCEPTION_RECORD aus,
lese ich aus der EXCEPTION_RECORD den ExceptionCode aus.
Der ExceptionCode ist eine Integervariable.

Dieser ExceptionCode hat dann unter anderem den Wert 0x0EEDFADE.

Wenn ExceptionCode = 0x00000002 ist, weiss ich,
dass ist ein ERROR_FILE_NOT_FOUND Fehler.
Bei 0x0EEDFADE weiss ich nicht, was das ist. Das wüsste ich gerne.

Hier mal ein Beispiel der Ausgabe meines Debuggers:

CREATE_PROCESS_DEBUG_EVENT
LOAD_DLL_DEBUG_EVENT
LOAD_DLL_DEBUG_EVENT
(...)
LOAD_DLL_DEBUG_EVENT
EXIT_THREAD_DEBUG_EVENT
(...)
EXCEPTION_DEBUG_EVENT
Errorcode = ERROR_FILE_NOT_FOUND 2 (0x2): The system cannot find the file specified.
(...)
EXCEPTION_DEBUG_EVENT
Errorcode = 0x0EEDFADE
(...)
EXCEPTION_DEBUG_EVENT
Errorcode = ERROR_FILE_NOT_FOUND 2 (0x2): The system cannot find the file specified.
(...)

Anbei ein bischen Quellcode zur WaitForDebugEvent Methode.
Bei den Millisekunden warte ich statt unendlich lange nur 500 Millisekunden,
da ich momentan keinen Thread verwende:



        //(...)

        [DllImport("kernel32.dll", EntryPoint = "WaitForDebugEvent")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool WaitForDebugEvent([Out] out DEBUG_EVENT lpDebugEvent, uint dwMilliseconds);

        //(...)
            public Result Poll()
            {
                Result debugResult = new Result();
                DEBUG_EVENT evt = DEBUG_EVENT();

                // wait for a debug event
                if (!WaitForDebugEvent(out evt, 500))
                {
                    return debugResult;
                }

                ProcessDebugEvent(evt, _process, debugResult);

                // return DBG_CONTINUE for all events but the exception type
                int continueFlag = DBG_CONTINUE;

                if (evt.dwDebugEventCode == DebugEventType.EXCEPTION_DEBUG_EVENT)
                    continueFlag = DBG_EXCEPTION_NOT_HANDLED
                ;

                // continue running the debugee
                ContinueDebugEvent(evt.dwProcessId, evt.dwThreadId, continueFlag);

                return debugResult;
            }

20.06.2012 - 15:43 Uhr

Hallo,

weiß jemand, was der Fehlercode 0x0EEDFADE genau bedeutet?
Über Google habe ich bis jetzt nur einen Hinweis gefunden,
dass möglicherweide der Stack korrumpiert wurde.

(Ich überwache eine Delphianwendung mit einer C# Anwendung.
Stichwort: PInvoke und DEBUG_EVENT.)

Gruß,
CoLo

15.06.2012 - 12:06 Uhr

keine Ahnung

Gibt es ein P4You-Book Windows-CE SDK?
Wenn ja, evtl. hilft es das zu installieren und dann damit ein CAB erzeugen.

15.06.2012 - 11:47 Uhr

Hi, hast Du es evtl. schon installiert?
Falls ja, deinstallieren, neu probieren.

12.06.2012 - 16:12 Uhr

Schade 😦
Aber gut zu wissen, dass selbst das nicht klappt.

Welche VisualStudio Version, welches Gerät/Hersteller wäre noch interessant.

12.06.2012 - 15:44 Uhr

Funktioniert ein CAB von einem leeren Projekt (mit leerem Formular)?

12.06.2012 - 14:43 Uhr

Hmm, merkwürdig. Evtl. mal auf einem anderen CE Gerät probieren. Hat das Gerät genügend Speicher?

12.06.2012 - 13:45 Uhr

Vielleicht verwendest Du Komponenten die nur unter Windows Mobile 6 laufen.

Windows Mobile und
Windows CE
sind zwar ähnlich, aber halt unterschiedliche Betriebssysteme.
Das macht sich z.B. bei der Enter Taste bei einer Textbox bemerkbar.

Gruß, CoLo

24.05.2012 - 15:29 Uhr

Ich mache das so:


            IFormatProvider EN = new CultureInfo("en-GB");
            IFormatProvider DE = new CultureInfo("de-DE");

            float kg = 1.23f;
            string kgEN = kg.ToString("0.00", EN);
            string kgDE = kg.ToString("0.00", DE);

Es kommt auch darauf an, was für ein Typ dr_ ist.
dr_ würde ich als Zahl konvertieren und dann Zahl.ToString(..).

Vielleicht hilft Dir das.

Gruß,
CoLo

24.05.2012 - 15:13 Uhr

Hat denn centerPosition die gleichen Werte wie connector.SourceLocation bzw. connector.DestinationLocation?

Gruß,
CoLo

23.05.2012 - 12:25 Uhr

Lösungsweg gefunden

Nun habe ich eine, naja, einigermaßen angemessene Lösung gefunden.
Es gibt den schmutzigen Weg über das Schmeißen einer ArgumentException.
Den habe ich verwendet.

Hier gibt es Differenzen zwischen Ausführung auf PC und einem Smart Device.

Methode mit ArgumentException:


        public static string GetByException()
        {
            StringBuilder sb = new StringBuilder();
            try
            {
                throw new ArgumentException();
            }
            catch (ArgumentException x)
            {
                sb.Append(x.StackTrace);
            }
            return sb.ToString();
        }

PC Ausgabe (nur eine Zeile, unzufriedenstellend):

bei ProjektXY.ProcCalls.GetByException() in C:\xxxx\xxxx\xxxx\ProcCalls.cs:Zeile 33.

Smart Device Ausgabe (mehrere Zeilen, brauchbar):

bei ProjektXY.ProcCalls.GetByException()
bei DeviceApplication46.Form1.btnTest_Click()
bei System.Windows.Forms.Control.OnClick()
bei System.Windows.Forms.Button.OnClick()
(...)

Die Smart Device Ausgabe habe ich analysiert und eine Klasse daraus entwickelt.
In dieser parse ich die StackTrace der ArgumentException. Achtung: es ist zu vermuten, dass dieser Weg nicht überall funktioniert, da man nicht an den StackTrace selber, sondern nur an die Ausgabe des StackTrace gelangt; denn die Ausgabe ist zwischen PC und Smart Device schon mal unterschiedlich (siehe oben):


    public class StackTraceCE
    {
        public class Frame
        {
            public string declaringType;
            public string method;
        }
        public class Frames : List<Frame> { }
        public Frames frames = new Frames();

        public StackTraceCE()
        {
            frames = new Frames();
            try
            {
                throw new ArgumentException();
            }
            catch (ArgumentException argEx)
            {
                //Beispielinhalt von argEx.StackTrace:
                //
                //  "bei ProjektXY.StackTraceCE..ctor()" + "\r\n" +
                //  "bei ProjektXY.ProcCalls.GetCE()" + "\r\n" +
                //  "bei DeviceApplication46.Form1.btnTest_Click()" + "\r\n" +
                //  ...
                //  "bei DeviceApplication46.Program.Main()" + "\r\n"


                string[] lines = argEx.StackTrace.Replace("\n", null).Split("\r".ToCharArray());
                foreach (string line in lines)
                {
                    if (string.IsNullOrEmpty(line)) continue;
                    string[] words = line.Split(" ".ToCharArray());
                    //int posOfWord_bei = 0;
                    int posOfTraceElements = 1;

                    string[] elements = words[posOfTraceElements].Split(".".ToCharArray());
                    int posOfDeclaringType = elements.Length - 2;
                    int posOfMethod = elements.Length - 1;

                    Frame frame = new Frame();
                    frame.declaringType = elements[posOfDeclaringType];
                    frame.method = elements[posOfMethod];
                    frame.method = frame.method.Substring(0, frame.method.Length - "()".Length);
                    frames.Add(frame);
                }
                frames.RemoveAt(0);//"bei ProjektXY.StackTraceCE..ctor()" entfernen
            }
        }
    }

Benutzung von StackTraceCE:


        public static string GetCE(int maxDeep, int youngestMethod)
        {
            StackTraceCE st = new StackTraceCE();
            StringBuilder sb = new StringBuilder();

            int count = Math.Min(youngestMethod + maxDeep, st.frames.Count);
            for (int i = youngestMethod; i < count; i++)
            {
                if (i > youngestMethod) sb.Insert(0, "\\");
                StackTraceCE.Frame sf = st.frames[i];
                sb.Insert(0, sf.declaringType + "." + sf.method);
            }
            if (count < st.frames.Count) sb.Insert(0, "...");
            return sb.ToString();
        }

Smart Device Aufruf:


        private void btnTest_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(ProjektXY.ProcCalls.GetCE(5,1));
        }

Smart Device Ausgabe:

...Control._InternalWnProc\ButtonBase.WnProc\Button.OnClick\Control.OnClick\Form1.btnTest_Click

Gruß,
CoLo

22.05.2012 - 18:54 Uhr

Hallo liebe Leute,

ich würde gerne möglichst einfach Prozeduraufrufe verfolgen.
Für den PC gibt es die Klasse StackTrace. Sehr genial.
Leider gibt es das für das CompactFramework nicht. Hat jemand eine Idee?

PC Aufruf:


        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(ProjektXY.ProcCalls.Get(5, 1));
        }

PC Ausgabe (so oder so ähnlich will ich es auch für CompactFramework):

...Control.WmMouseUp\Button.OnMouseUp\Button.OnClick\Control.OnClick\Form1.button1_Click

PC Methode:


using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Reflection;

namespace ProjektXY
{
    static class ProcCalls
    {
        public static string Get(int maxDeep, int youngestMethod)
        {
            StackTrace st = new StackTrace(false);
            StringBuilder sb = new StringBuilder();

            int count = Math.Min(youngestMethod + maxDeep, st.FrameCount);
            for (int i = youngestMethod; i < count; i++)
            {
                if (i > youngestMethod) sb.Insert(0, '\\');
                StackFrame sf = st.GetFrame(i);
                MethodBase mb = sf.GetMethod();
                sb.Insert(0, mb.DeclaringType.Name + "." + mb.Name);
            }
            if (count < st.FrameCount) sb.Insert(0, "...");
            return sb.ToString();
        }
    }
}

Gruß,
CoLo

28.02.2012 - 14:56 Uhr

hmm... Bitte sehr:


        int _checkPos = -1;
        List<CheckBox> _checks = new List<CheckBox>();

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = !timer1.Enabled;
        }


        //Eregnis für checkBox1, checkBox2, checkBox3
        private void checkBoxX_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk =(CheckBox)sender;
            if (chk.Checked)
                _checks.Add(chk);
            else
                _checks.Remove(chk)
            ;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (_checks.Count < 1)
            {
                listBox1.Items.Insert(0, "Vakuum");
                return;
            }

            _checkPos = (_checkPos + 1) % _checks.Count;
            CheckBox chk = _checks[_checkPos];
            if (chk == checkBox1) listBox1.Items.Insert(0, "Hallo");
            if (chk == checkBox2) listBox1.Items.Insert(0, "Welt");
            if (chk == checkBox3) listBox1.Items.Insert(0, "Paul");
        }

16.02.2012 - 17:54 Uhr

iwie so (sorry, ungeprüft):


int timer1Frequenz
{
	get
	{
		return 1000 / timer1.Interval;
	}
	set
	{
		timer1.Interval = 1000 / value ;
	}
}

(Edit: Fehler korrigiert. Danke xxMUROxx)

29.12.2011 - 12:57 Uhr

@Scavanger: gesehen, ja; verwendet, ja; wirklich kennen, nein; sonst hätte ich es jetzt verwendet (oder auch nicht xD). Danke für den Hinweis.

29.12.2011 - 10:39 Uhr

Hi Raphael,

Wenn man diese öffnet z.b. Notepad kommen da ja nur kryptisches Zeug raus 😃

Du kannst Dir den Inhalt einer Datei als ein Bytearray vorstellen.
Für Notepad ist jede Datei eine Textdatei. Bytewerte unterhalb 32 werden als Steuerungszeichen interpretiert und werden ggf. gar nicht angezeigt. Bytewert 13 und Bytewert 10 werden z.B. als neue Zeile interpretiert. Mit einem Hexeditor kannst Du Dir den Inhalt jeder Datei genauer anschauen. Ob Du daraus schlau wirst, ist eine andere Sache. Und so kommen wir zur nächsten Frage:

wie kann man unbekannten Datentyp auslesen und verwerten?

Du musst schon den Aufbau der Datei kennen. Erst dann kannst Du die Daten auswerten.

Nachfolgend ein Beispiel. Es wird eine Datei mit einem Integerwert geschrieben.
C# Integer sind 32 Bit = 4 Bytes groß (IMHO auch bei 64 Bit Systemen).
Der Integerwert wird dabei im Little Endian Format gespeichert.
Mit anderen Worten: eine 1 wird als 01 00 00 00 weggeschrieben.


        private void WriteInt(int x)
        {
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Create))
            {
                byte[] data = BitConverter.GetBytes(x);
                fs.Write(data, 0, data.Length);
            }
        }
        private int ReadInt()
        {
            int x;
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Open))
            {
                byte[] data = new byte[(int)fs.Length];
                fs.Read(data, 0, data.Length);
                x = BitConverter.ToInt32(data, 0);
            }
            return x;
        }

        private void Test(int x)
        {
            MessageBox.Show("Write " + x);
            WriteInt(x);
            MessageBox.Show("Read " + ReadInt());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Test(1);
            Test((int)DateTime.Now.Ticks);
        }

Manno, jetzt, wo ich's reinstellen will, habt Ihr schon was geschrieben. 😉
Den Fall, dass die Datei gezippt ist, habe ich noch gar nicht berücksichtigt.

Gruß, CoLo

24.11.2011 - 15:24 Uhr

hi hsg, ich würde die Verwendung von unsafe vermeiden.
Vielleicht hat ja jm. noch eine bessere Idee.
Nachfolgendes ist mir in Kürze eingefallen.
Es geht bestimmt noch besser (soviel Code für 3 Zeilen, wahnsinn ;-D):


        struct TLagerInfo2
        {
            //Datenfelder
            public int befehl;
            private string _login;
            public string login
            {
                get { return _login; }
                set { _login = GetFixedString(value, LOGIN_SIZE); }
            }
            private string _passwd;
            public string passwd
            {
                get { return _passwd; }
                set { _passwd = GetFixedString(value, PASSWD_SIZE); }
            }

            //Strukturgrößen
            public const int BEFEHL_SIZE = 4;
            public const int LOGIN_SIZE = 25;
            public const int PASSWD_SIZE = 25;

            public const int BEFEHL_POS = 0;
            public const int LOGIN_POS = BEFEHL_POS + BEFEHL_SIZE;
            public const int PASSWD_POS = LOGIN_POS + LOGIN_SIZE;

            public const int STRUCT_SIZE = BEFEHL_SIZE
                                         + LOGIN_SIZE
                                         + PASSWD_SIZE
            ;

            //Methoden

            private static string GetFixedString(string s, int maxlen)
            {
                if (string.IsNullOrEmpty(s)) return s;
                if (s.Length > maxlen)
                    throw new ArgumentException("String zu lang.")
                ;
                return s;
            }
            private static string GetStringFromBytes(byte[] b)
            {
                string s = System.Text.ASCIIEncoding.ASCII.GetString(b);
                int i = s.IndexOf('\0');
                if (i != -1) s = s.Substring(0, i);
                return s;
            }

            public byte[] ToBytes()
            {
                byte[] ret = new byte[STRUCT_SIZE];
                Array.Clear(ret, 0, ret.Length);
                
                byte[] b;

                b = BitConverter.GetBytes(befehl);
                b.CopyTo(ret, BEFEHL_POS);

                b = System.Text.ASCIIEncoding.ASCII.GetBytes(_login);
                b.CopyTo(ret, LOGIN_POS);

                b = System.Text.ASCIIEncoding.ASCII.GetBytes(_passwd);
                b.CopyTo(ret, PASSWD_POS);
                return ret;
            }

            public static TLagerInfo2 FromBytes(byte[] src, int srcIndex)
            {
                TLagerInfo2 ret = new TLagerInfo2();

                byte[] dst;
                dst = new byte[BEFEHL_SIZE];
                Array.Copy
                (
                    src, srcIndex + BEFEHL_POS, 
                    dst, 0, 
                    BEFEHL_SIZE
                );
                ret.befehl = BitConverter.ToInt32(src, srcIndex);

                dst = new byte[LOGIN_SIZE];
                Array.Copy
                (
                    src, srcIndex + LOGIN_POS, 
                    dst, 0, 
                    LOGIN_SIZE
                );
                ret._login = GetStringFromBytes(dst);

                dst = new byte[PASSWD_POS];
                Array.Copy
                (
                    src, srcIndex + PASSWD_POS, 
                    dst, 0, 
                    PASSWD_SIZE
                );
                ret._passwd = GetStringFromBytes(dst);
                
                return ret;
            }
        }

17.11.2011 - 10:56 Uhr

Beim P/Invoke werden nur die reinen Daten übergeben. Die Variablennamen bzw. Datenstruktur geht dabei verloren.

17.11.2011 - 10:30 Uhr

Hi,

Dirty 1: Du malst die Linie(=Pen) mit FillPolygon
Dirty 2: Du malst die Linie mehrfach mit unterschiedlichen X&Y Werten übereinander

Gruß, CoLo

12.11.2011 - 04:28 Uhr

Hi & danke, habe WGA ausgeführt & SDK installiert.
Sorry, ich befürchte ich bin auf einem Irrweg.
Werde mal morgen (bzw. heute XD) den Sourcecode von DirectX.Capture Class Library genauer ansehen. (-> Damn it, DirectX.Capture scheint wohl nicht Bestandteil von DirectX zu sein. -> "wie poste ich richtig..." X().

Gruß, CoLo

11.11.2011 - 21:08 Uhr

Hi,

ich will ein Webcam Programm schreiben und DirectX nutzen.
Weiss jemand, welches DirectX SDK für Windows 7 installiert werden muss?
Ich habe das neueste SDK = DXSDK_Jun10.exe installiert. Die DirectX.Capture ist da nicht mehr vorhanden. Seit 1h gegooglet.

Habe das hier gefunden:
C# Tipps und Tricks: Installieren und Einbinden des DirectX SDK

Mit Verweis auf:
Download Center: DirectX Software Development Kit

Hier wird eine genuine Windows validation durchgeführt.
Da ich nicht weiß, ob das wirklich sein muss, frage ich hier lieber nach.

Gruß,
CoLo

02.11.2011 - 14:47 Uhr

Hi,

meines erachtens ist 04:14 Uhr richtig (abgesehen von der Zeitumstellung):

1 Tag hat 246060 = 86400 Sekunden.

1312949658 mod 86400 ergibt 15258 Sekunden.
15258 / (6060) = 4 Stunden + Rest
(15258 mod (60
60)) / 60 = 14 Minuten + Rest

Gruß, CoLo

26.10.2011 - 10:29 Uhr

Die Größe des Datenpakets (...) auslesen (...). Dann (...) Pakete so lange anhängen bis (...) Buffer (...) gefüllt ist oder Verbindung verloren geht.

Eine wirklich bessere/andere Vorgehensweise wüsste ich jetzt auch nicht.
Modifikation: Daten in einem Buffer schreiben, bis es nichts mehr zu lesen gibt.
Danach erst Buffer auswerten.

27.09.2011 - 12:40 Uhr

Flush verwende ich nie. Beim Close schreibt er gleich die Datei.
Wenn du willst, kannste es auch so machen:


using (StreamWriter strW = new StreamWriter(path))
{
   strW.WriteLine(ex.ToString());
}

27.09.2011 - 12:29 Uhr

Hi kraeppy,

hier 'ne Vermutung:
Du fängst den Fehler im try catch ab und schreibst im catch ein Logfile.
Da der Fehler im catch behandelt wurde, (und Du ihn nicht erneut schmeißt)
ist für das Programm alles in Butter und läuft weiter.

Steht was im Logfile?

Grüßchen,
CoLo

18.04.2011 - 11:34 Uhr

Hallo herbivore,

super Idee mit Form.Visible = false.
Klappt bestens & benutze ich jetzt. Danke für den Stubser. =)

Sorry, dass ich vom eigentlichen Thema abgewichen bin.

Gruß,
CoLo

12.04.2011 - 18:00 Uhr

Das Flackern in der Taskleiste stört mich nun doch gewaltig. Hat jm. eine Idee?
Hätte nicht gedacht, dass das so schwer werden kann.

Gruß, CoLo