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 JunkyXL
Thema: Controls einers anderen Prozesses füllen
Am im Forum: GUI: Windows-Forms

Hallo,

falls es sich hierbei um eine App handelt, deren Quellcode du hast, könntest du per IPC über ein eigens definiertes Interface die App ansprechen.

Ansonsten bist du, so wie ich das sehe, schon mal auf dem richtigen Weg. Bezühlich Spy++ kann ich dir leider nichts über das Herausfinden der Handles sagen.

Thema: Null-Items nach Deserialisierung mit SerializationBinder und ISerializable
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich habe nach langer Zeit endlich wieder was, worauf ich im Netz nichts finden konnte.

Ich habe ein Objekt mit dem BinaryFormatter serialisiert.
Nun möchte ich dieses Objekt in ein anderes Objekt deserialisieren (migrieren).
Das ist mit dem SerializationBinder schonmal kein Problem, wenn die Properties der Objekte übereinstimmen.
Wenn die Properties jedoch abweichen, wird da ISerializable auf dem neuen Objekt nötig, um die Properties entsprechend zu übernehmen.

Jetzt zum Problem: Wenn ich ISerializable implementiere, kommt am Ende eine Null-Referenz anstelle des neuen Objekts raus. Wenn ich das Interface weglasse, funktioniert alles - bis auf die Properties, die nicht gefüllt sind, weil sie sich im Namen vom alten Objekt unterscheiden.

Deserialisung

public Car Deserialize(Stream stream)
{
    stream.Position = 0;

    var f = new BinaryFormatter();
    f.Binder = new VehicleToCarBinder();
    return (Car)f.Deserialize(stream);
}

VehicleToCarBinder

public class VehicleToCarBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        if (typeName == typeof(Vehicle).FullName)
            return typeof(Car);

        if (typeName == typeof(List<Namespace1.Wheel>).FullName)
            return typeof(List<Namespace2.Wheel>);

        if (typeName == typeof(Namespace1.Wheel).FullName)
            return typeof(Namespace2.Wheel);

        return null;
    }
}

Betroffenes (neues) Objekt

namespace Namespace2
{
    [Serializable]
    public class Wheel// : ISerializable // <-- Interface auskommentieren: Unit-Test funktioniert (logischerweise ohne Property-Werte)
    {
        public Wheel()
        {
        }

        protected Wheel(SerializationInfo info, StreamingContext context)
        {
            Inches = (int)info.GetValue("<Size>k__BackingField", typeof(int));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("<Size>k__BackingField", Inches);
        }

        public int Inches { get; set; }
        public string Type { get; set; }
    }
}

Der Test

[TestMethod]
public void SerializeVehicle()
{
    var vehicle = new Vehicle();
    vehicle.Wheels.Add(new Wheel { Size = 15, Type = "Soft" });
    vehicle.Wheels.Add(new Wheel { Size = 15, Type = "Hard" });

    var serializer = new VehicleSerializer();
    var stream = serializer.Serialize(vehicle);

    var car = serializer.Deserialize(stream);

    Assert.IsNotNull(car.Wheels[0]);
    Assert.IsNotNull(car.Wheels[1]);

    Assert.AreEqual(vehicle.Wheels[0].Type, car.Wheels[0].Type);

    // Die letzten beiden Tests sollten am Ende auch funktionieren

    //Assert.AreEqual(vehicle.Wheels[0].Size, car.Wheels[0].Inches);
    //Assert.AreEqual(vehicle.Wheels[1].Size, car.Wheels[1].Inches);
}


Anbei ist das Ganze als lauffähige Solution angehängt.


Ich hoffe, jemand stand schonmal vor dieser Problematik.

Danke euch

Thema: TraceEye - Professional LogViewer
Am im Forum: Projekte

Zum Speicherverbrauch:
Bei vielen Einträgen stößt man halt mit der ListView an ihre Grenzen. Entweder würde ich die ListView pagen oder es mit dem DataGridView probieren, sollte grundsätzlich Speicherschonender sein.

Thema: DevExpress.XtraGrid: Selektieren einer Cell und markieren des Inhalts
Am im Forum: GUI: Windows-Forms

Vermutlich steht der SelectionMode nicht auf Cell (oder so ähnlich)?
Weiß jetzt gerade nicht die korrekten Properties, aber in die Richtung könnte es gehen.

Thema: .NET neu erfunden in Native Code und COM
Am im Forum: Szenenews

"Windows 8 Apps benötigen neue Windows Runtime"

Hat das jemand eigentlich mitbekommen?

