Laden...

Forenbeiträge von martin_zi Ingesamt 134 Beiträge

11.01.2014 - 02:52 Uhr

Für interessierte ... Es geht in diese Richtung:
C# Generic Type Generator
Nur automatisierter generiert aus anderem Objektmodellen ...

11.01.2014 - 02:41 Uhr

Ganz genau darum geht es um einen Codegenerator für ein automatisiertes Testframework. Schwierig in kurzen Worten die Details zu beschreiben.

Aber irgendwer muss den Codegenerator auch entwicklen und mal den output debuggen und dafür entwickle ich mir halt Tools um das zu überprüfen wenn doch mal was schief geht.

Ich wollte bloß wissen ob mich Studio da unterstützen kann.

Per "Hand" mach ich sowas nicht.

Grüße

02.01.2014 - 20:00 Uhr

Hallo

Das ist mir schon alles klar das der Namespace nicht unwichtig ist. Aber es gibt Fälle da erschweren sie.

Das Beispiel mit den Dictionary ist auch nur ein Beispiel weil ich nicht alle Klasse von mir einbringen wollte, (viel zuviel Text und hat nichts mit dem Problem zu tun)
Eigentlich sind alle Generics die genutz werden eigene Konstrukte und es ist ein eigenes Framework und ergeben schon auch Sinn. Ich wollte bloß zeigen wie unübersichtlich die vollständigen "Lange" Name es macht.

Problem ist nur das eben die ganzen Namespaces die Sucher erschweren(wenn mal wieder was nicht passt) und in vielen Fällen nicht notwendig sind. Wie erwähnt in 2ter Instanz kann man sich immer noch alle mit Namespace anschauen. Ich will sie auch nicht generell per default abgschalten haben. Ich hoffte bloß eine Möglichkeit finden z.B. eine Ansicht ohne Namespaces. Bei default Typen geht das ja auch.

Und ich arbeite praktisch eben so(wie erwähnt) ich kopiere die Fehlermeldung in Texteditor und lösche alle Namespaces weg. Sonst habe ich keine Chance irgendwas zu finden. (Ok chance schon aber es dauert um das X-fache länger)
Ohne Namespaces finde ich den Fehler sofort und schnell.

Hat man eigentlich die Möglichkeit so ein Addin zu schreiben und bekommt dann die Fehlermeldung als text und kann diese manipulieren bzw selbst was anzuzeigen ?

Grüße

14.12.2013 - 12:22 Uhr

Sehe ich genau anderes rum.Man macht es ja bewusst und will es so. Mir wird durch die Namspaces dier Fehlersuche erschwert.
Im 2ten Schritt kann man sich immer noch um die Namespaces genau anschauen.

Aber ich finde das einfach unübersichtlich> Fehlermeldung:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <Firmenname.Produktname.Namspacename.MyClass, Firmenname.Produktname.Common.Namspacename.MyAuto>, Firmenname.Produktname.Common.Namspacename.MyBesitzer>, System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <Firmenname.Produktname.Namspacename.MyClass, Firmenname.Produktname.Common.Namspacename.MyAuto>, System.Collections.Generic.List <Firmenname.Produktname.Common.Namspacename.MYInt>>>' to 'System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <Firmenname.Produktname.Common.Namspacename.MyAuto, Firmenname.Produktname.Namspacename.MyClass>, Firmenname.Produktname.Common.Namspacename.MyBesitzer>, System.Collections.Generic.Dictionary <System.Collections.Generic.Dictionary <Firmenname.Produktname.Namspacename.MyClass, Firmenname.Produktname.Common.Namspacename.MyAuto>, System.Collections.Generic.List <Firmenname.Produktname.Common.Namspacename.MYString>>>' d:\Users\Documents\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 70 21 WindowsFormsApplication1

und das weniger unübersichtlich.

Fehlermeldung:
Error 1 Cannot implicitly convert type
'Dictionary <Dictionary <Dictionary <MyClass, MyAuto>, MyBesitzer>, Dictionary <Dictionary <MyClass, MyAuto>, List <MYInt>>>' to
'Dictionary <Dictionary <Dictionary <MyAuto, MyClass>, MyBesitzer>, Dictionary <Dictionary <MyClass, MyAuto>, List <MYString>>>' d:\Users\Documents\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 70 21 WindowsFormsApplication1

Und das ist nur ein Teilauszug was in meine Projekt so vor kommt. Da haben die Generics 7 Typparameter und mehr. Und im Studio wird das nicht so schön eingerückt wie ich das hier habe.

Also moment erschweren mir die Namespaces die Fehlersuche definitiv.
Im 2ten Schritt kann ich immer noch mal alles anschauen sollte es wirklich an den namespaces scheitern. Das macht man ja bewusst.

Ich kopier daher erstmal alles in einen Texteditor lösche die Namespaces weg und finde dann recht schnell die Fehler. Zumal im Studio wie schon erwähnt nicht so schöne alles untereinader steht. wie ich das hier aufbereitet habe und ich für das Beispiel zu faul war eigene Generics zu implementieren.

Bei den Standarttypen geht es ja auch.

12.12.2013 - 10:30 Uhr

Hallo

Gibt es eine Möglichekite den Namespace eines Objectes im "Watch"-Fenster nicht anzuzuzeigen ?
Bzw auch bei der Fehlermeldung ?

Ich Arbeit oft mit generics und ich finde es oft sehr unübersichtlich wenn der Datentyp mit dem gesamten Namspace angegeben wird.

Grüße,
Martin

07.03.2013 - 12:23 Uhr

Hallo

