Laden...
M
MM72
myCSharp.de - Member
2
Themen
8
Beiträge
Letzte Aktivität
vor 2 Jahren
Dabei seit
12.07.2022
Erstellt vor 2 Jahren

Ah Danke, da habe ich die Zeile wohl übersehen. An der anderen Stelle hatte ich es ja auskommentiert...manchmal sieht man halt das offensichtliche nicht. Den Link schau ich mir mal an, grad nur überflogen. Als C#-Sprachanfänger wird man anscheinend bei den Lehrgängen oft mit noch veralteter Vorgehensweise an bestimmte Dinge herangeführt...

Erstellt vor 2 Jahren

Hallo, ich habe in einer wpf-Anwendung eine listBox erstellt, mit der Einträge nach oben und unten verschoben werden können. Funktioniert auch alles prima, bis auf 1 kleines Detail:
wenn ich einen Eintrag mehrfach nach unten verschiebe, wird er an der untersten Stelle angekommen und dann erneut auf nach unten verschieben geklickt plötzlich abgewählt und man muss erst wieder einen neuen Eintrag oder den selbigen anwählen. Im Gegensatz zum nach oben verschieben, da bleibt der Eintrag auch ausgewählt, wenn ich ganz oben angelangt bin und versuche ihn erneut nach oben zu verschieben. Es wird lediglich die Meldung ausgegeben, das der Eintrag schon ganz oben ist und er bleibt aktiv. So wie ich es wollte. Mit welchem Befehl kann ich beim nach unten Verschieben an der letzten Position dann den Eintrag ebenfalls selektiert lassen bzw. den gleichen Eintrag erneut ausgewählt haben?

hier erstmal mein soweit funktionierender Code-Auszug aus der MainWindows.xaml.cs:


        private void btnNachOben_Click(object sender, RoutedEventArgs e)
        {
            
                int index = listBox.SelectedIndex;
            if (listBox.SelectedItem == null)
            {
                statusLabel.Content = "Eintrag auswählen";
                return;
            }

            else

               if (index == 0) 
            { 
                statusLabel.Content = "Eintrag ist schon ganz oben";
            }
            else
            {
                int platzO = index;
                index--;
               Verschieben(index);
               statusLabel.Content = "Eintrag nach oben verschoben auf Platz " + platzO;
            }

        }
        private void btnNachUnten_Click(object sender, RoutedEventArgs e)
        {

            int index = listBox.SelectedIndex;

            if (listBox.SelectedItem == null)
            {
                statusLabel.Content = "Eintrag auswählen";
                return;
            }

            if (index == listBox.Items.Count - 1) 
            {
                listBox.SelectedIndex = -1;
                statusLabel.Content = "Eintrag ist schon ganz unten";
                return ;
            }
            else
                index++;
            int platzU = index + 1;
            Verschieben(index);
            statusLabel.Content = "Eintrag nach unten verschoben auf Platz " + platzU;
            //listBox.SelectedIndex = -1;      //Eintrag wieder abwhählen / deselektieren
            // wenn mehrfaches verschieben gewünscht wird, muss die obige Anweisung auskommentiert werden oder
            // in einen extra Button "Deselektieren" ausgelagert werden


        }

        private void Verschieben(int index)
        {
            Object item = listBox.SelectedItem;
            listBox.Items.Remove(item);
            listBox.Items.Insert(index, item);
            listBox.SelectedIndex = index;
        }

Ich hoffe, jemand kann mir einen Tipp dazu geben.

Danke

Erstellt vor 2 Jahren

Noch einmal zum Verständnis: Der Ausgangscode ist in Lektion5.cs. Die im Eröffnungsthread geposteten Codezeilen sollen die Lösung sein, die ein Tutor nicht beanstandet hat und die Note 1 vergeben haben soll. Dies erschliesst sich mir jedoch nicht.
Da ich selber nicht die kompletten Dateien zur Verfügung gestellt bekommen hatte, die im Lehrbuch angegeben waren und die in der Aufgabenstellung aufgeführt sind, konnte ich noch nicht alle Lektion praktisch auch nachvollziehen. Ich werde mir also erst einmal noch aus anderen Quellen Wissen aneignen zu dem Themengebiet.
Ich hatte gehofft, ein wenig "reverse engineering" betreiben zu können und damit das Thema zu verstehen und mit dem Code etwas herumzuexperimentieren, aber das scheint mit den Codeschnipseln nicht zu funktionieren.

