Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Pulpapex
Thema: string to byte[] spezial
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Nomak,

du musst die einzelnen Werte-Token extrahieren und als Bytes parsen.

Ich versuch's mal schnell (muss gleich los).

string text = "00,00,00,...";
string[] token = text.Split(",");
byte[] bytes = new byte[token.Length];
for(int i = 0; i < bytes.Length; ++) {
   string t = token[i];
   byte b = Byte.Parse(t, NumberStyles.HexNumber);
   bytes[i] = b;
}

Gruss
Pulpapex

Thema: COM-Object ansprechen
Am im Forum: Rund um die Programmierung

Das Tool zum Wrapper-Erstellen heisst TlbImp.exe, nicht TlbExp.exe. Es funktioniert auch mit Dlls. Kommt natürlich drauf an was das für eine Dll ist.

Thema: Zielkonvertierung klappt nicht...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die Interface-Definition in der Exe muss weg. Verweise hinzufügen ist der richtige Weg.

Thema: Zielkonvertierung klappt nicht...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du brauchst eine dritte Assembly, in der IScatterFlasher definiert ist. Sowohl die Exe als auch die Plugin-Dlls verwenden diese Dll. Sie muss unabhängig sein, d.h. sie muss sowohl die Interfaces als verwendete Parametertypen enthalten.

Assembly-Abhängigkeiten:

[App.exe] ---------> [Interface.dll] <--------- [Plugin.dll]
           depends                     depends

Thema: Zielkonvertierung klappt nicht...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vielleicht wird das IScatterFlasher-Interface, in das gecastet werden soll, nicht gefunden oder es gibt es zweimal.

In welcher Assembly ist es definiert, in der Exe oder in der Dll? Da die Dll das Interface verwendet, müsste es eigentlich in der Dll sein (aber nicht nochmal in der Exe).


Gruss
Pulpapex

Thema: E_unexpected
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Indexer können beliebig viele Parameter haben.

Beispiel:

public class IniFile {
   public string this[string group, string key] { get; set; }
}

Was nicht geht, man kann keine indizierten Eigenschaften definieren. Da liegt das Problem.


Gruss
Pulpapex

Thema: Listbox während Laufzeit Größe verändern
Am im Forum: GUI: Windows-Forms

Jetzt fällt es mir auch auf. Es geht gar nicht um mehrere Zeilen, sondern um mehrere Spalten, die mit MultiColumn nicht angezeigt werden! Das kam überhaupt nicht rüber.

Das Problem wird DrawMode.OwnerDrawFixed zusammenhängen. Vielleicht geht dabei irgendetwas schief (wer weiss was du da hinkrakelst ). Stell es zum Testen mal aus.

Es gibt noch eine ColumnWidth-Eigenschaft. Die sollte jedoch gute Standardwerte liefern. Denke nicht, dass es daran liegt. Aber kannst ja mal ausprobieren ob sich was tut.


Gruss
Pulpapex

Thema: Suche C# Editor (KEINE Entwicklungsumgebung!)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

UltraEdit hat Syntax-Highlighting für fast jede Sprache. Für C# sicherlich auch. Externe Tools, um den Compiler zu starten, lassen sich auch konfigurieren.

http://www.ultraedit.com/index.php


Verschoben nach Werkzeuge: im C#-Unterforum geht es um Fragen um die Sprache und die Programmierung.

Thema: dll's einsehen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Nettes Tool,

es gibt sogar den in C#-Programme einzufügenden Code für extern-Methoden aus. Mit ordentlichen Bezeichnern für Parameter.

Einziges Manko ist, das Tool basiert auf einer Datenbank. Man kann also nicht jede DLL damit inspizieren, nur WinAPI-DLLs.

Thema: Hashtable mit selbstdef. Klasse in SerializeObject übetragen und abspeichern?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Alle zu serialisierenden Typen müssen das Serializable-Attribute gesetzt haben (oder das NonSerialized-Attribute).

[Serializable]
public class Spieler {
}

Alternativ kann auch das ISerializable-Interface implementiert werden. Das ist gedacht für benutzerdefinierte Serialisierung.


Gruss
Pulpapex

Thema: Hashtable mit selbstdef. Klasse in SerializeObject übetragen und abspeichern?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich sehe das Problem nicht so ganz.
Wie hast du es denn bisher versucht? Und was ist dabei schiefgelaufen?

Thema: Server handelt mit mehrere Clients gleichzeitig auf einem Port
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Der Code, der nach Aufbau der Verbindung Daten aus dem Stream empfängt, muss in einen eigenen Thread, nicht die ganze Schleife. Die erforderlichen Codezeilen zum Erstellen und Starten des Threads können direkt nach der Zeile mit TcpListener.AcceptTcpClient eingefügt werden. Es werden also keine Events oder ähnliches benötigt.