Ja jetzt probiert aber selbes Problem. Wie bei allen Beispielen was ich so im Netz gefunden habe.
Allerdings konnte ich mir diese Variante so umbauen dass ich die einzelnen Zeichen lesen kann. Mit DataReceivedEventArgs e bekommt man nämlich nur einen String.
Jetzt kann ich mir meine eigen ReadLine Methode bauen. einmal wird dann einfach eine Zeile hinzugefügt. Beim anderen mal wird die Letzte Zeile eichfach überschrieben.
Darauf läuft es doch hinaus ?

Ist es jetzt wirklich "\r\n" oder "\n\r" da gibts ja widersprüchige Ansichten im Netz.

Und was nehme ich da am beste? eine Stringbuilder den ich dann an mein Control hänge ? Ich würde gerne direkt den String manipulieren können der am Control hängt.
Hoffe verständlich ausgedrückt.

Grüße

06.03.2013 - 13:11 Uhr

Hallo

Ich möchte gerne in meine Applikation eine "Console einbetten". Also ich setzte einen Befehl ab und der Output der Console soll an mein Fenster gesendet und ausgegeben werden.
So wie mache ich das ? Zuerst mal was ich bereits habe.
Ich kann einen Befehl "asyncron" absetzten und in meinem "From" habe ich ein Richtextbox die ich mit dem "StandardOutput" befülle. Soweit so gut.

Ich habe eine Methode die sich darum kümmert.


private void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
	//... 
}

Mit


this.rtOutPut.AppendText(e.Data + "\r\n");

befülle ich diese RickTextBox.
Mein Problem ist angenommen ich setzte einen Befhel ab der mit irgend etwas mit % Zeigt dann wird das natürlich nicht richtig dargestellt.
Also angenommen ich starte Befehl wie "Format X:", "Checkdsk", "Copy" etc dann wird auf der "echten" MS-Eingabe Aufforderung immer genau einer Stelle in der Zeile aktualisiert.
Ich bekomme jetzt aber die Zeile nochmal und Append führt nicht zum Ziel. ich müsste also die Letzte Zeile überschreiben. Dafür gibt es ja diese Steuercodes "Carriage return" ?

Dieses DataReceivedEventArgs e liefert mir aber nur einen String. Wie kann ich das am besten machen ?
Jemand eine Idee ?
Ich hoffe ich bin da nicht am Holzweg mit meiner Vermutung wo cih das Problem sehe 😃 ..

Grüße
Martin

31.10.2012 - 11:33 Uhr

Hi

Supert,thx das hat jetzt geholfen 😃...

Vor allem der Hinweis mit FrameworkElement, OnRender-Methode.

Ich musst mich aber erst durch das ganze durchwühlen ...
Daher so spät die Antwort ...

Grüße

23.10.2012 - 12:58 Uhr

Hallo

Ok musste mir das erst ansehen und ein bisschen herumspielen. Ich glaube ich habe mich wohl ein bisschen unglücklich ausgedrückt.
Ich als Programiere möchte auf einem Control abhängig von meinen Daten die ich zur verfügung habe etwas zeichnen.
Nicht der User. Der sieht bloß das Ergebnis.

Also von mir aus als konkreteres Beispiel: Koordinatensystem X,Y Achse. Input eine Funktion z.B y = x^2 ...
Zeichne die Funktion. Daher das mit XAML führt ja wohl nicht zum Ziel da es viel zu "starr" ist. So wie ich das sehe ist ja XAML auch nur zur Layoutierung gedacht.

Aber InkCanvas ist schon mal nicht schlecht für andere Experimente. 😃
Sieht aber mehr als ein "PaintControl" für den User aus. ...

Gruß

22.10.2012 - 16:55 Uhr

Hallo

ICh habe ein paar Fragen zu WPF. Irgendwie bekomme ich da den Überblick nicht hin wie man in meinem Fall am besten loslegt.

Ziel ist kleines Fenster Rechts am Rand sind ein paar Knöpfe. Der Rest also links davon ist eine Fläche in der ich Zeichnen kann. Linien Rechtecke etc .. Mehr will ich fürs erste nicht. Und auch nicht in die Zukunft gedacht ... ich will einfach mal mit WPF spielen aber trotzdem soll was saubers rauskommen 😃.

In C# mit Winforms hätte ich mir jetzt eine eigene Klasse gebaut, diese ist von Control/Window abgeleitet,OnPaint überschrieben und alles was ich noch so brauche...

Wie macht man das jetzt in WPF ? Ich bekomme da einfach keine Gefühl dafür. Ich kann zwar alle möglichen Controls zusammen stecken und mit Leben füllen aber ..
Vielleicht ist das auch der Fehler das ich zusehr am altem festhalte 😄 aber alles was ich so lese, es will nicht klick machen ...

Zuerst mal gibt es da User Control und Custom Control. Aber beides scheint nicht ganz so für meine Zwecke zu passen. Zumindest bei meinen Versuchen.

UserControl scheint mehr dazu gedacht zu sein mehre Controls zu gruppieren damit es z.b übersichtlicher wird ?
CustomControl ist mehr dazu gedacht ein bestehendes Control (ich sag mal) zu erweitern.

Für das was ich will wird ja bei Sampels häufig der Name Canvas genutzt. Jetzt gibt es sogar eine Klasse die diesen Namen trägt. Was natürlich das Suchen nach dem Begriff erschwärt im zusammenhang mit WPF 😃
Die scheint aber auch nicht ganz für meinen Wunsch zu passen. Das ist wohl so eine Art Layoutcontainer für Controls aber irgend etwas dynmaisch Zeichnen dafür ist es wohl zu starr. Vor allem verstehe ich nicht wozu Canvas das sieht ja auch mehr nach Gruppieren von Controls und somit nach UserControl aus.

