Laden...

Forenbeiträge von Briefkasten Ingesamt 446 Beiträge

30.08.2006 - 13:46 Uhr

Hallo,

ich hab eine class libary die meldet beim auruf von einer bestimmten methode 2 events an. Wenn diese 2 events ausgelöst werden, will ich ein objekt der form die die class libary verwendet übergeben, wisst ihr wie ich das am besten machen kann?
Am besten wäre es wenn ich dem event ein rückgabe wert geben könnte. Habt ihr eine Idee wie ich das am Besten realisieren kann?

mfg Briefkasten

23.08.2006 - 09:03 Uhr

Original von Lord Hessia
Eigene Klasse oder eigene Struktur, wenn Du Dich damit nicht auskennst, dann ist der angegebene Link genau das Richtige.

Genau das wollte ich wissen, danke

22.08.2006 - 19:38 Uhr

Hallo,

wie kann ich am besten einen eigenen Objekttypen erstellen?

Also z.b um einen string und 2 Points in einem Objekt abspeichern zu können.

In diesen möchte ich dann eigene Funktionen implementieren wie Sortieren etc. bzw vom .NET einbauen. Wisst ihr wie ich sowas am besten mache?

18.08.2006 - 18:14 Uhr

Original von sbertl000
Das Flackern kannst du durch einstellen der Eigenschaft "DoubleBuffered = true" verhindern.

sbertl

Hallo,

danke hab in der msdn nachgeschaut, in welcher Klasse diese Eigenschaft ist. Ich kann diese Eigenschaft aber nicht finden. Weder in panel1. noch in Control. .NET 2 habe ich auch.

mfg briefkasten

18.08.2006 - 17:41 Uhr

Hallo,

ich hab in meinem ersten Panel ein gitter mit DrawLines erstellt. Dieses soll, man wird es kaum glauben als Gitter dinnen. Wenn ich nun eine Linie zeichnen will, und
und die Invalidate Funktion verwende Flackert das ganze Gitter.

Also hab ich mir gedacht ich mach ein 2tes Panel und zeichne auf diesem. Dieses soll durchsichtig sein ledeglich die gezeichneten Striche sollen erkennbar sein.

Leider gibt es sowas wie ein TrancperyKey nicht. Habt ihr eine Idee wie ich sowas ansonsten realisieren kann?

mfg Briefkasten

13.08.2006 - 15:40 Uhr

Ich hab jetzt den Code so abgeändert:

Das nur noch im on_paint Event gezeichnet wird.


private void panel1_Paint(object sender, PaintEventArgs e)
        {
            mv_fz.Gitterzeichnen(new Pen(Color.LightGray), 20, panel1,true);
            if (Linie.Checked.Equals(true))
            {
                mv_fz.LinieZeichnen(panel1);
                //ToDo
                //
            }
        }

Jetzt wird allerdings nie das Event private void control_Click(object sender, System.EventArgs e) in der Klasse ausgelöst. Die Methode LinieZeichnen meldet das Event aber wie gewohnt an. Habt ihr eine Idee warum das so ist?

13.08.2006 - 14:32 Uhr

Hallo,

ich will eine Klasse machnen mit der man Striche in einem bestimmten Control malen kann. Sprich es soll ledeglich die methode Strichemalen aufgerufen werden (control übergeben in dem gezeichnet wird etc) und dann soll das ganze schon funktionieren.

Um die Striche zu malen brauch ich aber zu der Methode noch 3 Events. Diese wären Mouse_move Mouse_click und Mouse_release. Den Code um die Striche zu malen habe ich schon. Dieser ist aber in Form (wegen den Events). Nun würde ich gerne diese in meine Klasse einbauen/verlagern. Wisst ihr wie ich das am besten mache?

Hier mal der Code:
Form1


Wenn Icon aktiv ist soll man zeichnen können
private void Linie_Click(object sender, EventArgs e)
        {
            // Wenn Linienicon angeklickt wurde
            // Methode LinieZeichnen starten
            if (Linie.Checked.Equals(true))
            {
                Methode Linie zeichnen aus Klasse starten
                mv_fz.LinieZeichnen(panel1);
                //ToDo
                //
            }
           
        }

Klasse


public float LinieZeichnen(Control control)
        {
            float a=1;
            //Event anmelden
            control.Click += new System.EventHandler(this.control_Click);
            
            return a;
        }
private void control_Click(object sender, System.EventArgs e)
        {
            //Dieser Code wird später ersetzt
            MessageBox.Show("asdfadsfsadf");
        }

Wenn ich nun auf das Icon Klicke kommt die MessageBox. Soweit so gut. Wenn ich das Icon aber nachher deaktiviere kommt immer noch die MessageBox. Habt ihr ne Idee wie ich das am besten bewerkstellige?

mfg Briefkasten

05.08.2006 - 17:32 Uhr

Hallo,

kann mir jemand sagen wie ich an diesen Farbenwert komme? Will die gleiche bgcolor haben wie die Fenster Hintergrundfarbe (bei Windows eingestellt ist). Weiß jemand wie ich die bekomme?

05.08.2006 - 17:18 Uhr

mir fallt da momentan nur sendKeys ein... Sollte theoretisch gehen, praktisch hat es aber bei mir nicht funktioniert 🙁

27.07.2006 - 18:53 Uhr

Hallo,

ich will ein kleines Tool machen, dass Informationen auf dem Desktop anzeigt.
(Windowsversion, RSS Reader evt. ...)

Ich habe unter .NET 1.1 mit der Eigenschaft TransparencKey einwenig herumgespielt. Hat gut funktioniert. Als ich das Projekt, aber unter .NET 2.0 kompiliert habe sah das Resultat einwenig anders aus. U.a. war die Farbe, die für die Transparenz zuständig ist, an einigen stellen sichtbar(Text).