Ablauf:
- Schleife wartet auf Verbindung (AcceptTcpClient blockiert).
- Schleife nimmt Verbindung an.
- Datenübertragung über Verbindung erfolgt in neuem Thread.
- Schleife wartet schon auf die nächste Verbindung.

Zitat
Thread t[10];
Programmierst du sonst C?
Der Arraytyp ist Thread[]. Eine Größe kann bei einer Array-Definition nicht angegeben werden, erst bei der Initialisierung. Und den Bezeichner so dazwischenklemmen geht auch nicht.

Also so ist es richtig:

Thread[] t = new Thread[10];

Gruss
Pulpapex

Thema: IMage Convertieren nach schwarz/weiß
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

ok, dann such mal im Netz nach "1 bit dithering". Es gibt verschiedene Algorithmen. Bei einem Quellbildmaterial sieht ein Algorithmus besser aus, bei einem anderen ein anderer.

Thema: Listbox während Laufzeit Größe verändern
Am im Forum: GUI: Windows-Forms

Vielleicht lässt der Container (Panel oder sonstiges) nicht genug Raum für Größenänderungen. Dein Steuerelement wird dann am Container-Rand einfach abgeschnitten.

Thema: IMage Convertieren nach schwarz/weiß
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Mit einer System.Drawing.Imaging.ColorMatrix geht's ...

Code Project:
ColorMatrix Basics - Simple Image Color Adjustment

MSDN:
GDI+ Recoloring


Gruss
Pulpapex

Thema: warten auf enter
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wie wäre es mit Console.ReadLine?

Thema: string von rechts splitten?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

System.IO.Path definiert Methoden zum Extrahieren von Path-Bestandteilen.

Die Dateierweiterung bekommt man so:

string ext = Path.GetExtension("file.txt");

Gruss
Pulpapex

Thema: Hilfe bei enum Struktur
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In VC# Beta2 gibt es einen Wizard, der einem zugeschnittene Settings-Klassen für Benutzer- und Anwendungseinstellungen generiert. Der Zugriff auf diese Klasse funktioniert genauso wie du es haben möchtest. Also nach dem Schema App.Settings.HintergrundFarbe usw. Die Einstellungen werden in Config-Dateien im XML-Format gespeichert.

Vielleicht guckst du dir den generierten Code dieser Klassen mal an. Ist einfach und durchschaubar. Das Prinzip kannst du dann zum Laden und Speichern deiner Strukturen übernehmen.

Siehe auch: Das neue Konfigurationsmodell im .NET Framework 2.0


Gruss
Pulpapex

Thema: Hilfe bei enum Struktur
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Original von -acid-
Um das mal in einer Struktur darzustellen:

Gruppen:
- Farben
---- Schlüssel1
------- Yes
------- No
---- Schlüssel2
------- 0
------- 1
- Höhen
---- Schlüssel1
-------- Wert1
-------- Wert

... Welche Klasse nehme ich dazu am besten um diese Struktur abzubilden bzw. ...

Du sagst es doch schon selber, du brauchst Klassen oder Strukturen. Definier' sie doch.

@herbivore, eine allgemeine Baumstruktur ist hier glaube ich nicht das richtige.

Der Code angedeutet:

public class Gruppen {
   public static Farben Farben { get; }
   public static Hoehen Hoehen { get; }
}

public class Farben {
   public YesNo Schluessel1 { get; set; }
   public int Schluessel2 { get; set; }
}

public enum YesNo { Yes, No }

// usw.

// Verwendung.
YesNo val = Gruppen.Farben.Schluessel1;
Wenn neue Optionen hinzugefügt werden können sollen, kann es natürlich nicht so starr programmiert werden. An der Stelle bieten sich typisierte Collections, List<T> oder Dictionary<T,U> an.

public class Gruppen {
   public static Dictionary<string, YesNo> Farben { get; }
   // ...
}

// Verwendung.
YesNo val = Gruppen.Farben["Schluessel1"];
In .Net 2.0 kann man parametrisierbare Collections verwenden, die erleichtern einem vieles. In .Net 1.1 muss für typsichere Collections mehr Aufwand betrieben werden. Geht aber auch, guck dir an wie StringCollection definiert ist.


Gruss
Pulpapex

Thema: Datei gleichzeitig lesen und schreiben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Was gibt es für einen Fehler?

Meiner Meinung nach müsste es funktionieren. Ich habe es allerdings nicht ausprobiert.

Zum Testen würde ich erstmal versuchen, direkt mit einem Stream zu hantieren, ohne Reader und Writer.

Zum Beispiel so.

byte[] data = new byte[5];
Stream stream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite);

// 5 Bytes lesen (vereinfacht).
int readCount = stream.Read(data, 0, 5);

// File-Pointer an Position 10 verschieben.
stream.Seek(10, SeekOrigin.Begin);