Erstellt vor 2 Jahren

wie bereits schon geschrieben: "Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code... "
Die Frage ist also, wenn der Typ erst hier deklariert wird:
class Düsenflugzeug : Starrflügelflugzeug
{
public Airbus typ;
....

wie kann dann auf typ in Flugzeug zugegriffen werden? Muss ich dort auch einen public Airbus typ; einbauen oder geht dies anders? und wenn ich das einbaue, "blendet" dies ja auch den Düsenflugzeug.typ
Also einfach abändern zu: public new Airbus typ; würde das Problem lösen, ich weiss, aber Dies wurde noch nirgends behandelt in den Lehrbüchern! DSaher meine Frage, ob dies anders geht unter den genannten Vorraussetzungen.
Ich kann halt nur das Wissen anwenden, was mir bereits vermittelt wurde. Klar, suche ich nach dem Fehler und versuche ihn zu beheben, aber wie gesagt, ich erwarte eigentlich, dass ich dies mit dem bisherigen Wissensstoff auch erreichen kann....
Und die Codeschnipsel sollten angeblich die Lösung sein und nicht etwas zum Verfollständigen oder ausfüllen.

Erstellt vor 2 Jahren

Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code...

Erstellt vor 2 Jahren

bei b) habe ich ebenfalls in der Methode Schreiber das BinaryWriter Schreiben; eingefügt, damit es funktioniert, bekomme dann aber noch die Fehlermeldung CS0103 "Der Name "typ" ist im aktuellen Kontext nicht vorhanden. sowie die Warung CS0108 Düsenflugzeug.Schreiber()" blendet den vererbten Member "Flugzeug.Schreiber()" aus. Verwenden Sie das new-Schlüsselwort, wenn das Ausblenden vorgesehen war.
Der aktuelle Stand des Projektes im Anhang.

Erstellt vor 2 Jahren

Die im Beitrag geposteten Codefragmente sollen angeblich die Lösung sein oder zumindest ein Teil davon, aber wie gesagt, schon allein im ersten Beispiel habe ich ja schon selbst herausgefunden, dass dem nicht so sein kann. Ich wollte nun mal jemand anderen drauf schauen lassen, um zu sehen, ob die Codefragmente richtig und hilfreich sind oder alles einfach "Mist" ist und voller Fehler steckt.
Wie gesagt, ich bin gerade erst dabei, dieses Kapitel durchzuarbeiten und hatte dabei schon einige organisatorische Probleme und habe mich in der Zeit mal im Netz nach Hilfe dazu umgeschaut... Naja werde ich mich weiterhin mit falschen Dateien, fehlerhaften Code von der Fern-Uni, fehlerhaften Code vom Tutor und fehlenden Dateien und dem was im Lehrbuch steht herumschlagen müssen. Bisher habe ich ganz gut mit der Analyse von bestehendem Code, deren Abwandlung und "sehen was wenn" gelernt, aber wenn schon der Ausgangscode nicht hinhaut und das Programm nicht lauffähig ist, ist das schwierig.

Erstellt vor 2 Jahren

Hallo,
ich versuche gerade in die C#-Programmierung einzusteigen und soll eine etwas umfangreichere (zumindest für mich jedenfalls) Aufgabe erledigen. Leider bekam ich zu dem Lernheft und der entsprechenden Aufgabe falsche Dateien, fehlende Dateien und feherhafte Code-Dateien, das reinste Wirrwar und ich komme trotz Suche im Netz nicht weiter. Da ich schon Wochenlang auf die richtigen Dateien warte und entweder gar keine Antwort bekomme oder Dateien, die ebenfalls nicht hilfreich sind und ich nicht länger warten möchte, hier mein Hilferuf also:

Ich soll aus dem Code von Lektion5.cs (im Anhang) folgende Aufgaben lösen und habe dazu schon etwas im Netz gefunden, was ich aber anscheinend nicht richtig in den Code implementieren kann:

  1. Aufgabe:
    Erstellen Sie für diese Einsendeaufgabe ein neues Projekt „ESA_Projekt“, in das Sie den letzten Stand des Fliegerprojekts kopieren. Ergänzen Sie das Projekt durch eine Programmierung, mit der die Positionsdaten eines Flugs in einer Datei protokolliert werden können.
    • Die Protokollierungsdatei soll in den Ausführordner des Programms („Release“ oder „Debug“) geschrieben werden
    • Der Name jeder Protokolldatei soll nach dem Muster
    <kennung>_<Tag>-<Stunde>-<Minute>-<Sekunde>.bin
    zusammengesetzt werden. Das lässt sich programmgesteuert erzeugen und unterscheidet mit dieser zeitabhängigen Codierung zuverlässig mehrere Protokolldateien.
    • In die Datei soll zunächst ein String geschrieben werden, der folgende Informationen zusammenfasst:
    Flug "<kennung>" (Typ "<typ>") startet an Position
    "<x>-<y>-<h>" mit Zielposition "<x>-<y>-<h>".
    Das ist der Header der Protokollierungsdatei, auf den sodann die Daten folgen. Auch hier sind wieder alle Ausdrücke mit spitzen Klammern durch konkrete Werte aus der Programmierung zu ersetzen.
    • In die Datei sollen sodann fortlaufend die x-, y- und h-Daten der aktuellen Position als int-Werte geschrieben werden, bis der Flug beendet ist. Das sind sozusagen die Daten der Datei.
    • Die Protokollierung soll vom Wert eines „Schalters“ abhängig gemacht werden, den Sie in der Klasse Program als static-Variable definieren:
    public static bool protokollieren = true;
    Wenn dieser Schalter auf true gesetzt ist, wird protokolliert, wenn er auf false gesetzt ist, wird nicht protokolliert.
    Bei dieser Aufgabe geht es nicht nur um die technische Realisierung vorgenannter Anforderungen, sondern vor allem um grundlegende Überlegungen objektorientierter Programmierung. Sie sollten sich z.B., wenn Sie den nötigen Writer deklarieren, klarmachen, dass ein Writer einem Flugschreiber entspricht und prüfen, welcher Fliegertyp überhaupt einen Flugschreiber nutzen kann. Beispiele für derartige Überlegungen objekt- orientierter Planung gab es in diesem Heft, aber auch schon bei der Planung des Projekts im Studienheft CSH01B – z.B. zur Ansiedlung des Transponders.
    Auf diesen Überlegungen aufbauend sind dann folgende Fragen zu beantworten:
    a) Wo deklarieren Sie das Writer-Objekt, damit es an den Stellen im Programm, an denen es benötigt wird, auch bekannt ist?
    In Klasse Starrflügelflugzeuge

private void Schreiber()
{
    Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
    Schreiben.Write(SchreibeHeader());
}


b) An welcher Stelle im Programm bauen Sie den Dateipfad zusammen, erstellen den Writer und schreiben den Header?
In der Klasse Flugzeug



public static string path;
public static string Pfad
{
    set { path = value; }
    get { return path; }
}
public string Dateipfad()
{
    DateTime timer = DateTime.Now;
    string path;
    string SetTime;
    SetTime = "" + timer.Day + "-" + timer.Hour + " -" + timer.Minute + " -" + timer.Second + "";
    path = Environment.CurrentDirectory + @"\" + kennung + "_" + SetTime + ".bin";
    return path;
}
public string SchreibeHeader()
{
    string header = "Flug " + kennung + "(Typ " + typ + ") startet an Position " + this.pos.x + "-" + this.pos.y + "-" + this.pos.h + " mit Zielposition " + zielPos.x + "-" + zielPos.y + "-" + zielPos.h + "." + Environment.NewLine + "";
    return header;
}
public void Schreiber()
{
    Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
    Schreiben.Write(SchreibeHeader());
}