Ich gehe davon aus, dass es evt. mit dem aktivieren Clear Typ und der unterschiedlichen .NET Version zusammen hängt. Bin mir aber nicht sicher.
Ein anderes Problem ist dass, ich die Form nicht ändern(größe, verschieben(habe ich mittlerweile über einen Umweg realisieren können) kann (Formboarderstyl:None). Auch die ganzen Events funktionieren nur eingeschränkt. Sie funktionieren nämlich nur dort wo wirklich etwas Sichtbares ist.

Ich habe im Internet nicht wirklich brauchbare Lösung gefunden. Habt ihr vielleicht eine Idee?

[Update] Ich bin mir jetzt zimlich sicher, dass auf Grund der aktivierten Option Clear Typ die Schrift so pink ist. Bleibt mir wahrscheinlich nichts anderes übrig als die ganzen Fenster zu zeichnen mit GDI+. Oder habt ihr eine bessere Idee?

03.07.2006 - 17:56 Uhr

Hallo,

ich hab mehrere Drawing.Strings. Die würde ich jetzt gerne zu einem einzigen Drawing.String machen um eine bessere Positionierung durchführen zu können.


public static void startText(PaintEventArgs e)
        {
            Graphics zeichnen = e.Graphics;
            Font Pschrift = new Font("Arial", 12);
            Font Aschrift = new Font("Arial", 12);
            zeichnen.DrawString("P", Pschrift, Brushes.MediumPurple, Form1.Bildschirmauflösungbreite/2-10, Form1.Bildschirmauflösungshöhe/2);
            zeichnen.DrawString("ress ", Aschrift, Brushes.MediumVioletRed, Form1.Bildschirmauflösungbreite / 2, Form1.Bildschirmauflösungshöhe / 2);
            zeichnen.DrawString("E", Pschrift, Brushes.OrangeRed, Form1.Bildschirmauflösungbreite/2+30, Form1.Bildschirmauflösungshöhe/2);
            zeichnen.DrawString("nter", Aschrift, Brushes.YellowGreen, Form1.Bildschirmauflösungbreite / 2 + 40, Form1.Bildschirmauflösungshöhe / 2);
        }

Außerdem würd ich gern anhand dieser Strings eine Art Menü realisieren falls dies möglich ist.

Dass man mit der Tastatur dann einen Menüpunkt auswählen kann. Ich hoffe ihr wisst was ich meine. Habt ihr eine Idee?

mfg martin

14.03.2006 - 17:41 Uhr

Hallo,

danke funktioniert. Ich hab vorher die 2te Methode nicht in der Rekursive Methode gestartet, da ich dachte, dass die 2te Methode zu früh gestartet wird und dann zu wenig Werte geliefert bekommt. Aber jetzt ist mir klar das die 2teMethode so oft gestartet wird wie nötig um alle Werte in der zweiten Methode zu bearbeiten.

mfg martin

14.03.2006 - 16:50 Uhr

Original von cadi
Hallo sbrain,

Mir ist nicht ganz klar, was da nun per ref übergeben werden soll?

OpenSubKey liefert doch ein RegistryKey Objekt zurück.
Das Ergebnis wird keiner Variablen zugewiesen, die durch den Aufruf von Schlüsselsammeln ihren Wert verändern könnte.
Warum ein REF ?

Wieso nicht einfach ohne REF den Key übergeben und sammeln?

Hallo,

vorerst einmal danke für die zahlreichen Antworten. Ich möchte in einer weiteren Methode RegistryKey UsersKey weiter bearbeiten und das kann ich nur entweder mit ref oder out.

mfg martin

14.03.2006 - 15:27 Uhr

Hallo,

Ich rufe in einer Methode eine Methode auf. Wie kann ich dor ein ref Parameter verwenden? Bekomme dort immer den Fehler:

Ein ref- muss immer eine zuweisbare Variable sein.

Schlüsselsammeln(ref UsersKey.OpenSubKey(Untereinträge[i], true)); // Hier der Error wegen dem ref

Insgesammt schaut der Code so aus:


...
Schlüsselsammeln(UsersKey);//Aufruf
}
public static void Schlüsselsammeln(RegistryKey UsersKey)
{
for..{
Schlüsselsammeln(UsersKey.OpenSubKey(Untereinträge[i], true));
}
}

Habs so probiert:

Schlüsselsammeln ref UsersKey = UsersKey.OpenSubKey(Untereinträge[i], true);
Schlüsselsammeln(UsersKey)

Funktioniert aber leider nicht.

Habt ihr ne Idee?

mfg martin

01.03.2006 - 14:46 Uhr

Original von herbivore
Hallo sbrain,

Aber du kannst ja mittels des Strings den jeweiligen RegistryKey öffnen. Und dann kommst du mit RegistryKey.GetValueNames an die Namen deiner Values. Und mit RegistryKey.GetValue kommst du dann an die eigentlichen Werte.

herbivore

Das versuch ich ja im unteren Teil. gg Deshalb auch das casting Problem. Oder hast du das irgendwie anderst gemeint?

mfg

25.02.2006 - 15:19 Uhr

Hallo,

ich will ein Tool erstellen, mit dem man die Registery durchsucht oder sonsitge modifikationen durchführen kann. Deshalb will ich alle Schlüssel und Werte in einem Array abspeichern. Hier einmal der Quellcode:


using System;
using System.Text;
using Microsoft.Win32;
using System.Collections;
 
namespace Registery_Werte_auslesen
{
    class Program
    {
        //UsersKey defenieren um Zugriff auf HKEY_USERS zu bekommen.
        public static RegistryKey UsersKey = Registry.Users;
 