Oder kann ich dieses Canvas erweitern mit so einem CustomControl ? Weil das hört sich für mich so an das ich das dann um die Zeichenfunktionen erweitern kann? Aber habe ich dann nicht diese Erweiterung mittels xaml gelöst die logik steckt dann aber in C# Code ?

Ist das dann nicht unschön ? Teile in XAML Teile in C# das zerupft doch quasi alles ? Mir stellt sich sonst schon die Frage, wozu man XAML brauchen sollte, wenn man letzten Endes doch immer alles in C# machen muss?

Als letztes habe ich mir noch gedacht das Control ganz einfach altmodisch mit Winforms zu machen und einfach einzubinden ?

So jetzt habe ich aber gelesen, dass WPF als zum rendern der Controls DirectX nimmt WinFowms aber GDI. Stimmt das ? Und wenn ja wird dann nicht schon wieder was gemixt ? 😃 ...

Wie ist denn da der "best" way ? Vielleicht reichen auch einfach nur ein paar Begriffe mit denen ich dann mal weiter suchen kann.

Grüße,
Martin

08.12.2010 - 17:09 Uhr

Hallo

Naja eigentlich geht es mir mehr ums deserialisieren. Fehler bekomme ich noch keinen weil ich ja noch nicht weiß was statt [???] stehen soll. D.h ich möchte ein XML-Datei lesen und meine Objekte mit Daten füllen.
Und habe da auch noch immer ein Verständins Problem. Was ist bei [???] zu tun ? Ich weiß es nicht.

Woher soll er/es auch wissen


<TestCase name="test">
    <Info text="text"</Info>
    <Error text="text"</Info>
    <Message text="text"</Info>
    <Message text="text"</Info>
</TestCase>

das, wenn er ein "Info" als Element gefunden wird, er ein Objekt von der Klasse Info angelegt werden muss. Und es bei


TestCase
{
	...
    public  MessageObject[] messages;
}

"hineingelgt" werden soll ?

Also Schrittweise mein Ziel: 😃

Ich könnte natürlich für Info,Error,Message jeweil ein Propertie in TestCase anlegen.


public class TestCase
{
	...
	[XmlElement("Info")]
    public  Info info;
	
	[XmlElement("Message")]
	public  Message message;
	
	[XmlElement("Error")]
	public  Error error;
}

public class Info
{
	[XmlAttribute("text", DataType = "string")] 
	public string info;
}

public class Message
{
	[XmlAttribute("text", DataType = "string")] 
	public string text;
}

public class Error
{
	[XmlAttribute("error", DataType = "string")] 
	public string error;
}

Aber ich möchte ja eben Ableiten. Also mache ich jetzt bei dem obigen eine Ableitung.

Ok hier kommt jetzt XmlInclude auch noch ins Spiel, habe ich wohl übersehen? Und mal die angepasste Version:


public class MessageObject
{
        [XmlAttribute("text", DataType = "string")]
        public string text;

        MessageObject(text)
        {
          ...
        }
}

[XmlInclude(typeof(MessageObject))]
public class Message : MessageObject
{
    Message(string text)
        : base(text)
    {
        ...
    }
}

[XmlInclude(typeof(MessageObject))]
public class Info : MessageObject
{
    Info(string text)
        : base(text)
    {
        ...
    }
}

[XmlInclude(typeof(MessageObject))]
public class Error : MessageObject
{
    Error(string text)
        : base(text)
    {
        ...
    }
}

Aus aus meiner TestCase-klasse wird:


public class TestCase
{
	[???]
	public MessageObject[] messages
}

Aber was gebe ich jetzt da an ? [XmlElement("Info"), XmlElement("Error"), XmlElement("Message")] Nö passt schon mal nicht ist ja ein Array.
[XmlArray("TestSuite")]
[XmlArrayItem("Info"),XmlArrayItem("Message"),XmlArrayItem("Error")] Nö geht auch nicht

Hmm nö komm nicht drauf 😦.
[XmlArray("TestSuite")]
[XmlInclude(typeof(Message)), XmlInclude(typeof(Info)), XmlInclude(typeof(Error))]

Also egal was ich Versuche ich bekomme immer eine Exception "There was an error reflecting property 'TestCase'" was mich jetzt nicht wirklich weiter bringt.

Grüße

08.12.2010 - 12:39 Uhr

Hallo

Ist es möglich mittel XmlSerializierung/Deserializierung auch Ableitungen zu verwalten/abbilden ? Ich weiß jetzt leider nicht genau wie ich das beschreiben soll aber ich habe ein XML-Modell.


<TestCase name="test">
    <Info text="text"</Info>
    <Error text="text"</Info>
	<Message text="text"</Info>
	<Message text="text"</Info>
    <TestingTime>0</TestingTime>
</TestCase> 	

Jetzt hätte ich eine Testcase-Klasse(zur Einfachheit jetzt alles Public) und würde es so definieren.


public class TestCase
{
	[XmlAttribute("name", DataType = "string")] 
	public string name;
	
	[XmlElement("TestingTime")]
	public int TestingTime
	
	[???]
	public  MessageObject[] messages;
...
}

Jetzt ist es so dass, Info,Error,Message eigentlich alle von der selben Klasse abgeleitet sind.


public class MessageObject
{
		[XmlAttribute("text", DataType = "string")] 
		public string text;
		
		MessageObject(text)
		{
		  ...
		}
}

public class Message : MessageObject
{
	Message(string text)
		: base(text)
	{
		...
	}
}

public class Info : MessageObject
{
	Info(string text)
		: base(text)
	{
		...
	}
}
	
public class Error : MessageObject
{
	Error(string text)
		: base(text)
	{
		...
	}
}

Kann ich das jetzt irgendwie angeben das "messages" Info,Error,Message eingetragen wird ? was würde dann bei [???] stehen ?