// 5 Bytes schreiben.
stream.Write(data, 0, 5);

stream.Close();
Wenn das funktioniert kannst du es nochmal mit StreamReader und StreamWriter probieren. Was ich noch gesehen habe, ein BufferedStream darf nicht dazwischenhängen.


Gruss
Pulpapex

Thema: Bitmap maskieren
Am im Forum: Grafik und Sound

Ich hätte eine Idee wie man das Problem mit dem System.Drawing.Imaging-Namespace lösen kann. Ist nicht ganz ausgegoren, wahrscheinlich geht es anders noch besser.

Drei Arbeitsschritte, man erstellt eine ColorMatrix, die alle Farben, ausser den Blau-Kanal auf 0 runtersetzt. Dann ändert man die Hintergrundfarbe von blau in grün und setzt auch den Blau-Kanal auf 0 runter. Übrig bleibt eine schwarze Sillouette mit grünem Hintergrund.

Msdn: GDI+ Recoloring


Die ColorMatrix ist ja eine 5x5-Matrix, die Farbtransformationen im ARGB(W)-Raum ausführt. Gibt es vielleicht eine Matrix, die das gleiche Ergebnis in einem Schritt erreicht?


Gruss
Pulpapex

Thema: Zweidimensionales Array sortieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Taxi4110,

ich würde es so machen wie Bernhard es vorschlägt.
Ersetz' das zweidimensionale Array durch ein eindimensionales, das Datenobjekte hält. Eindimensionale Arrays können leicht per Array.Sort und IComparer sortiert werden.

Wenn es von der Logik her eher eine Matrix ist und keine Liste von Objekten, kannst du auch ein geschachteltes Array verwenden (geschachtelte Arrays sind ohnehin den mehrdimensionalen Arrays vorzuziehen).

Ich hab es testweise mal programmiert, ist gar nicht mal so viel Code:

private const int COL_ID = 0;  // Index ID-Spalte
private const int COL_SUM = 1; // Index Sum-Spalte

// Table nach ID-Spalte gruppieren und aufsummieren.
// Statt int[,] wird int[][] verwendet.
static int[][] SumByID(int[][] table) {
   ArrayList result = new ArrayList();

   // table nach ID-Spalte sortieren  (Index 0).
   Array.Sort(table, new IdComparer());

   // table nach ID-Spalte aufsummieren.
   int[] resultRow = null;
   foreach(int[] row in table) {

      // Für jede ID eine neue Reihe 
      // zum Ergebnis hinzufügen.
      if(resultRow == null || 
         resultRow[COL_ID] != row[COL_ID]) {

         resultRow = new int[] { row[COL_ID], 0 };
         result.Add(resultRow);
      }

      // Aufsummieren.
      resultRow[COL_SUM] += row[COL_SUM];
   }

   // Ergebnis als Array zurückgeben.
   int[][] array = (int[][])result.ToArray(typeof(int[]));
   return array;
}

// IdComparer zum Sortieren nach ID-Spalte (Index 0).
class IdComparer : IComparer {

   public int Compare(object a, object b) {
      int[] rowA = (int[])a;
      int[] rowB = (int[])b;
      int v = Compare(rowA, rowB);
      return v;
   }

   public int Compare(int[] a, int[] b) {
      int v = a[COL_ID] - b[COL_ID];
      return v;
   }
}
Ich hab das komplette Beispiel angehängt.


Gruss
Pulpapex

Thema: Zeilenumbruch in Strings
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Quallo,

man kann Hexwerte als Escapesequenzen angeben:

"Butter + Kuchen ergibt\x000dButterkuchen"
Das Zeichen '\x000d' entspricht glaube ich '\r'. '\n' ist '\x000a'.

Unter Umständen musst du noch ein System.Text.Encoding verwenden, damit pro Zeichen nur ein Byte gespeichert wird.


Gruss
Pulpapex

Thema: Casting zu ursprüglichem Typ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Genauso ist es,

der Cast nach UserControl reicht in dem Fall vollkommen aus (... ist auch kein schlechter Stil, oder was meintest du?).

Deine Anwendung sollte bei den UserControls vielleicht noch DockStyle.Fill setzen, damit diese immer die gesamte TabPage ausfüllen.

Thema: Casting zu ursprüglichem Typ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

mit GetType bekommst du ein Type-Objekt. Das ist nicht der eigentliche Type, sondern nur eine Repräsentation in Objektform.

Über Type-Objekte ist Reflection möglich. Theoretisch liesse sich mit Reflection alles dynamisch zur Laufzeit machen, was man sonst starr im Quellcode programmiert. Das wäre also eine Lösung wie man unbekannte Typen verwenden kann.

Allerdings eine sehr schlechte Lösung. Durch Reflection verliert man die Typsicherheit, der Code wird unleserlich, schwerer wartbar und langsamer. Wenn möglich, Reflection immer vermeiden.