        //In diese Variable werden die Schlüssel gespeichert
        public static ArrayList Schlüssel = new ArrayList(1);
        public static ArrayList NamenderWerte = new ArrayList(1);
        public static ArrayList Werte = new ArrayList(1);
        static void Main()
        {
 
 
            Schlüsselsammeln(Registry.Users, Schlüssel);
            for (int i = 0; i < Schlüssel.Count; i++ )
            {
                Console.WriteLine(Schlüssel[i]);
            }
            Werteholen(Schlüssel, Werte);
            for (int i = 0; i < NamenderWerte.Count; i++)
            {
                Console.WriteLine(NamenderWerte[i]);
            }
            Console.ReadLine();
 
        }
        public static void Schlüsselsammeln(RegistryKey UsersKey, ArrayList Schlüssel)
        {
            //Mit der Methode GetSubKeyNames() alle Untereinträge/Schlüssel ( alias Verzweigungen/Ordner) holen
            //und in string[] Untereinträge speichern.
            //Alle Schlüssel sind z.b von HKEY_USERS in Untereinträge als Array gespeichert.
            //Nun müssen die Restlichen Schlüssel/Verzweigungen geholt werden.
            string[] Untereinträge = UsersKey.GetSubKeyNames();
 
            //Mit Untereinträge.Length erhalten wir die Anzahl der Schlüssel
            for (int i = 0; i < Untereinträge.Length; i++)
            {
                //Console.WriteLine(Untereinträge[i]);
                try
                {
 
                    //Rekursiver Methodenaufruf
                    //Mit der Methode OpenSubKey öffnet man einen Untereintrag
                    //Es wird die Methode von neuem gestartet aber als Paramter wird Untereinträge[i] angegeben.
                    //Nun wird der erste Schlüssel Unterschlüssel geöffnet und alle Untereinträge werden "geholt". 
                    //usw.
                    Schlüsselsammeln(UsersKey.OpenSubKey(Untereinträge[i], true), Schlüssel);
                    //Schlüssel speichern
                    Schlüssel.AddRange(Untereinträge);
                }
                catch
                {
                    //Abbruch wenn kein weiterer Schlüssel vorhanden ist.
                    //System.Console.WriteLine("Error");
                }
 
           }
 
        }
        public static void Werteholen(ArrayList Schlüssel, ArrayList NamenderWerte)
        {
            RegistryKey UsersKey = Registry.Users;
 
            for (int i = 0; i < Schlüssel.Count; i++)
            {
                NamenderWerte.AddRange(((RegistryKey) Schlüssel[i]).GetSubKeyNames()); //Hier Error
                //InvalidCastException
                //"Das Objekt des Typs System.String kann nicht in Typ Microsoft.Win32.RegistryKey umgewandelt werden."
            }
        }
    }
}

Anscheinend kann ich mit dem Array Schlüssel die Werte der Namen nicht holen weil dieser nur ein string ist und in der Methode Schlüsselsammeln kein die Schlüssel nicht in den Array mit dem RegistryKey gespeichert wird.

Denn die Methode GetSubKeyNames() kann nur mit RegisteryKey Objeten arbeiten. Mein Array in dem ich meine Schlüssel gespeichert habe wäre somit umsonst. Eine Konvertierung von string[] in in Typ Microsoft.Win32.RegistryKey geht leider nicht. Hat jemand eine Idee wie ich mittels der gesammelten Schlüssel die Namen der Werte bekomme? Bin am verzweifeln.

mfg martin

11.02.2006 - 18:02 Uhr

Hallo,

ich habe das Programm jetzt mit Administratorenrechte ausgeführt und try/ catch eingebaut.

Leider klappt das immer noch nicht.

Hier mal der neue Programmcode:


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;

namespace Registery_Werte_auslesen
{
    class Program
    {
        
        static void Main()
        {
            //UsersKey defenieren um zugriff auf HKEY_USERS zu bekommen. 
            RegistryKey UsersKey = Registry.Users;
            PrintKeys(UsersKey);
            Console.ReadLine();

        }
        public static void PrintKeys(RegistryKey UsersKey)
        {
            //Mit der Methode GetSubKeyNames() die "Subkeys" holen und in string[] UsersKeyValue speichern
            string[] UsersKeyValue = UsersKey.GetSubKeyNames();

            
            //UsersKeyValue Ausgeben
            for (int i = 0; i < UsersKeyValue.Length; i++)
            {
                try{
                    UsersKey = UsersKey.OpenSubKey(UsersKeyValue[i],true); }
                catch{
                    System.Console.WriteLine("Error"); }

                Console.WriteLine(UsersKeyValue[i]);
            }            
        }

    }
}

Ich erhalte fast in jeder 2ten Zeile einen Error. Wenn ich catch weg lasse kommt folgender Fehler:

System.Security.SecurityException wurde nicht behandelt.
Message="Der angeforderte Registrierungszugriff ist unzulässig."
Source="mscorlib"
StackTrace:
bei System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
bei Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
bei Registery_Werte_auslesen.Program.PrintKeys(RegistryKey UsersKey) in C:\Dokumente und Einstellungen\martin\Eigene Dateien\Visual Studio 2005\Projects\Registery Werte in Array speichern\Registery Werte in Array speichern\Program.cs:Zeile 29.
bei Registery_Werte_auslesen.Program.Main() in C:\Dokumente und Einstellungen\martin\Eigene Dateien\Visual Studio 2005\Projects\Registery Werte in Array speichern\Registery Werte in Array speichern\Program.cs:Zeile 15.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Er will mir einfach nicht die Unterverzeinisse von der Registery holen.
mfg

10.02.2006 - 19:15 Uhr

Ich hab den Code vom Tutorial übernommen und erhalte trotzdem einen Fehler. Wisst ihr wie ich alle Registery Werte/Verzeichnisse in einen Array abspeichern kann?

Hier nocheinmal nur der relevante Code:


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;

namespace Registery_Werte_auslesen
{
    class Program
    {
        private static void GetSubKeys(RegistryKey SubKey)
        {
            string[] keys = SubKey.GetSubKeyNames();
            for (int i = 0; i < keys.Length; i++)
            {
                System.Console.WriteLine(sub);
                RegistryKey local = Registry.Users;
                local = SubKey.OpenSubKey(sub, true);
                GetSubKeys(local); // By recalling itself it makes sure it get all the subkey names
            }
        }
        static void Main(string[] args)
        {
            
        //This is how we call the recursive function GetSubKeys
        RegistryKey OurKey = Registry.Users;
        OurKey = OurKey.OpenSubKey(@".DEFAULT",true);
        GetSubKeys(OurKey);

        }
    }
}

Fehler erhalte ich in der Zeile:


RegistryKey OurKey = Registry.Users;

SecurityException wurde nicht behandelt.
Der angeforderte Registrierungszugriff ist unzulässig.

Code ist von:
http://www.csharphelp.com/archives2/archive430.html

mfg

09.02.2006 - 21:31 Uhr

Hi, danke für den Link ich hab das so gemacht, also wie im Beispiel:


...
string Neuerwert, Wert;
			System.Console.WriteLine("Mit diesem Tool können Sie die Registery nach einem Wert durchsuchen und ihn mit einem beliebigen Wert ersetzten.");
			System.Console.WriteLine("Geben Sie ein welcher Wert ersetzt werden soll. :");
			Wert = System.Console.ReadLine();
			System.Console.WriteLine("Geben Sie ein welcher Wert stattdessen eingetragen soll. :");
			Neuerwert = System.Console.ReadLine();

            //This is how we call the recursive function GetSubKeys
            RegistryKey OurKey = Registry.Users;
            OurKey = OurKey.OpenSubKey(".DEFAULT\test", true);
            GetSubKeys(OurKey);

			System.Console.WriteLine("Der Wert "+Wert+" wurde durch "+Neuerwert+" ersetzt.");
			TextBeenden();


		
        private static void GetSubKeys(RegistryKey SubKey)
        {
            string[] keys = SubKey.GetSubKeyNames(); // hier kommt der Fehler, es hat den Anschein das die Schleife ein paar mal durchlauft, dann kommt die Fehlermeldung. Trotzdem wird der Key nicht ausgeben
            for (int i = 0; i < keys.Length; i++)
            {
                System.Console.WriteLine(keys[i]); //wird nicht Ausgegen.
                RegistryKey local = Registry.Users;
                local = SubKey.OpenSubKey(keys[i], true);
                // Durch das Wiederaufrufen wird sichergestellt dass, auch alle Keys "geholt" werden
                GetSubKeys(local); 
            }
        }

Ledeglich das foreac habe ich mit for Ausgetauscht. Trotzdem erhalte ich sowohl mit der for als auch foreach Schleife diese Fehlermeldung:

Nullreference wird nicht behandelt:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Habt ihr ne Idee?

mfg

10.01.2006 - 14:55 Uhr

Hallo,

ich will ein Programm machen mit dem man die Registery nach einem Wert durchsuchen kann und anschließend das gesuchte Wort/Wert mit einem neuen Wert ersetzt.

Wenn man z.b einen Pfad ändern will c:/Dokumente und Einstellungen auf c:/u dann muss man mehrere 100te Einträge in der Registery von Hand ändern. Das Programm soll einem diese arbeit abnehmen.

Da ich aber noch nie was in diese Richtung gemacht habe wollte ich fragen wie ich das am Besten angehe.

Habe mir schon ein paar interessante Arktikel rausgesucht.
http://www.thecodeproject.com/Purgatory/registry_in_c_.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfSystemSecurityPermissionsRegistryPermissionClassctorTopic.asp
Das Problem ist das ich nicht weiß wie ich alle Registery Werte/Verzeichnisse in einen Array speichern kann.

Ich habe noch keine Methode gefunden mit der ich diese Werte auto. reinladen kann.

Die normale Vorgangsweise wäre diese laut thecodeproject:

regKey = Registry.LocalMachine.OpenSubKey( "Software\MyRegKey", true); 

Nun müsste ich jeden Key/Verzeichniss von Hand eingeben und die Werte weichen ja von Maschine zu Maschine ab. Hat jemand ne Idee?

mfg Martin

25.09.2005 - 10:35 Uhr

Hallo,

ich habe in der ArrayList, die zu löschenden Dateien,komplett mit Pfad gespeichert.

Beispiel:
dateilist[0]="C:\U\user\LOKALE~1\Temp~DF36F6.tmp"

Nun will ich dieses Dateien und Verzeichnisse löschen. Leider klappt das bei mir nicht so ganz.


public static void Dateivs(ref ArrayList dateilist)
		{
			for(int i = 0; i <dateilist.Count;i++)
			{
				try
				{
					System.IO.Directory.Delete(dateilist[i]);
				}
				catch(Exception verzeichniserror)
				{
					Console.WriteLine("Konnte Datei:"+dateilist[i]+" nicht löschen");
				}
			}
			
		}

Fehlermeldung:
The best overloaded method match for 'System.IO.Directory.Delete(string)' has some invalid arguments

Argument '1': cannot convert from 'object' to 'string'

Habt ihr eine Idee? Falls ihr noch einen Codeteil braucht teil mir das bitte mit.

danke im voraus. mfg martin

20.08.2005 - 14:44 Uhr

Vielen Dank klappt hervorragend.

Wenn ich jetzt die Variablen verwenden will die ich von der Methode geholt habe ,dann stürtzt das Programm unerklärlicher weise ab.


public static void Dateivl() //Datei Verzeichnisse lesen
		{
			Verzeichnisse(ref Systemroot, ref Maind);
			
			string[] datei = System.IO.Directory.GetFiles(""+Systemroot+"");//geänderter Code , hier stürtzt das Programm ab	
			
			for(int i=0 ; i<datei.Length; i++)
			{
				Console.WriteLine(datei[i]);
			}
		}

Fehlermeldung:
An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: The path is not of a legal form.

Das Verzeichniss wird doch in einem string abgespeichert. Was ist daran falsch?
mfg martin

20.08.2005 - 13:20 Uhr

Hallo,

ich bin noch Anfänger und habe noch meine Schwierigkeiten bei Klassen und Methoden.

Ich habe eine Klasse main.cs und eine Namens funktionen.cs

Auszugaus aus funktionen.cs:


public string Systemroot;
public string Maind;

public static void Dateivl() //Datei Verzeichnisse lesen
		{
			Verzeichnisse(ref Systemroot, ref Maind); //Hier kommt ein Error
			string[] datei = System.IO.Directory.GetFiles("C:\\U\\martin\\Lokale Einstellungen\\");	
			
			for(int i=0 ; i<datei.Length; i++)
			{
				Console.WriteLine(datei[i]);
			}
		}
		public static void Dateivlo() //Datei Verzeichnisse löschen
		{
			string[] datei = System.IO.Directory.GetFiles("C:\\U\\martin\\Lokale Einstellungen\\");
		
			int zähler = 0;
			while(zähler<datei.Length)
			{
				System.IO.File.Delete(datei[zähler]);
				zähler++;
			}
		}
		public static void Verzeichnisse(ref string Systemroot,ref string Maind)//Systemverzeichnisse "holen"
		{
			Systemroot = Environment.GetEnvironmentVariable("%SYSTEMROOT%");
			Maind = Environment.GetEnvironmentVariable("%HOMEDRIVE%");
		}