[XmlArray("TestCase")] 
[XmlArrayItem("MessageObject")]

oder


[XmlArray("TestCase")] 
[XmlArrayItem("Info")],[XmlArrayItem("Info")]

Oder wie macht man das ? Ist das so überhaupt möglich ?

Grüße

23.04.2010 - 15:59 Uhr

Hi

Ahja Thx ... War mir noch nicht sicher ob das was ich meine auch Databinding heißt.
Bezog das immer auf Datenbank usw ...

Grüße ...

23.04.2010 - 15:00 Uhr

Hallo

Ich möchte eine Listview mit Daten befüllen. Ja ok ich weiß wie das geht.
Aber ich würde gerne so eine Art Binding zu einer List haben. Ist soetwas möglich ?

Also Bsp:
List<MyClass> myList...
und diese möchte ich dann direkt in die Listview hängen ?

Klar was ich meine ? Ich glaube soetwas nennt man Databinding oder so ?? 😃.

Grüße
Martin

07.08.2009 - 15:32 Uhr

Jup bin in einem Entwicklerteam ... Privat würde ich mir das nicht leisten 😁
Privat für kleine Sachen nutze ich die Express Version die reicht mir aus ...

07.08.2009 - 14:38 Uhr

Hi

Ja
Ja genau den Account meine ich 😃
Hmm ja mal probieren 😃

Gruß

07.08.2009 - 13:33 Uhr

Hi

2005 ... ich hab eine komplett Installation ...

Gruß

07.08.2009 - 10:32 Uhr

Hallo

Visual Studio hat mir einen "VSA Server Account" als lokale Benutzer angelegt.
Wofür wird dieser gebraucht ? und was würde passieren wenn ich diesen deaktiviere bzw lösche ?

Gruß
Martin

26.06.2009 - 15:34 Uhr

Hallo

Also ich bin jetzt ein bisschen unsicher X(
Und ich duck mich auch ganz tief 😁 ich weiß das wurde schon öfters durchgekaut...
Aber irgendwie Frage ich mich das zwecks dem Verständnis ... =)

Also ich habe eine ImageList mit "Icons" oder "Images" darinnen.
Normalerweiße muss ich ja wenn ich ein Image oder ein Icon nicht brauche Dispose() aufrufen.
Müsste ich jetzt nicht wenn ich diese ImageList entfenern möcht mit ...ImageList.Images.Clear();
Müsste ich nicht eigentlich für alle "Images" Dispose aufrufen ?
Weil die IamgeList kann ja nicht wissen wann ich es nicht mehr brauche. Ich könnte ja in mehrern ImageListen
ein Referenz auf das Icon haben ...
Ich meine ers wäre nicht schlimm wenn ich es nicht sofort mache weil es der GC für mich zu irgend einem
Unbestimmten Zeitpunkt dann macht. Aber wenn ich die Resourcen sofort freigeben möchte dann schon ?
Hab ich das richtig verstanden ? 🤔

Gruß
Martin

26.06.2009 - 13:37 Uhr

Hi

Danke hilft schon mal ...

Solange du damit nicht gegen Copyrights verstößt, kannst du solche Icons dann auch in deiner Anwendung verwenden.

Ich dachte nicht daran die zu kopieren und zu nutzen sonder so wie der Explorer halt die Icons von anderen Programmen anzeigt und nur zur Laufzeit darstellen wie so ein kleiner Explorer oder einen Taskleiste von offnen Fenstern ...

@herbivore
Oh ich dachte das das die gleichen sind.
Ok sind sie vielleicht in der Resource sind aber doch (wenn ich jetzt so darüber nachdenke) unterschiedliche herangehensweisen ... 😁

Erstelle nacher noch einen eigenen Falls ich nochmal brauche ...

Gruß
Martin

26.06.2009 - 12:51 Uhr

Hallo

Wenn man den Explorer öffnet und in ein Verzeichnis schaut zeigt er für die jeweilige Datei das Icon der Exe-Datei an. Wenn eines dafür existiert.
Wie funktioniert das denn ? Kann man das Icon auslesen ?

Ist es vielleicht auch möglich aus einem Fenster das gerade geöffnet ist und in der Caption ein Icon hat, dass man dieses auch auslesen kann und in seinem(meinem) Programm dann verwenden ?

Gruß
Martin

22.06.2009 - 17:22 Uhr

Hi

Hoppla das mit dem Code hab ich verschwitzt ... Sorry ... =)

Gruß
Martin

22.06.2009 - 15:48 Uhr

Hi

Oh ok ... 😁

... Danke ..
Martin

22.06.2009 - 15:33 Uhr

Hallo

Wie kann ich den Close-Button überschreiben ?

Ich würde gerne in etwas soetwas machen:


class MyClass ...
{
   private Form1 myForm = new Form1();
   

   privat void HideShowForm()
   { 
      if (myForm.Visibility == true )
	     myForm.Hide();
	  else
         myForm.Show();	  
   }   
  
} 

Hintergrund ist der, dass dieser Dialog häufig geöffnet bzw geschlossen wird die Daten aber trotzdem speichern soll.
Ich dachte mir,dass ich einfach den Form dann ausblede biss er wieder geöffnet wird.
Und nicht jedes mal einen neuen zu erzeugen mit Daten zu füllen und in danach wieder zu zerstören.
Gibt es da einen Hacken ?

Das Problem ist aber das der Close-Button das Form zerstört. Wie kann ich das so überschreben dass der das Form nur unsichtbar macht ?

Gruß
Martin

19.06.2009 - 16:33 Uhr

Hi

Ah so einfach geht das 😁 ...
Ich habe immer kompliziert die selber umgerechnet ...

Ja das hilft danke ...

Gruß
Martin

19.06.2009 - 15:50 Uhr