Es bezieht sich zwar fürs erste auf Windows 8 Metro Apps, aber es sieht nach einer klaren Marschrichtung aus:

Windows 8 Apps benötigen neue Windows Runtime: .NET neu erfunden in Native Code und COM

Thema: Wird die Bitte, die besten Treffer aus der Forensuche zu posten, ausreichend ernst genommen?
Am im Forum: Wünsche und Kritik

Ich hätte dazu eine Idee, die Umsetzung der Bitte zu pushen.

Man sollte die Hilfesuchenden doch auch einfach mal fragen (nicht rügen), was aus ihrem Problem geworden ist und warum die (evtl.) Treffer nicht gepostet wurden.
Es könnte nämlich auch gut sein, dass man in der Zwischenzeit das Problem anderweitig gelöst hat (von selbst, Google).

Die Idee, das Ganze zu pushen, liegt darin, geöffnete Threads als [ungelöst] zu markieren. Und der User diese als [gelöst] markieren kann, sobald er eine Lösung hat. Natürlich unter der sinnvollen Voraussetzung, dass er ebenso die Lösung postet.

Was ich auch nicht schlecht finde, ist die Markierung eines Posts als "most helpful/best answer" und z.B. direkt unter dem Eingangspost gepinned ist.

Ich denke einfach nur, dass das den Hilfesuchenden mehr motiviert, den Thread qualitativ und im Sinne der Community zu gestalten. Ich empfinde es als "unangenehm" wenn der Thread mit ner dicken roten Schrift vorangestellt ist, und wenn ich doch eine Lösung für mein Problem habe, dann lasse ich die rote Schrift verschwinden und bin zufrieden.


Inspiriert aus diesem Forum: http://www.sencha.com/forum/forumdisplay.php?87-Ext-Q-amp-A

Was dort etwas "krass" ist - wie ich finde, aber vielleicht akzeptabel - dass man als Threadersteller eine PN bekommt, sobald eine Antwort verfasst wurde und man prüfen soll, ob das die Lösung war, um dann den Thread als gelöst und die beste Antwort zu markieren.

Thema: Skin-Funktionalität für Controls per Skript zur Laufzeit zur Verfügung stellen
Am im Forum: GUI: Windows-Forms

Bei Windows-Controls ist das etwas schwerer mit dem Zeichnen.
Du könntest viel eher versuchen, WM_PAINT (Stichwort: P/Invoke) zu behandeln und dort deine Zeichenroutine versuchen.
Aber das ist alles wieder so experimentell, erst recht deine Idee, die Methode technisch zu Überschreiben.
Selbst wenn du sie überschreiben würdest, meines Wissens nach ist das Zeichnen zu dem Zeitpunkt bereits geschehen.

Die einzig wirkungsvolle Variante, einen System.Windows.Forms.Button vom Zeichnen abzuhalten, sehe ich nur in einem eigenen IMessageFilter, der WM_PAINT für Buttons dann einfach nicht behandelt. In etwa so:

if (m.Msg == WM_PAINT)
    return true;

Viel Spaß damit.

Thema: Skin-Funktionalität für Controls per Skript zur Laufzeit zur Verfügung stellen
Am im Forum: GUI: Windows-Forms

Zitat von tom-essen
Du könntest höchtens noch versuchen, bei den vorhandenen Buttons das Paint-Event zu abbonieren
Das tut er doch bisher schon:

else if (c.GetType() == typeof(Button))
{
    Button b = (Button)c;

    // Hier -->
    b.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 3);
        Rectangle rect = new Rectangle(0, 0, 200, 200);
        e.Graphics.DrawRectangle(blackPen, rect);
    });
}

Thema: Skin-Funktionalität für Controls per Skript zur Laufzeit zur Verfügung stellen
Am im Forum: GUI: Windows-Forms

Na du bist mir ein Held. Es ist ja immer noch ein Windows Forms Button!
Ihn in ButtonBase zu casten ändert doch gar nichts.

public class MyButton : ButtonBase
{
}

Edit: Beim Erstellen des Buttons schreibst du anstatt new Button() --> new MyButton()

und später dann:

else if (c.GetType() == typeof(MyButton))
{
    MyButton b = (MyButton)c;

    b.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 3);
        Rectangle rect = new Rectangle(0, 0, 200, 200);
        e.Graphics.DrawRectangle(blackPen, rect);
    });
}


Wobei ich bei der Gelegenheit das dann eher so machen würde:

public class MyButton : ButtonBase
{
    public Skin Skin { get; set; }