Der Error besagt:
C:\U\martin\Eigene Dateien\Visual Studio Projects\Optimizer\funktionen.cs(53): An object reference is required for the nonstatic field, method, or property 'Optimizer.funktionen.Systemroot'
C:\U\martin\Eigene Dateien\Visual Studio Projects\Optimizer\funktionen.cs(53): An object reference is required for the nonstatic field, method, or property 'Optimizer.funktionen.Maind'

Wisst ihr warum das nicht geht und wie ich das ganze zum "Laufen" bringe?

Im Anhang findet ihr das ganze Projekt.

mfg martin

24.07.2005 - 18:33 Uhr

Hallo,

vielen Dank, Jetzt weis ich wie es geht. Nun möchte ich über die Windows Variablen in die Verzeichnise gelangen, da diese ja von Windows user zu Windows user verschieden sein können.

Wisst ihr wie ich die an die Varibalen komme?

Z.B.:
%SYSTEMROOT%
%HOMEDRIVE%
%programfiles%
etc

24.07.2005 - 15:42 Uhr

Hallo,

könnt ihr mir sagen wie ich alle Dateinamen aus einem Ordner auslesen kann?

Ich möchte die Dateien anschließend löschen. Gibt es dazu eine einfach schnelle Methode? Vielen Dank im Voraus.

24.07.2005 - 15:39 Uhr

Vielen Dank klappt jetzt.

24.07.2005 - 15:21 Uhr

Also wenn ich davor die Varialben defeniere bekomme ich diese Fehlermeldung.

...Dateien\Visual Studio Projects\Optimizer\Class1.cs(67): Use of unassigned local variable 'strSysFolder'

...Dateien\Visual Studio Projects\Optimizer\Class1.cs(67): Use of unassigned local variable 'strCmdLine'

24.07.2005 - 15:06 Uhr

Hallo,

ich bekomme immer eine Fehlermeldung bei folgenden Zeilen:


public static void Systeminfo(ref string strSysFolder, ref string strCmdLine )
		{
			// Pfad vom OS
			strSysFolder = Environment.SystemDirectory;

			// Ort + Dateiname der ausgeführten Datei
			strCmdLine = Environment.CommandLine;


			
			
		}

Aufruf der Methode:


Systeminfo(ref strSysFolder, ref strCmdLine);

Ich bekomme immer die Fehlermeldung:
C:...Projects\Optimizer\Class1.cs(63): The name 'strSysFolder' does not exist in the class or namespace 'Optimizer.Class1'
C:...Projects\Optimizer\Class1.cs(63): The name 'strCmdLine' does not exist in the class or namespace 'Optimizer.Class1'

Wisst ihr woran das liegen könnte?

01.10.2004 - 17:26 Uhr

Wie mach ich einen verweis über einen verweis?

Ich hab das jetzt so gemacht:


using System;
using System.Security.Principal;
using System.Windows.Forms.dll;
using System.Windows.Forms;


namespace winxp_optimzer
{
	/// <summary>
	/// Summary description ...

Der Compiler bringt aber leider immer noch die Fehlermeldung:
The type or namespace name 'Windows' does not exist in the class or namespace 'System' (are you missing an assembly reference?)

mfg martin

30.09.2004 - 16:00 Uhr

Vielen dank hab es auch gerade gefunden.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformssendkeysclasstopic.asp

Leider scheint es nur bei einer Windows Application zu funktionieren.

Bei einer Konsolenanwendung geht das nicht, oder etwa unter bestimmten umwegen doch?

mfg martin

30.09.2004 - 15:41 Uhr

Kann das sein das ich noch etwas anderes brauche wie using System.

Bei dem Code bringt er mir The Typ or Namespace can´t be found.

mfg martin

30.09.2004 - 10:17 Uhr

Das Fenster maximieren will ich nicht.

Wenn man in einer Konsolen Anwedung ALT+Enter Drückt kommt man ja in den Vollbild Modus.

Ist es nicht möglich irgendwie das Drücken der ALT+Enter taste zu simulieren das dann das OS das Programm in den Vollbildmodus schaltet?

30.09.2004 - 10:13 Uhr

Also ich hab das gemacht was ihr gesagt habt. Dann ist aber eine Meldung gekommen das das nicht static sein darf.

Ich habs jetzt so gemacht:


class Class1
	{
		public static void WillkommensText()
		{
			Console.Write("Willkommen im Winxpoptimzer.\nMit diesem Programm können Sie ihr Windows wieder Fit machen.\n");
		}
		public static void Information()
		{
			string strSysFolder = Environment.SystemDirectory;
			Console.Write("\nDer Systemordner ist: "+strSysFolder+"");
		}
		[STAThread]
		static void Main(string[] args)
		{
			bool isAdmin;
			isAdmin = (new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator));
			if(isAdmin==true)
			{
				WillkommensText();
				Information();
			}
			else
			{
				Console.WriteLine("Sie haben keine Administratoren Rechte."+isAdmin+"");
			}
			
			Console.ReadLine();


		}
	}

So wie ich aber jetzt das Up geschrieben habe kann ich die Variabeln nicht herausholen.
Ich habe nämlich vor eine Log datei zu schreiben. Dann will ich die Varibalen aus dem UP holen weil ich sonst alle Variablen doppelt machen müsste.

Ich habe auch versucht die Variable bool isAdmin; public zu machen aber das ging auch nicht.
Geht das bei bool etwa nicht?

28.09.2004 - 20:27 Uhr

E:\OS_SYSBUSER\user\Eigene Dateien\Visual Studio Projects\winxp optimizer\Class1.cs(33): An object reference is required for the nonstatic field, method, or property 'winxp_optimizer.Class1.strSysFolder'

28.09.2004 - 20:13 Uhr

Hallo,

kann mir jemand sagen warum dieses Up nicht funktioniert. Ich verstehe die Fehlermeldung nicht.


using System;

namespace winxp_optimizer
{
	/// <summary>
	/// Erstellt am 28 September
	/// </summary>
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		
		/// Variablen
		
		public string strSysFolder;
		public string strCurFolder;
		public string strCmdLine;
		public string strNewLine;
		public string strStack;
		public int nTicks;
		
		public static void Information(string strSysFolder)
		{
			// Get the system folder where OS is installed.
			strSysFolder = Environment.SystemDirectory;
		}