Hallo

Hat jemand einen Ahnung wie ich zu den absoult Korrdinaten von der Mous komme ?
Ich möchte z.b in ein Kästchen klicken dann zieht der User mit gedrückter Taste aus dem Kästchen irgendwo auf den Bildschirm klickt. Jetzt möcht ich die Koordinaten haben die von Links oben zu der Position der Mouse ist bekommen.
Die Anwendung ist aber nicht im Fullscrennmodus sonder kann irgendwo sein. Wie kommt man auf diese Koordinaten ?

Gruß
Martin

19.03.2009 - 17:08 Uhr

Hi

Jo danke für den Hinweis 😉

Gruß

18.03.2009 - 13:38 Uhr

Ach ja das stimmt ...
D.h also mit Invoke wird die "anonyme Methode" in dem Thread ausgeführt wo das Control.Invoke erzeugt wurde.
Deswegen brauch ich auch kein InvokeRequired.
MSDN: Control.Invoke Method (Delegate)
Also übergebe ich hier einfach ein Delegate an eine anonyme Methode. 😁

Gruß
Martin

18.03.2009 - 12:08 Uhr

Hallo

Ja kürzer ist nich immer versändlich ... 😉 Deswegen lass ich das fürs erste mal "lang" ...

Ok so in etwa war mir das schon klar ...
Ich schreib das mal anders hin. Ist ja daselbe.


		private void OnProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
		{
			if (richTextBox1.InvokeRequired)
			{
				MethodInvoker invoker = (MethodInvoker)delegate()
				{
					if (e.Data != null)
						richTextBox1.AppendText(e.Data.ToString());
				};
				richTextBox1.Invoke(invoker);
			}
		}

Wie du schon gesagt hast ist das eine anonyme Methode und der Komplier generiert eine extra Methode ...
Aber da im delegate() keine Parameter angegeben ist dürfte "e" und "sender" im delegate gar nicht existieren ?
Ist das nicht so ? Ich dachte das man das eigentlich so sehen muss als wenn man eine eigene Methode implementiert. Innerhalb der geschweiften Klammern existiert nur dass was man übergibt.

Gruß
Martin

18.03.2009 - 11:15 Uhr

Hallo

Ich habe ein Frage zu Invoke usw. "Control.Invoke"

Angenommen ich will über einen anderen Thread ein Control aktualisieren lassen.
Z.B. eine "richTextBox".
Dann habe ich das bis jetzt immer in etwas so gelöst.


public delegate void DataReceivedDelegate(object sender, DataReceivedEventArgs e);
private void OnProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
		{
			if (richTextBox1.InvokeRequired)
			{
				DataReceivedDelegate dDelegate = new DataReceivedDelegate(OnProcessOutputDataReceived);
				richTextBox1.Invoke(dDelegate, new object[] { sender, e });
			}
			else
			{
				if (e.Data != null)
					richTextBox1.AppendText(e.Data.ToString());
			}
		}

Was ich einfach und verständlich sehe. =)
Jetzt habe ich aber auch eine Möglichkeit gefunden das mit weniger Code zu schreiben.

Nämlich ...:


private void OnProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
		{
			if (richTextBox1.InvokeRequired)
			{
				richTextBox1.Invoke((MethodInvoker)delegate
				{
					richTextBox1.AppendText(e.Data.ToString());
				});
			}
		} 

So .. Aber da geht mir doch einiges zuviel ab 😄...
Ich verstehe einfach nicht was da alles gemacht wird. Der,Das "Delegate" MethodInvoker passt doch gar nicht zur Methode OnProcessOutputDataReceived Also von den Parametern?? Kann mir jemand das erklähren oder mal auftrennen das ich die Schritte verstehe ? Weiß nicht wie ich das machen soll.
Mich verwirrt das delegate{...} Ich brauche kein new ??

Gruß
Martin

07.02.2009 - 15:36 Uhr

Hi

Ok jetzt hats doch geklickt 😁 ... Danke euch 😉

Gruß und noch ein Schönes WE ...
Martin

07.02.2009 - 14:23 Uhr

Hi

Das verstehe ich nicht so ganz.
Der FileStream ist in der FCL des .NET Frameworks definiert und implementiert.
Wenn du sinnloserweise selbst einen FileStream implementieren wolltest, sollte dieser aber sowohl IDisposable implementieren als auch einen Finalizer bereitstellen.
Andererseits müssen dies Klassen, die den FileStream nur verwenden, nicht machen.
Meintest du das?

Ja genau so meinte ich.
Ich will das natürlich nicht implementieren ich dachte jetzt bloß
an einen Anwendungsfall bei dem ich da ganze bräuchte und da ist mir als erstes der
Filestream eingefallen

  
protected override Finalize()  
{  
    base.Finalize();  
}  
//sondern z.B.  
~Foo()  
{  
}  
  

Achso klar wie kleines_eichhoernchen schon geschrieben hat .. Das ist das wirklich das gleiche nur andere "Schreibweise" 🙂
http://msdn.microsoft.com/de-de/library/66x5fx1b(VS.80).aspx

Nein, ganz und gar nicht.
Dispose verhält sich wie jede andere Methode einer Klasse auch.
Der GC sucht von sich aus nach nicht mehr "benötigten" Objekten; Hilfe von außen benötigt er nicht.

Oje worauf bezieht sich das Nein jetzt 😁 ?
Auf:
Ich hatte das eigentlich so verstanden das mit dem Aufruf von Dispose bloß das Objekt zur Freigabe markiert wird.
Und erst dann wenn der GC angeworfen wird freigeben wird.
Oder auf:
D.h also direkt nach Dispose ist das Objekt wirklich vom Speicher freigeben worden und Speicher steht sofort wieder zur Verfügung?