Die allermeisten Probleme lassen sich auch so lösen. In deinem Fall reicht es wie gesagt z.B. aus, ein Interface vorzugeben, das alle UserControls implementieren müssen, damit sie dynamisch zur Laufzeit geladen und verwendet werden können.

Thema: Casting zu ursprüglichem Typ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Hank-ER,

warum kann nur nach UserControl gecasted werden?
Oder, warum geht das nicht:

object myObj2 = // ...;
MyUserControl myUserControl = (MyUserControl)myObj2;

Falls du mehrere unabhängige UserControl-Klassen geschrieben hast, in die myObj2 gecastet werden können soll, gibt es verschiedene Möglichkeiten, hier zwei Stück:

1: alle UserControls leiten von einem abstrakten Basis-UserControl ab, das alle benötigten Methoden und Eigenschaften abstrakt vordefiniert (Alternativ können die UserControls auch ein gemeinsames Interface implementieren):

public class MyUserControlBase : UserControl {
   public abstract int Value1 { get; set; }
}

public class MyUserControlA : MyUserControlBase {
  public override int Value1 { /* Impl.; */ }
}

public class MyUserControlB : MyUserControlBase {
  public override int Value1 { /* Impl.; */ }
}

2: Du testest mit dem is-Operator auf den konkreten Type.

object myObj2;

if(myObj2 is MyUserControlA) {
  MyUserControlA a = (MyUserControlA)myObj2;

} else if(myObj2 is MyUserControlB) {
  MyUserControlB b = (MyUserControlA)myObj2;
}

Gruss
Pulpapex

Thema: Keine Bitmaps bei Aktivierung des XP Styles
Am im Forum: GUI: Windows-Forms

Da gab es mal was vor Urzeiten, es ist ein Bug in .Net 1.1. Alte Threads zu dem Thema müssten noch über die Boardsuche zu finden sein.

Eine Lösung ist, man benutzt eine Manifest-Datei. Zu früh gefreut.


Gruss
Pulpapex

Thema: Werte aus "Stream"-Array auslesen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi JDizzle,

gibt es im Compact Framework vielleicht System.IO.BinaryWriter und System.IO.BinaryReader? Mit den beiden Klassen können einfache Datentypen übertragen werden. Man muss nur wissen in welcher Reihenfolge die Daten im Stream liegen.

Hier mal ein Beispiel (das Prinzip angedeutet):

// Data-Struktur.
public struct Data {

   public string FieldA;
   public double FieldB;
   public long FieldC;
  
   public Data(string a, double b, long c) {
      FieldA = a; FieldB = b; FieldC = c;
   }
}


// Zu schreibendes Data-Object.
Data data = new Data("Test", 2.5, 6L);

// In den Stream schreiben.
MemoryStream output = new MemoryStream();
BinaryWriter writer = new BinaryWriter(output);
writer.Write(data.FieldA);
writer.Write(data.FieldB);
writer.Write(data.FieldC);

// Wieder auslesen.
MemoryStream input = new MemoryStream(output.ToArray());
BinaryReader reader = new BinaryReader(input);
string a = reader.ReadString();
double b = reader.ReadDouble();
long c = reader.ReadInt64();

// Ausgelesenes Data-Objekt
Data data2 = new Data(a, b, c);

Gruss
Pulpapex

Thema: Networkstream deserialisieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Gibt es,
XmlTextReader hat einen Konstruktor, der einen Stream entgegennimmt.

Zitat
JDizzle
Laut MSDN müsste man für XmlSerializer.Deserialize auch einen Stream als Parameter angeben können, aber das geht einfach nicht.
Wie äussert sich das? Welche Fehlermeldung wird ausgegeben? Ich vermute das eigentliche Problem ist der serialisierte Type. Zum Beispiel serialisiert Xml-Serialisierung nur öffentliche Felder und Eigenschaften. Die Eigenschaften müssen Getter und Setter definiert haben. Und es muss einen öffentlichen Standard-Konstruktor geben.


Gruss
Pulpapex

Thema: paint on icon
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also eine Graphics.FromIcon-Methode gibt es leider nicht. Icon leitet auch nicht von Image ab (Graphics.FromImage-Methode gibt es).

Du könntest mal folgendes probieren:

IntPtr iconHandle = icon.Handle;
Graphics g = Graphics.FromHdc(iconHandle);
Ich weiss aber nicht ob ein Icon-Handle gleichzeitig auch ein Device-Context-Handle ist. Wahrscheinlich nicht, aber vielleicht ja doch.


Gruss
Pulpapex


// Edit: ist wohl Quatsch. Ein Hdc ist ein Handle für ein Graphics-Objekt. Es gibt ne Graphics.GetHdc-Methode.