		[STAThread]
		static void Main(string[] args)
		{
			
			Information(strSysFolder);
			Console.ReadLine();
		}
	}
}


bitte helft mir.

mfg martin

28.09.2004 - 19:17 Uhr

Danke hat geklappt.

Dann hätte ich noch eine Frage.

Eine funktion das das Konsolenfenster in den Vollmodus wechselt gibt es nicht zufällig?

28.09.2004 - 14:11 Uhr

Hallo,

ich will mir ein Programm machen das mir sämtlichen Datenmüll löscht.
Nun wollte ich fragen wie kann mein Programm sich selber überprüfen ob es Administratoren rechte hat.

Wisst ihr wie ich das machen kann?

danke im vor raus.

martin

14.07.2004 - 13:16 Uhr

Original von Xqgene
was meinst du mit Label? Ist das der weisse Bereich auf dem Bild?
Wenn du bei deinem Label (??) die Dock-Eigenschaft auf Left setzt wird das nicht mehr passieren. Noch besser wäre es, wenn du dor ein Panel platzierst und die Button auf Panel ziehst. ^

Ja der weisse Bereich ist das label. Wenn ich die Eigenschaft Dock setze werden die Windowsfenster nicht mehr unter dem label geladen dennoch kann der Benutzer die Windowsfenster unter das label verschieben. Das möchte ich verhindern um evt. Fehlerquellen zu vermeiden.

14.07.2004 - 00:38 Uhr

thx klappt.

Was mir gerade aufgefallen ist, dass wenn man ein Fenster minimiert (im Programm) das dieses dann hinter dem label verschwindet.

Auch kann der Benutzer das Fenster hinter das label verschieben.
Wie kann ich das verhindern?

mfg martin

13.07.2004 - 22:49 Uhr

Hallo,

Ich hab ein Fenster mit dem Mode MDI. Links davon habe ich ein Label und ein paar Buttons positioniert.

Wenn ich jetzt ein Fenster rein lade ist das unterhalb des Labels. Wie kann ich selber die Startposiotn der Fenster defenieren?

Bis jetzt habe ich nur die beim Fensterladen die Startpositionen Mitte und Default gefunden aber keines bei dem ich selber die Positon definieren kann.

Hier ein Bild:
Um die Bilder anzusehen müsst ihr die URL in die Adressen-Leiste rein -kopieren.
http://getnetwork.funpic.de/Untitled-1.gif
http://getnetwork.funpic.de/Untitled-2.gif

Ich hoffe ihr wisst was ich meine.

this.StartPosition = System.Windows.Forms.FormStartPosition.Manual(568, 307);

Das geht leider nicht.

Habt ihr eine Idee wie ich verhindern kann das das Fenster hinter das Label geht. Am besten wäre es wenn das Fenster über das Label geht oder neben dem Label geladen wird.

mfg Martin

23.06.2004 - 18:09 Uhr

thx klappt.

Gibt es in der Math. Libary eine funktion die mir die Elemente die sich in der Variable a befinden sortiert?

Wenn zB.:
a=new float[5] {0,5,3,4,7}

Jetzt will muss ich die Zahlen der größe nach ordnen. (7,5,4,3)

Weis jemand wie das geht?

mfg martin

23.06.2004 - 14:08 Uhr

Danke hat geklappt


			float[] a;
			int ai;
			System.Console.WriteLine("Geben Sie ein wieviel Elemente(-1) für die Variable 'a' reserviert werden sollen");
			ai=System.Convert.ToInt32(Console.ReadLine());
			a=new float[ai];

			double[] vals = new double[30];

			Random rand = new Random();
			for(int i = 0; i < ai; i++)
			{
				a[i] = rand.Next();
			}

			for (int i=0;i<ai;i++)
			{
				Console.WriteLine(""+i+" Zahl:"+a[i]+"");
			}
			Console.ReadLine();

Du hast:

a[i] = rand.NextFloat();

geschrieben.
Wenn ich jetzt


a[i] = rand.NextInt();

schreibe generiert er dann nur für Datentyp Int Zufallszahlen?

23.06.2004 - 13:40 Uhr

Hallo,

ich will eine Variable[] mit Zahlen füllen. Dann hab ich mir gedacht das sich das mit Random realisieren lässt.
Hier mal der Code:


float[] a;
	int ai;
	System.Console.WriteLine("Geben Sie ein wieviel Elemente für die Variable 'a' reserviert werden sollen");
	ai=System.Convert.ToInt32(Console.ReadLine());
	a=new float[ai];

	for (int i=0; i<ai;i++)
	{
		Random rmd=new Random();
		float z=rmd.Next(0,ai+1);
		a[i]=z;
	}

	for (int i=0;i<ai;i++)
	{
		Console.WriteLine(""+i+" Zahl:"+a[i]+"");
	}
	Console.ReadLine();

Wenn ich nun die per Random generierten Werte ausgebe sind alle gleich.
An was liegt das?

mfg martin

08.04.2004 - 19:41 Uhr

Hallo,

ich such eine Tabelle der den Unicode enthaltet. Habe schon mit google gesucht konnte aber nichts finden.

kennt jemand eine seite auf der der Unicode zufinden ist?

Hexacode wäre auch nicht schlecht.

mfg martin

08.04.2004 - 13:10 Uhr

DieSyntax kommt zum größten teil aus der Sprachfamilie C/C++ hervor.

Das ist weder ein Satz noch richtig ... die Syntax ist wohl größtenteils eher an Java angelehnt.

Wie bereits zeus sagte ist das ganze inhaltlich richtig auch wurde dies mir von einem anderen Board bestätigt.

C++ ist eine eher schwer zu lernende Programmiersprache. Obwohl C# genau so komplex wie C++ ist, ist C# dagegen eine leicht verständliche Sprache. Da sie neu entwickelt wurde, enthält sie im Unterschied zu C++ keine störenden Relikte aus der Vorgängerversion.

WAS ist denn an C++ schwer? Nenn das Kind doch bitte mal beim Namen. Dass C# genauso komplex wie C++ ist, wage ich mal zu bezweifeln. Was ist mit fehlender Mehrfachvererbung, dem Fehlen von Pointern, ...?