Ich versuche es mit anderen Worten:
Es geht nur darum um "Ressourcen", "Handles", "Zeiger" zu genau einem definierten Zeitpunkt freizugeben.
So wie kleines_eichhoernchen geschrieben hat richtig ?
Das sagt aber nichts über die Freigabe des Objektes aus. Die Freigabe vom Objekt erledigt immer noch der GC ? Freigabe,Freigabe,Freigabe da hab ich was vermischt?? 😁

Hab ichs jetzt ??

Gruß
Martin

07.02.2009 - 13:23 Uhr

Hallo

Was für Fälle könnten das sein ?
Ist damit gemeint z.B.: Ich habe einen Filestream und bevor er der entfernt wird möchte ich ihn noch ordnungsgemäß schließen ?
Jein.
Für "normale" Klassen ist das uninteressant, da z.B. FileStreams, die als Membervariablen gehalten werden auch automatisch disposed werden, wenn deine Klasse freigegeben wird (natürlich nur, wenn keine anderen Referenzen auf den FileStream vorhanden sind).

Das sah ich jetzt mehr aus der Sicht von dem der den FileStream implemntiert.
Und nicht aus der Sicht von jemanden der FileStream nutzt.

Der Destruktor ist das C# Pendant zur Finalize Methode.
Daher dienen Destruktoren primär zur Freigabe von unmanaged Resourcen (Handles etc.).

Pendant heißt für mich Gegenstück. Wie meinst du Pendant zur Finalize Methode? 🤔

Dispose ist eine Möglichkeit, die Ressourcen, Handles, Zeiger zu genau einem definierten Zeitpunkt
freizugeben. Ohne Dispose ist der Zeitpunkt der Freigabe durch den Finalizer unbestimmt.

Aha ? 8o Ich hatte das eigentlich so verstanden das mit dem Aufruf von Dispose bloß das Objekt zur Freigabe markiert wird.
Und erst dann wenn der GC angeworfen wird freigeben wird.
D.h also direkt nach Dispose ist das Objekt wirklich vom Speicher freigeben worden und Speicher steht sofort wieder zur Verfügung?

Danke für die links ... nur alles hab ich noch nicht verstanden zu viel auf einmal 🙂
Vor allem die 2 letzten muss ich mir nochmal in Ruhe ansehen 👅

Aber es wird schon etwas heller ... 😁

Gruß
Martin

07.02.2009 - 11:48 Uhr

[EDIT=herbivore]Threads zusammengefügt[/EDIT]

Hallo

Ich hab weiter Fragen ...
Irgendwie versuche ich Die Fragen nach dem Thema trennen aber es gehört doch irgendwie zusammen ...
Wann muss, sollte man Dispose aufrufen ?

Diesmal zu Finalize-Methoden ...

Irgendwie verstehe ich nicht genau was dann passiert.
Ich beziehe mich auf die MSDN und anderen Büchern
http://msdn.microsoft.com/de-de/library/0s71x931.aspx

1:
"Wenn der Garbage Collector Bereinigungsoperationen für das Objekt ausführen soll,
bevor der Speicher des Objekts freigegeben wird,
müssen Sie die Finalize-Methode in der Klasse überschreiben."

Was für Fälle könnten das sein ?
Ist damit gemeint z.B.: Ich habe einen Filestream und bevor er der entfernt wird möchte ich
ihn noch ordnungsgemäß schließen ?

2:
Laut MSDN kommen Objekte die diese Methode implementieren in diese in eine Finalisierungswarteschlange.
Und was passiert dann ?
Wann wird jetzt genau der Finalisierungscode ausgeführt ? Mich stört diese Warteschlange 🙂.
Kann es dann nicht sein dass ein Objekt ein anderes Objekt blockiert ? Hört sich für mich irgendwie so an.
Was ist bei mehreren Threads ? 🤔

3:
Irgednwie tue ich mir noch seht schwer das ganze irgendwie ausseinander zu halten.
Ich hab Dispose,Finalize, und dann noch einen Destruktoren ... Und alles irgendwie um freizugeben ?? =)

Z.B ein Destruktor:
"Wenn Ihre Anwendung jedoch nicht verwaltete Ressourcen kapselt,
z. B. Fenster, Dateien und Netzwerkverbindungen,
sollten Sie Destruktoren zur Freigabe der Ressourcen einsetzen."

Und vorhin war es noch IDisposable ?? Wo ist im Detail der Unterschied ?
So und jetzt weiche ich aber schon wieder von der Frage ab ... 👅

Gruß
Martin

07.02.2009 - 11:21 Uhr

Hallo

Ja doch das half mir schon irgendwie weiter obwohl ich jetzt andere Fragen habe .. =)

Gruß

06.02.2009 - 15:49 Uhr

Hallo

Ich hab etwas noch nicht ganz durchschaut. Nämlich Dispose im Detail.
Angenommen ich Mache mir eine Klasse die IDisposable implementiert.


class Klasse1 
{
  public void Dispose() : IDisposable
  {
    // ... 
  }
}

Und jetzt habe ich noch eine 2 Klasse die in einer Methode das Objekt anlegt.


class Klasse2
{
   ...
   public void Methode()
   {
      Klasse1 temp = new Klasse1();
  
      // temp.Dispose();
   }
}

Muss, sollte oder wann sollte ich Dispose() aufrufen ?
Ist es nicht so dass ich es eigentlich gar nicht aufrufen werden muss weil sich der GC
später mal darum kümmert ? Oder sollte ich Grundsetzlich wenn die Klasse Dispose implmentiert hat
Dispose aufrufen weil ich davon ausgehen kann das es aus irgend einem Grund Implementiert wurde ?