c) An welcher Stelle im Programm schreiben Sie die Daten der x-, y- und h-Werte?
In die Transpond Methode. Nachdem die Parameter in int[] Byte geschrieben wurden, werden sie an die SchreibSchleife(Byte) übergeben welche den eigentlichen schreibvorgang durchführt.


public void Transpond(string kennung, Position pos)
{
    double abstand = Math.Sqrt(Math.Pow(this.pos.x - pos.x, 2) + Math.Pow(this.pos.y - pos.y, 2));
    //if (kennung.Equals(this.kennung)) 
    //Console.WriteLine("{0} an Position x={1}, y={2}, h={3}", kennung, pos.x, pos.y, pos.h); 
    DateTime timestamp = DateTime.Now;
    int[] Byte = { pos.x, pos.y, pos.h };
    if (kennung.Equals(this.kennung))
    {
        Console.Write("{0}:{1}", timestamp.Minute, timestamp.Second);
        Console.Write("\t{0}-Position: {1}-{2}-{3}", this.kennung, base.pos.x, base.pos.y, base.pos.h);
        Console.Write("Zieldistanz: {0} m\n", Zieldistanz());
        SchreibSchleife(Byte);
    }

d) An welcher Stelle im Programm schließen Sie den Writer?
Der Writer wird geschlossen sobald das Flugzeug gelandet ist und sich abgemeldet hat.


// Flieger Deregistrierung, Transponder abschalten, Abschlussmeldung
Program.fliegerRegister -= this.Steuern;
Program.transponder -= this.Transpond;
Console.WriteLine("\n{0} gelandet (Zieldistanz={1}, Höhendistanz={2}", kennung, Zieldistanz(), pos.h - zielPos.h);
Schreiben.Close();

e) Wie stellen Sie jeweils sicher, dass diese Operationen nur dann erfolgen, wenn der „Schalter“ in der Programmklasse auf true gestellt ist?
Dies erreiche ich indem ich die Aufrufobjekte „Schreiber(Byte)“ und Schreiben.Close() in eine if (protokollieren) Bedingung setze. Ist der wert „false“ so werden die Objekte nicht aufgerufen. Der Flugschreiber wird ebenfalls mit Program.transponder += Transpond; initialisiert
Geben Sie jeweils den Programmcode an und erläutern Sie kurz Ihre Programmierung.
Hinweis:
BinaryWriter kennt eine Methode
public virtual void Write ( string value )
… die nicht nur den als Parameter anzugebenden String in die Datei schreibt, sondern davor eine Information über die Länge des Strings speichert (vergleichen Sie die .NET-Dokumentation).
BinaryReader kennt eine spiegelbildliche Methode
public virtual string ReadString ()
… die zunächst die in der Binärdatei gespeicherte Längeninformation auswertet und sodann präzise die Länge des nachfolgenden String liest, sodass der Lesezeiger für weitere Leseoperationen genau auf das nachfolgende Byte gesetzt wird.

Soweit also die Aufgabe.

Die Probleme fangen schon an, dass das Writer-Objekt so anscheinend gar nicht funktioniert, zumindest Sagt mir mein Visual Studio dann als Fehler: Der Name Schreiben ist im aktuellen Kontext nicht vorhanden. Erst wenn ich


BinaryWriter Schreiben;

davor setze oder zumindest die Zeile abändere in BinaryWriter Schreiben = new..... dann ist es fehlerfrei. Und so zieht sich das irgendwie alles durch und ich schaffe es nicht, aus den Bruchstücken einen funktionsfähigen Code zu erzeugen.
Nunja, vielleicht kann mir hier jemand helfen. Die anderen Aufgaben habe ich bisher immer gelöst bekommen, aber mit den oben beschriebenen Hürden wirds diesmal anscheinend nichts.
Achja, damit der Code von Lektion 5 funktioniert, im Anhang noch die beiden init-Dateien für den Debug-Ordner als zip.