    protected override void OnPaint(PaintEventArgs e)
    {
        this.Skin.Paint(this, e); // where Skin : ButtonSkin

        base.OnPaint(e);
    }
}

public abstract class Skin
{
    public void Paint(Control c, PaintEventArgs e)
    {
        this.Control = c;
        this.Graphics = e.Graphics;

        // BeforePaint();
        this.OnPaint();
        // AfterPaint();
    }

    protected abstract void OnPaint();
}

public class ButtonSkin : Skin
{
    // Abstract
    protected override void OnPaint()
    {
        Pen blackPen = new Pen(Color.Black, 3);
        Rectangle rect = new Rectangle(0, 0, 200, 200);
        this.Graphics.DrawRectangle(blackPen, rect);
    }
}

Thema: Skin-Funktionalität für Controls per Skript zur Laufzeit zur Verfügung stellen
Am im Forum: GUI: Windows-Forms

Zur Design-Zeit, ja.
Es geht ja gerade darum, dass du per Paint-Event den System.Windows.Forms.Button nicht groß beeinflussen kannst. Und ich meine, dass das mit ButtonBase zu bewerkstelligen sein müsste.

Thema: Skin-Funktionalität für Controls per Skript zur Laufzeit zur Verfügung stellen
Am im Forum: GUI: Windows-Forms

Ich glaube, dafür kannst du ButtonBase gut verwenden. Also erstelle dir eine Klasse, die davon ableitet.

Thema: Neu: TX Text Control 16.0 Express
Am im Forum: Szenenews

Danke für die Info!
Kommt gerade recht. Sind schon am Planen, das TE Edit Control durch TXText Control zu ersetzen. Mal schauen, ob dafür die Express-Version ausreicht.

Thema: Wo/Wie EventHandler registrieren, wenn die Methode, die das Event auslöst, in extra Thread läuft
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die FAQ bringt einfach nichts, wenn sie sich niemand durchliest. Da kann man noch so oft den Link posten:
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
[FAQ] Warum blockiert mein GUI?

Kurz und primitiv zusammengefasst: Wenn du mit Threads arbeitest und aus einem Thread heraus an deiner grafischen Oberfläche etwas anzeigen willst, musst du mit Invoke arbeiten, da sich das GUI in einem anderen Thread befindet.

Thema: Wo/Wie EventHandler registrieren, wenn die Methode, die das Event auslöst, in extra Thread läuft
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

so ganz verstehe ich dein Problem jetzt nicht. Wenn du eine Klasse hast, die sich um das UDP Handling kümmert, ist es dir egal, ob die Start-Methode synchron oder asynchron ausgeführt wird.

class UDP
{
    public void Start(int port)
    {
        ThreadPool.QueueUserWorkItem(StartInternal, port);
    }

    private void StartInternal(object _port)
    {
        int port = (int)_port;
        // ...

        if (DeinEvent != null)
        {
            DeinEvent(this, EventArgs.Empty);
        }
    }

    public event EventHandler DeinEvent;
}

von außen aufgerufen:

UDP udp = new UDP();
udp.DeinEvent += DeinEventHandler;
udp.Start(5000);

void DeinEventHandler(object sender, EventArgs e) { }

Der Code ist mehr exemplarisch, sollte dir so jedoch veranschaulichend weiterhelfen.

Thema: Word-Interop latebinding: Wie schreibe ich ein DefaultUsertemplate-Property?
Am im Forum: Office-Technologien

Achso, war mir jetzt nicht klar, dass beim Late Binding der Aufruf nicht genauso erfolgt.

Thema: Word-Interop latebinding: Wie schreibe ich ein DefaultUsertemplate-Property?
Am im Forum: Office-Technologien

Die Methode heißt doch set_DefaultFilePath! Und ob da BindingFlags.SetProperty funktioniert, weiß ich nicht. Es ist immerhin eine Methode, die aufgerufen wird, und nicht ein Property.

Thema: Microsoft enthüllt neues Windows 8 User Interface
Am im Forum: Szenenews

IMHO:
Das liegt auch daran, dass "Windows" mittlerweile viel mehr ein eigenständiger Name ist, mit dem man einfach nur das Betriebssystem in Verbindung bringt, ohne dabei an die Fenster zu denken.

Daher denke ich, wird Windows als Name auch bleiben, sonst wäre ja der gewichtige Marktname zerstört. Außerdem soll ja Windows an sich im Unterbau erhalten bleiben :-) Und wenn ich das richtig aufgefasst habe, sind die Tiles nur ein Aufsatz, gedacht als primäre Oberfläche.