Also ich hab das irgendwie als Optional verstanden. Wenn ich das Objekt aus irgend einem Grund sofort
bereinigen möchte rufe ich Dispose auf sonst überlasse ich das dem GC.
Ist das so ? ?(

Gruß
Martin

25.11.2008 - 11:26 Uhr

Hi

Auch wenn es vielleicht etwas an Thema vorbei geht ...
Also wenn es nur um das Fadenkreuz geht ...
Ich hab auch schon Leute gesehen die sich ein kleines Klebeband auf den
Monitor geklebt haben und darauf ihr Fadenkreuz gezeichnet haben ...

Ist mit Sicherheit Ressourcenschonend 🙂

Beantwortet die Frage aber nicht ... X(

Gruß

25.11.2008 - 11:09 Uhr

Hi

Achso ok ... ja dann suche ich lange ... 😁

Danke für den Tip!

Gruß
Martin

25.11.2008 - 10:49 Uhr

Hi

Thx...
Achso ... D.h in den Winforms vom MS gibt es gar nicht so einen Mechanismus ?
🤔

Gruß
Martin

25.11.2008 - 10:35 Uhr

Hallo !

Sorry für diesen nicht so tollen Titel aber ich weiß leider nicht wie das heißt.
Im Studio kann man die Fenster verschieben.
Z.B.: Das Output Fenster auf die rechte Seite schieben oder nach links.
Oder abdocken .. andocken usw ... und so die Oberfläche zimmlich gut anpassen.
Versteht ihr was ich meine ?? 🙂

Ok wie heißt das Ganze und wonach suche ich da?

Gruß
Martin

13.11.2008 - 13:46 Uhr

Hi

Thx alles klar ...
Ok das andere muss ich mir noch genauer in Ruhe durchlesen 🙂
Das wird noch etwas dauern =)

Danke für den Buchtipp ... die Inhaltsangabe dazu klingt ja schon mal zimmlich intressant 😉

Gruß
Martin

13.11.2008 - 11:11 Uhr

Hi kleines_eichhoernchen,

Ach tatsächlich dem Konstruktor kann man sogar einen "IEqualityComparer" übergeben...
MSDN: Dictionary<TKey, TValue> Constructor (IEqualityComparer<TKey>)

Das ist mir gar nicht aufgefallen ... was für Teufelszeug :evil:
Danke für den Hinweis ... 👍

Zu den Structs:
Die wollte ich nicht schlecht machen 😉 Mir ging es nur um den Unterschied im Detail damit ich besser abschätzen kann was ich eher brauche...
Das mit Wertetyp und Stack war mir schon bekannt aber ...

Was ist so kritisch wenn der Werttyp geboxt wird ?
Da wird auch kopiert ... Aber mehr konnte ich dazu nicht finden ...

Gruß
Martin

12.11.2008 - 19:28 Uhr

Hi herbivore,

Thx! 😁
Ja eigentlich zudem Zeitpunkt sogar 3 mal ...

Gruß
Martin ...

12.11.2008 - 18:08 Uhr

Hi

hier:

MSDN: Structs (C# Programming Guide)
Structs are copied on assignment. When a struct is assigned to a new variable, all the data is copied, and any modification to the new copy does not change the data for the original copy. This is important to remember when working with collections of value types such as Dictionary<string, myStruct>.

MSDN: Classes and Structs (C# Programming Guide)
A struct is a value type. When a struct is created, the variable to which the struct is assigned holds the struct's actual data. When the struct is assigned to a new variable, it is copied. The new variable and the original variable therefore contain two separate copies of the same data. Changes made to one copy do not affect the other copy.

Das hab ich so interpretiert weil bei einer Übergabe eines Parameters ja eigentlich dem alten wert einen neu Variable zugewiesen wird ... daher "it is copied" ...

Gruß

12.11.2008 - 18:03 Uhr

Hi

Naja jetzt find ichs nicht mehr 🙂 ...
Vielleicht hab ichs ja auch nicht ganz verstanden ...

Aber man kann es ja einfach testen:


struct MyStruct
{
  public int x;
}



List<MyStruct> list1 = new List<MyStruct>();
List<MyStruct> list2 = new List<MyStruct>();
MyStruct myStruct;
myStruct.x = 23;

list1.Add(myStruct);
list2.Add(myStruct);

unsafe
{
   MyStruct l1 = list1[0];
   MyStruct l2 = list2[0];

   MyStruct* p1 = &l1;
   MyStruct* p2 = &l2;

   if (p1 == p2)
     MessageBox.Show("gleich");
} 

Oder einfach bei int.


List<int> list3 = new List<int>();
List<int> list4 = new List<int>();
int x = 3;

list3.Add(x);
list4.Add(x);

unsafe
{
  int l3 = list3[0];
  int l4 = list4[0];

  int* p3 = &l3;
  int* p4 = &l4;

  if (p3 == p4)
    MessageBox.Show("gleich");
}

Hier zeigt jeweils der Pointer auf eine andere Adresse ...
Das sollte doch nicht sein wenn sie genau auf dem gleichen Speicherplatz leigen oder ???

Gruß

12.11.2008 - 17:22 Uhr

Hi

Wie ich darauf komme ? 🤔
Nun Strukturen sind WerteTypen. Bei jedem Aufruf einer Methode wird diese daher kopiert. Und mit der Kopie weiter gearbeitet.
Klassen sind Referenztypen da wird eine Referenz übergeben.

Das ist ja auch einer der wesentlichen Unterschiede von Strukturen und Klassen.

Ok das hier war nicht ganz korrekt 🙁 X( mein Fehler sorry ...
Ich meinte eigentlich wenn ich hier jetzt eine Struktur mache.


List<MyStruct> list1=new List<MyStruct>();
List<MyStruct> list2=new List<MyStruct>();
MyStruct myStruct = new MyStruct(...);
list1.Add(myStruct);
list2.Add(myStruct);

Laut MSDN wird bei jedem Methodenaufruf die Struktur kopiert. und die Kopie übergeben.
Damit leite ich da ab das in der list1 eine andere Instanz ist als in der list2 somit doppelter Speicherplatzt ...

Anderes als bei Klassen. ...

Nun was ich will ich hab einen Haufen von Objekten und die will ich in unterschiedliche Datenstrukturen rein tun um unterschiedliche Sichten zu haben unterschiedlich zu suchen bzw schneller zu suchen.

Wenn dann jedes mal eine kopie erzeugt wird ist das für mich ungünstig weil das viel speicher verbraucht dann lieber eine Liste von referenzen ...

Gruß
Martin

12.11.2008 - 16:42 Uhr

Hallo

Ich hab schon wieder mal ein Problem 🙂

Ich mache mir wieder mal eine Klasse:


public class MyClass
{
  public string Word{get;set};
  public int X {get;set};

  MyClass(string word,int x)
  ....
}

Jetzt gebe mehrer instanzen davon in ein Dictonary ...


Dictionary<MyClass, int>>dic;

dic.add(new MyClass("Hallo1",1),1234)
dic.add(new MyClass("Hallo2",2),1235)
dic.add(new MyClass("Hallo3",3),1236)

Soweit so gut wenn ich einen Wert aus diesem "Dictionary" jetzt heraus holen will klappt das nicht ganz. X(

Ich würde jetzt z.B.:


MyClass myClass = new MyClass("Hallo1",1);
int n = dic[myClass];

Da bekomme ich jetzt eine KeyNotfoundExecption. Das liegt wohl daran, dass das die Objektinstanz von dem Objekt mit dem ich suche nicht diese ist, die im Dictonary liegt. Richtig ?

Was müsste ich jetzt machen, Damit es doch gefunden wird ?
(Die Frage versuche ich jetzt selber zu beantworten)

Die erste Idee die mir dazu einfällt wäre ... Ich mache keine Klasse sondern eine Struktur. 🙂

Also:


public struct MyClass
{
  public string Word{get;set};
  public int X {get;set};

  MyClass(string word,int x)
  ....
}

Somit hätte ich dieselben Eigenschaften wie z.B.: für Dictionary<string, int>>dic;

Aber bei Strukturen hätte ich den Nachteil, dass alles kopiert wird.
(Zumindest bei einem Aufruf einer Methode)
Richtig ?

Angenommen ich mache:


List<MyClass> list1=new List<MyClass>();
List<MyClass> list2=new List<MyClass>();
MyClass myclass = new MyClass(...);
list1.Add(myclass);
list1.Add(myclass);

Dann müsste doch myclass 2 mal im Speicher existieren ... Richtig ?
(Bei der Frage bin ich mir unsicher...)
Aber wenn ich das in mehrern Datenstrukturen reinhängen will wäre ein Klasse doch schlauer oder ?

So als nächstes möchte ich auch hier das Vergleichskriterium einängen.
Also für mich sind 2 Klassen,Strukturen gleich wenn Word gleich ist. Da würde ich IComparable implementieren. Allerdings im Dictionary wird das ignoriert 🙁 ..
Warum eigentlich ?
Liegt es daran das intern mit einem Hash gearbeitet wird ?
(Bei der Frage bin ich mir unsicher...)

Also hab ich versucht Equals zu überschreiben. Dann verlangt er von mir GetHashCode auch zu überschreiben. Da bekomme ich dann doch ein bisschen Bauchweh 😁 😁

Ich habe das aus logischer sicht wie folgt überschrieben:


public override bool Equals(object obj)
{
  MyClass wordObj = (MyClass)obj;
  return this.word.Equals(wordObj.word);
}

public override int GetHashCode()
{
  return this.word.GetHashCode();
} 

Somit wird jetzt für eine Klasse und eine Struktu das Element auch gefunden...
Aber zerstöre ich damit irgend ein Verhalten welches ich vielleicht übersehen habe ?

Aber das was ich da mach sieht doch ok aus oder 👅
Ich brauch glaub ich mal mehr Selbstvertrauen =)

Gruß
Martin

11.11.2008 - 17:31 Uhr

Hi

Thx das ist genau das Beispiel von hier 😉http://openbook.galileocomputing.de/csharp/kap28.htm

Gruß

11.11.2008 - 17:14 Uhr

Hi

Ja dann hab ichs doch verstanden 😁
Mich hat irgendwie das "parametrisierbar" verwirrt ... Da dachte ich an ganz was anderes 😁 ...
Jo so gefällt mir das schon besser

Thx ...

Gruß
Martin

11.11.2008 - 17:00 Uhr

Hi

Ich hab jetzt hier soetwas gefunden ... so würde ich das jetzt machen ...
http://openbook.galileocomputing.de/csharp/kap28.htm
29.1.3 IComparer als Eigenschaft
So ist es dann nicht zu "verstreut" ...

Du kannst den Comparer auch parametrisierbar machen. Gerade, bei Klassen, deren Objekte nach unterschiedlichen Aspekten sortierte werden können, bietet es sich an. Also z.B. ein PersonConparer, bei dem man (über Properties oder als Parameter des Konstruktors) angeben kann, nach welchen Properties sortiert werden soll.
herbivore

Oh das ist mir jetzt glaub ich zu zu hoch X( ...
Meinst du in etwa (Psuedocode):


public class Comparer: IComparer
    {
        public Comparer(enum SortBy) 
        {
         ..
        }

        public int Compare(object obj1, object obj2)
        {
            switch(sortBy)
            {
            
            ....
            }
        }
    }

Gruß
Martin