Habe ich entfernt.

C# und alle anderen Programmiersprachen, die für .NET entwickelt wurden und werden, benötigen das .NET Framework als Laufzeitumgebung (runtime enviroment).

Nein. Die Programme, die mit C# und den anderen Sprachen erstellt werden, benötigen die Runtime. Diese ist aber nur ein Teil des Frameworks. Ob das GANZE Framework immer gebraucht wird, na ja ...

Ich habe mir erlaubt deinen Satz zu kopieren.

Die Aufgabe der Laufzeitumgebung besteht darin der jeweiligen entwickelten Programmiersprachen den Code auszuführen nebenbei ist sie noch eine virtuelle Maschine.

Das ist wiederum kein Satz 😦.

Habe ich richtig gestellt.

Bevor ein Programm von der Laufzeitumgebung ausgeführt werden kann, muss man den Quellcode mit einem .NET-fähigen Compiler kompiliert werden.

Das leider auch nicht.

In Deinem Schaubild zum Aufbau von .net stört mich einiges ... seit wann steht COM+ auf der gleichen Ebene wie Windows? ADO .net und XML sind weder ein Unterbau von Windows Forms noch von ASP .net. Die CLS würde ich eher unterhalb von ASP .net suchen, nicht darüber.

Habe ich ebenfalls korrigiert. Das Bild habe ich aus einem Buch entnommen. Wenn du eine bessere Grafische Darstellung vom .Net hast würde es mich freuen wenn du sie mir zukommen lasst.

Die Laufzeitumgebung (CLR) verwaltet nicht nur den Code sondern verwaltet auch unter anderem das "Speichermanagment", also die Verwaltung des Arbeitsspeichers. Die Common Language Runtime bietet eine eigene Speicherverwaltung, den so genannten Garbage Collector (GC) was so viel wie Müllabfuhr bedeutet.

*lol* Der letzte Satz ist besonders gut 😉. Dass die CLR das macht, hast Du schon damit gesagt, dass sie eine VM darstellt ... genau das macht eine VM aus ...

wurde korrigiert.

Dieser IL-Code wird vom .NET Framework verstanden und kann diesen in eine ausführbare Datei übersetzten.

Wer übersetzt hier wen? Ist auch wieder ein seltsamer Satzbau. Und das Wort "verstanden" finde ich unpassend, wenn es um Software geht ...

Inhaltlich richtig oder? Eine bessere Formulierung fallt mir im Augenblick nicht ein.

Da das .NET Framework zwischen Programm und Betriebsystem liegt, spielt das OS (Operating System) bei der Programmierung keine Rolle mehr, da das .NET Framework als Vermittler zwischen OS und Programm fungiert.

Du weißt, was ein Ringschluss ist?

geändert

Für Entwickler, die auf der .NET Plattform programmieren, bedeute dies, dass zunächst kein Maschinencode erzeugt wird (für einen bestimmten Prozessor), sondern IL-Code.

Das sagtest Du schon weiter oben. Maschinencode wird selten für einen bestimmten Prozessor, eher für eine bestimmte Architektur, erzeugt ...

Das habe ich bewusst noch einmal geschrieben. Doppelt hält besser.

Der C# -Compiler erzeugt einen IL-Code, dieser kann aber nicht vom physischen Computer verstanden werden.

Schon wieder versteht mein PC mich nicht 😉 ... so was kennt man sonst nur von Frauen ... SCNR 😉.

Vielleicht ist die Formulierung nicht die beste aber inhaltlich stimmt’s.

Diesen Code bezeichnet man als Native Code. Native bedeutet soviel wie ursprünglich, angeboren.

Ah ja. Und was soll ich mir bitte schön unter "angeborenem Code" vorstellen? Oder was wolltest Du uns damit jetzt genau sagen?

wurde entfernt.

Der Just-Time-Compiler oder auch Jitter ist eine Mischung aus Interpreter und Compiler.

Nein. Es ist ein Compiler.

ebenfalls korrigiert.

Erst wenn ein Programmmodul durch den Benutzer aufgerufen wird, wird dieses vom JIT-Compiler übersetzt. So wird Geschwindigkeit gewonnen und die Plattformunabhängigkeit durch den IL-Code wird gewährleistet.

Es mag in der Praxis schneller sein, nur der Grund dafür erschließt sich mir aus Deinen beiden Sätzen nicht. Wieso wird dadurch, dass zwischendurch erst mal kompiliert werden muss, Geschwindigkeit gewonnen? Das sollte doch eher zusätzliche Zeit brauchen, oder?

Es kann Geschwindigkeit gewonnen werden. Wenn ein Programmmodul nicht benötigt wird, wird dieses ja nicht kompiliert. Und so muss der Computer weniger berechen.

habe "wird" mit "kann" ersetzt.

Durch die Kompilation des Codes zur Laufzeit können viele Risiken minimiert werden (Codeveränderung durch Hacker, Speicherüberlauf, ...).

ROFL ... wer garantiert Dir bitte, dass ein Hacker nicht den Quellcode oder den MSIL-Code ändert? Der Jitter? Sorry, Du hast da was nicht verstanden.

Das hat unser Lehrer nicht nur gesagt sondern auch ins Skriptum geschrieben.
Habe den Satz entfernt.

Danke für die konstruktive Kritik. Habe ich etwas wichtiges vergessen zu erwähnen? Habt ihr beim Ersten Teil "Einführung in die Programmierung keine Fehler gefunden?
@golohaas.de kann ich dir die Zusammenfassung als .rtf schicken das du nochmal alles kontrollieren kannst.

Hier das überarbeitete Werk:
"
Grundlegendes zu C#

  1. Einleitung

Als erstes erkläre ich die Umgebung von C# näher,bevor wir mit dem Programmieren beginnen. Wie ihr schon im vorgehenden Artikel im Kapitel "1.6 Programmiersprachen -C#" entnehmen konntet, ist die Syntax von C# nicht wirklich neu. DieSyntax kommt zum größten teil aus der Sprachfamilie C/C++ hervor. Das Konzept von C# ist aber grundsätzlich neu entwickelt worden und fügt sich hundertprozentig in die .NET Technologie ein. (Viele Teile des .NET Frameworks sind in C# geschrieben worden.)
Da sie neu entwickelt wurde, enthält sie im Unterschied zu C++ keine störenden Relikte aus der Vorgängerversion. C# vereint die hohe Performance von C++ und die Einfachheit von Visual Basic.