Windows Tiles könnte ich mir von daher vielleicht als Name vorstellen.

Thema: NetOffice - Ein versionsunabhängiger Wrapper für MS-Office
Am im Forum: .NET-Komponenten und C#-Snippets

Sehr gute Arbeit! Werde ich mir mal anschauen. Könnte das gut gebrauchen.

Thema: WebBrowser-Control (o.ä.): Bild zwischenspeichern / Buffern
Am im Forum: GUI: Windows-Forms

Du kannst doch die Bilder statisch in deiner Anwendung buffern. Da du ja die URL zu dem Bild hast, reicht doch ein simples <string, Image>Dictionary völlig aus, oder habe ich jetzt etwas übersehen?

Thema: WebBrowser-Control (o.ä.): Bild zwischenspeichern / Buffern
Am im Forum: GUI: Windows-Forms

Kann mich nicht genau vorstellen, was du genau machst? Sind das Vorschaubilder deiner Suchergebnisse, sind die Bilder immer gleich? Wieso werden diese immer neu geladen?

Thema: WebBrowser-Control (o.ä.): Bild zwischenspeichern / Buffern
Am im Forum: GUI: Windows-Forms

Sind wir jetzt im Web oder in Windows Forms?

Thema: PropertyDescriptor.AddValueChanged will nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Danke für eure Antworten.

Ich habe jetzt den Grund für meine Verwirrung gefunden.
Ich habe AddValueChanged in einigen Projekten benutzt, um ein Objekt zu überwachen, über das ich selbst nicht die Kontrolle habe. Und anscheinend werden die Properties auf dem Objekt mit SetValue gesetzt. Das war mir nicht bewusst.

Thema: PropertyDescriptor.AddValueChanged will nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von winSharp93
Aber auslösen tust du das Event ja nie?!?

Du musst in den Setter den entsprechenden Code schreiben - sollte aber genügend Beispiele dazu geben.
Das Event will ich ja auch gar nicht selber auslösen. Das soll ja eben automatisch über den PropertyDescriptor mit AddValueChanged geschehen.

Verstehe ich eure Hinweise also richtig, für jedes Property ein -Changed Event bereitzustellen? Wo ist denn da noch der Mehrwert von AddValueChanged?
Ich bin mir auch mittlerweile nicht mehr sicher, ob wir noch von dem selben Problem sprechen..

Ich hab das bisher immer so gemacht, den PropertyDescriptor jedes Property's einer Klasse zu durchlaufen und in AddValueChanged eine stupide Methode zu hinterlegen, die aufgerufen wird, sobald sich irgendein Property-Wert ändert, was aber nicht passiert.

Aber soweit erstmal Danke für eure Antworten.

Thema: PropertyDescriptor.AddValueChanged will nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von talla
bezüglich VS Express: Hat damit absolut gar nichts zu tun, da das ja nen Thema der Runtime und nicht der IDE ist.
Ich weiß :) Das sind aber diese Momente wo ich anfange, alles in Erwägung zu ziehen :)

Das mit dem Interface habe ich schon drin gehabt, hab das im Post nur ausgelassen.
Habe jetzt nochmal ein neues Sample gemacht. Sowohl Interface implementiert, als auch EventHandler ValueChanged zusätzlich bereitgestellt:

class Program
{
    static void Main(string[] args)
    {
        var i = new MyClass();
        i.ValueChanged += new EventHandler(i_ValueChanged);
        i.PropertyChanged += new PropertyChangedEventHandler(i_PropertyChanged);
        i.Property = "test";

        Console.ReadLine();
    }

    static void i_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine("Property value changed");
    }

    static void i_ValueChanged(object sender, EventArgs e)
    {
        Console.WriteLine("Property value changed");
    }
}

public class MyClass : INotifyPropertyChanged
{
    public MyClass()
    {
        foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(this))
        {
            pd.AddValueChanged(this, this.OnValueChanged);
        }
    }

    private void OnValueChanged(object sender, EventArgs e)
    {
        if (this.ValueChanged != null)
        {
            this.ValueChanged(this, new PropertyChangedEventArgs(""));
        }

        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(""));
        }
    }

    public event EventHandler ValueChanged;

    #region INotifyPropertyChanged implementation
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    public string Property { get; set; }
}

Thema: PropertyDescriptor.AddValueChanged will nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ich bin am Verzweifeln. Ich hab das schon 1000 mal gemacht, und heute Nacht ging das auch noch.
Jetzt nicht mehr. Und zwar folgendes:

Der Bequemlichkeit halber will ich Property-Änderungen dynamisch überwachen:

foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(this))
{
    pd.AddValueChanged(this, this.OnPropertyValueChanged);
}
// ...
private void OnPropertyValueChanged(object sender, EventArgs e)
{
}

An sich nichts spektakuläres. Der übergebene Handler in AddValueChanged wird nie aufgerufen, wenn sich ein Property-Wert ändert. Vielleicht seh ich gerade auch den Wald vor lauter Bäumen nicht. Aber ich kann keinen Fehler entdecken.

Hier die vollständige Test-Klasse, mit der es (bei mir) nicht funktioniert:

public class Class1
{
    public void Test()
    {
        this.Value = 0;

        foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(this))
        {
            pd.AddValueChanged(this, this.OnPropertyValueChanged);
        }

        // Wertänderungsbenachrichtigung erzwingen
        this.Value = 4711;
        this.Value = 0815;
    }

    private void OnPropertyValueChanged(object sender, EventArgs e)
    {
        // Wird nie aufgerufen
        Debug.Assert(false, "this.Value changed: " + this.Value);
    }

    public int Value { get; set; }
}

var test = new Class1();
test.Test();

Im Internet finde ich keine nützliche Informationen. Und da es so schon immer funktioniert hat, wollte ich auch nicht auf das "neue" DependencyProperty Handling umsteigen.

Das einzige was ich gefunden habe, ist das SupportChangeEvents Property auf dem PropertyDescriptor was auf false steht, was mit der Nicht-Benachrichtigung zu tun haben könnte. Aber damit kann ich auch nicht viel anfangen, da ich auch Basistypen wie int und string verwende. Ich musste mich auch nie darum kümmern.

Das Ganze habe ich in einer VM (Windows XP SP 3) mit Visual C# Express 2010 am Laufen. Ich kann mir nicht vorstellen, dass die Express Version solche Einschränkungen hat?!

Thema: ListView: Selektieren Eintrag löschen
Am im Forum: GUI: Windows-Forms

Stimmt. Ich war mir nicht sicher, ob die Selected-Collection unverändert bleibt. Hab das verwechselt.

[FAQ] Auflistungs-Elemente suchen und entfernen

Thema: ListView: Selektieren Eintrag löschen
Am im Forum: GUI: Windows-Forms

Was bedeutet denn listView1.SelectedItems[0]?

Entfernen tust du ohnehin besser so:

foreach (ListViewItem item in listView1.SelectedItems)
{
    item.Remove();
}

Thema: Controls zeichnen durch halbtransparentes Panel "durch" (je nach Double-Buffering-Einstellung)
Am im Forum: Grafik und Sound

Was heißt genau "sobald du DoubleBuffering verwendest"?

Edit: Hab das mal versucht, nachzustellen. Scheint so nix zu helfen. Da Transparenz, vor allem in GDI/+ sehr langsam ist, ist wohl WPF die bessere Wahl, wenn du damit rumspielen willst.

public class MagicPanel : Control
{
    public MagicPanel()
    {
        this.SetStyle(
            ControlStyles.SupportsTransparentBackColor | /* wichtig */
            ControlStyles.UserPaint | /* benötigt */
            ControlStyles.AllPaintingInWmPaint | /* benötigt */

            ControlStyles.OptimizedDoubleBuffer | /* Mit oder ohne, gleiches Verhalten */
                
            ControlStyles.ContainerControl | /* optional */
            ControlStyles.ResizeRedraw, /* optional */
            true);
    }
}

Thema: UNIQUE KEY Einschränkung ausnutzen?!
Am im Forum: Datentechnologien

Zu 1) Das Thema hatte mich mal auch interessiert und bin bisher nicht wirklich zu einer eindeutigen bzw. schlüssigen Antwort gekommen. Viele sagen, dass es sogar keinen Unterschied machst, ob du die Column 'Is Unique' machst oder als Type 'Index' oder 'Unique' auswählst. Der Index kommt letztendlich immer drauf. Aber dem traue ich nicht so ganz. Lässt sich aber eigentlich leicht feststellen, ob das so ist (Index-Einträge ansehen). Bin nur grad nicht in der Lage dies zu tun.

Thema: Coding Styles Horror
Am im Forum: Smalltalk

Hab soeben etwas idiotisches in meinem eigenen Code entdeckt :D

if (instance.Prop1 != null && instance != null)

Status: Fixed ;)