1.2 Das .NET Framework

Um effektiv mit C# programmieren zu können sollte man einen genaueren theoretischen Hintergrund des .NET Framework haben. Das .NET Framework ist ein wesentlicher Bestandteil der .NET Technologie.

.NET besteht Grundsätzlich aus drei Teilen: .NET Framework

.NET Enterprise Server

Web Service

Die Programme, die mit C# und den anderen Sprachen erstellt werden, benötigen die Runtime. Diese ist aber nur ein Teil des Frameworks. Die Laufzeitumgebung (auch Java verwendet eine Laufzeitumgebung) besteht aus der Common Language Runtime, kurz CLR genannt. Die Laufzeitumgebung beinhaltet eine "virtuelle Maschine". Nebenbei zu erwähnen ist, dass das.NET Framework nur eine Laufzeitumgebung besitzt.

Bevor ein Programm von der Laufzeitumgebung ausgeführt wird, muss man den Quellcode mit einem .NET-fähigen Compiler übersetzen.

Aufbau des .NET Frameworks:

Common Language Runtime - CLR

Die Laufzeitumgebung (CLR) verwaltet nicht nur den Code sondern verwaltet auch unter anderem das "Speichermanagment" dies übernimmt der Garbage Collector (GC), was so viel wie Müllabfuhr bedeutet.

Intermediate Language

Wie schon bereits erwähnt ist .NET plattformunabhängig. Das Problem ist, dass es viele verschiedene Programmiersprachen in der .NET Umgebung gibt und jede Sprache unterschiedliche Syntaxen hat, aber nur eine Laufzeitumgebung vorhanden ist. So hat man den Zwischenschritt zwischen dem Programm und der fertig ausführbaren Datei mittels eines Zwischencode gelöst. Diesen Zwischencode nennt man Intermediate Language Code (IL- Code).

Dieser IL-Code wird vom .NET Framework verstanden und kann diesen in eine ausführbare Datei übersetzten. Da das .NET Framework zwischen Programm und Betriebsystem liegt bzw vermittelt, spielt das OS (Operating System) bei der Programmierung keine Rolle mehr.

Für Entwickler, die auf der .NET Plattform programmieren, bedeute dies, dass zunächst kein Maschinencode erzeugt wird (für einen bestimmten Prozessor), sondern IL-Code. Den IL-Code kann man sich als Code für einen virtuellen Prozessor vorstellen, den es nur in Form von einer Software gibt.

Das bedeutet, dass der Programmier eine beliebige .NET Programmiersprache aussucht und den Quellcode programmiert. Danach wird der Quellcode mit dem dazugehörigen Compiler(zum Beispiel ein Visual Basic .NET Compiler) kompiliert. Der Compiler erstellt dann den IL-Code und Metadaten die Informationen über Typen, Mitglieder und Verweise enthalten.

Abbildung: Vorgang des Kompilierens

Der IL-Code ist das Produkt der verschiedenen Compiler und wird als Ausführungscode für den JIT- Compiler benötigt.

Jitter - JIT -Compiler

Der C# -Compiler erzeugt einen IL-Code, dieser kann aber nicht vom physischen Computer verstanden werden. Wie wir wissen hat jeder Prozessortyp seine eigene Maschinensprache. Der Computer kann somit nur die Maschinensprache des physischen Prozessors ausführen. Diesen Code bezeichnet man als Native Code.

Der JIT-Compiler wandelt den IL-code automatisch in einen Maschinencode um. Dies geschieht nur dann wenn ein Programm aufgerufen wird. Diese Umwandlung geht so weit, dass nicht verwendete Programmmodule nicht vom JIT-Compiler übersetzt werden. Erst wenn ein Programmmodul durch den Benutzer aufgerufen wird, wird dieses vom JIT-Compiler übersetzt. So kann Geschwindigkeit gewonnen werden und die Plattformunabhängigkeit durch den IL-Code wird gewährleistet.

Zusammenfassung:

Der C#-Compiler erzeugt keinen Objectcode für eine tatsächliche CPU, sondern sogenannten Zwischencode (MSIL ... Microsoft Intermediate Instruction Language oder auch Intermediate Language(IL) gennannt) für einen virtuellen Prozessor. Ein JIT-Compiler übersetzt dann diesen Zwischencode zur Laufzeit in Maschinenbefehle auf der jeweiligen Plattform. Ein Linker ist nicht notwendig, weil die Unterprogramme (genauer: Klassen) nicht zu einem Gesamtprogramm gebunden, sondern einzeln bei Bedarf vom Classloader angefordert und kompiliert werden.

C#-Programme können auf allen Betriebssystemen ausgeführt werden, für die eine geeignete Laufzeitumgebung existiert. Dies ist eine Softwaresammlung, die unter anderem den genannten JIT-Compiler enthält. Der Quellcode muß dabei nicht verändert werden. Da der Befehlssatz des virtuellen Prozessors eingeschränkt werden kann, können Virenverbreitung bzw. Spionagefunktionen von C#-Programmen stark reduziert werden. Es gibt derzeit schon viele Spracshen, die MSIL-Code erzeugen können (C#, Visual Basic .NET, C++, ...). Damit kann der Entwickler seine bevorzugte Entwicklungssprache benutzen."

Mein nächsten Kapitel wären:
Variablen und Konstanten
Ausdrücke, Anweisungen und Operatoren
Ein-/Ausgabe und Strings
.Net Framenetwork installieren und den Compiler einrichten
Das Erste Programm

mfg martin

07.04.2004 - 20:11 Uhr

Hallo zusammen,

ich muss für die Schule eine Zusammenfassung zu C# machen.
Die ersten paar Kapitel habe ich bereits geschrieben und @ gestellt.

Könntet ihr bitte mal euch meine Zusammenfassung zu C# ansehen und mir sagen ob es Inhaltliche Fehler gibt.

Allgemeine Einführung ins Programmieren
Einführung in C#

Danke im vorraus.

mfg martin

aja wenn ihr Rechschreibfehler findet bitte auch mitteilen