Laden...
E
esparki myCSharp.de - Member
Elektronikingenieur Berlin Dabei seit 14.12.2006 27 Beiträge
Benutzerbeschreibung

Forenbeiträge von esparki Ingesamt 27 Beiträge

14.06.2018 - 14:07 Uhr

Hallo,
meine Anwendung arbeitet viel mit Rezepten. Der aktuelle Stand ist, dass jedes Rezept in einer Textdatei abgelegt ist und man diese vorab auswählen muss.
Nun möchte ich das ganze etwas abkoppeln.

Die Idee ist, eine lokale Datenbank(-Datei) mit zu integrieren, in der sich dann die Rezepte befinden.
Es handelt sich hierbei aber um ein kommerzielles Produkt, sprich die Anwendung wird mit einer Maschine ausgeliefert.

Daher die Frage, wie sich hier die lizenzrechtlichen Bedingungen verhalten.
Im Visual-Studio kann man ja Datenquellen direkt hinzufügen. Bei der Auswahl der Datenquelle gibt es dann die Möglichkeit der "MS Access-Datenbankdatei" oder einer "MS SQL Server-Datenbankdatei" (hier steht in Klammern "einschließlich MS SQL Express)

Wie sind da eure Erfahrungen, oder benutzt ihr ein ganz anderes System.

30.10.2014 - 13:53 Uhr

Bei Windows 7 kann dieser Befehl aber ab und zu nicht funktionieren (SetForegroundWindow Win32-API not always works on Windows-7)
Dabei habe ich festgestellt, dass das Problem meißtens auftritt, wenn ein Fenster in der Taskleiste minimiert ist.
Bezogen auf dem Programmcode von der oben genannten Seite habe ich folgende Lösung:


        [DllImport("user32.dll", SetLastError = true)]
        static extern bool BringWindowToTop(IntPtr hWnd);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);

        enum ShowWindowCommands
        {
            /// <summary>
            /// Hides the window and activates another window.
            /// </summary>
            Hide = 0,
            Normal = 1,
            /// <summary>
            /// Activates the window and displays it as a minimized window.
            /// </summary>
            ShowMinimized = 2,
            /// <summary>
            /// Maximizes the specified window.
            /// </summary>
            Maximize = 3, // is this the right value?
            /// <summary>
            /// Activates the window and displays it as a maximized window.
            /// </summary>       
            ShowMaximized = 3,
            /// <summary>
            /// Displays a window in its most recent size and position. This value 
            /// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except 
            /// the window is not activated.
            /// </summary>
            ShowNoActivate = 4,
            /// <summary>
            /// Activates the window and displays it in its current size and position. 
            /// </summary>
            Show = 5,
            /// <summary>
            /// Minimizes the specified window and activates the next top-level 
            /// window in the Z order.
            /// </summary>
            Minimize = 6,
            /// <summary>
            /// Displays the window as a minimized window. This value is similar to
            /// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the 
            /// window is not activated.
            /// </summary>
            ShowMinNoActive = 7,
            /// <summary>
            /// Displays the window in its current size and position. This value is 
            /// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the 
            /// window is not activated.
            /// </summary>
            ShowNA = 8,
            /// <summary>
            /// Activates and displays the window. If the window is minimized or 
            /// maximized, the system restores it to its original size and position. 
            /// An application should specify this flag when restoring a minimized window.
            /// </summary>
            Restore = 9,
            /// <summary>
            /// Sets the show state based on the SW_* value specified in the 
            /// STARTUPINFO structure passed to the CreateProcess function by the 
            /// program that started the application.
            /// </summary>
            ShowDefault = 10,
            /// <summary>
            ///  <b>Windows 2000/XP:</b> Minimizes a window, even if the thread 
            /// that owns the window is not responding. This flag should only be 
            /// used when minimizing windows from a different thread.
            /// </summary>
            ForceMinimize = 11
        }

        public bool BringToFront (IntPtr win)
        {
            BringWindowToTop(win);
            Rectangle rect = new Rectangle();
            GetWindowRect(win, ref rect); 
            if (rect.Left > -30000)
            {
                ShowWindow(win, ShowWindowCommands.Show);
            }
            else
            {
                ShowWindow(win, ShowWindowCommands.Restore);
            }
            return true;
        }

Was noch fehlt ist eine Abfrage, ob die Funktion auch wirklich geklappt hat, aktuell gibt diese immer nur "true" zurück.

Gruß Marco

24.10.2014 - 15:17 Uhr

Hallo
habe ein ähnliches Problem, leider weiß ich nicht, wie ich die struct mit dem PropertyGrid verknüpfen kann.
Problembeschreibung:
Ich habe eine Struktur mit ca. 150 Variable (diese wird zur Kommunikation mit einer SPS-Verwendet).
Für Testzwecke möchte ich mir diese in einem extra Fenster Anzeigen lassen und mit bspw. CheckBoxen setzen bzw rücksetzen (Es handelt sich nur um Boolsche Werte).
Ich habe bisher keine Liste (CheckListBox, DataGridView,...), mit der ich eine Struktur direkt Verknüfung kann, gefunden. Alles nur über Arrays oder List<>.
Wenn ich aber bspw. via Reflection die struct in eine Liste kopiere, dann verliere ich doch den eigentlichen Bezug, wenn ich die Variable in der Liste verändere.
Übersehe ich hier etwas oder ist es eventuell gar nicht möglich eine struct dynamisch in der GUI anzeigen zu lassen mit der Möglichkeit der Änderung.
Gruß Marco

23.04.2014 - 15:52 Uhr

Vielen Dank erstmal für die rege Unterstützung

@FZelle: Ich habe den Quellcode von meinem Vorgänger bekommen und arbeite darauf weiter. Aber wie Abt schon richtig vermutet, ist die Bibliothek der SPS schon mit struct aufgebaut.

@weismat und chilic Der Code war nur ein kurz zusammengefasstes Beispiel. Mit dem Ausgang schalte ich den Motor ein und mit dem Eingang frage ich bspw. einen Drehgeber-Sensor ab, der mir sagt, das mein Motor auch wirklich dreht. Die eigentliche Abfrage läuft Byteweise ab (Ein 8fach SPS-Eingangsmodul = 1 Byte), sprich vorher werden die Bytes auf Bits und dann in verständliche Variablen umgewandelt. Da findet dann auch die Umwandlung in bool statt.

@herbivore ich denke mal, so wie die meißten habe ich vor meinem Beitrag auch die MSDN durchforstet und vereinzelt Testcode geschrieben. Leider bin ich nicht auf das passende Ergebnis gekommen.

@xxxprod Genau das habe ich nun gemacht. Ich habe nun die Ein-Ausgabe der SPS und die eigentliche Bearbeitung in zwei verschiedene Threads gepackt. In dem Thread der SPS wird die Input-struct immer mit den aktuellen Daten der SPS beschrieben und die Daten in der Output-struct immer in die SPS-geschrieben. Während die Bearbeitung parallel läuft und auf beide struct zugreift. Um die Zeitverzögerung zwischen dem schreiben in die SPS und ein dafür logisches Eingangssignal zu erhalten verwende ich kurze Schleifen. Hierdurch kann ich auch ein eventuelles hängen in der Anlage abgreifen. Innerhalb der Schleife frage ich auch ab, ob der gewünschte Zsutand schon erreicht ist und springe dann raus um unnötige Wartezeit zu minimieren.


clTimer_TimeOut.Set_ms(150);
while (!clTimer_TimeOut.Abgelaufen())
{
   if(/*logischer Zustand schon erreicht?*/)
        break;
}

Vielen Dank noch einmal für eure schnelle Hilfe.

23.04.2014 - 11:22 Uhr

Hallo Leute,

ich arbeite gerade an einer SPS-Steuerung. Der gesamte Ablauf wird in C-Sharp programmiert. Die Kommunikation mit der SPS ist über eine eigene Bibliothek realisiert.
Der Ablauf ist folgendermaßen:
Alle 15ms werden nacheinander die folgenden Methoden aufgerufen:

  • lese SPS-Eingänge
  • Werte den Zustand aus und mache etwas (Bearbeite)
  • schreibe SPS-Ausgänge

Die SPS-Ein-und Ausgänge sind jeweils in einer Struktur hinterlegt.
Bisher wurde die Methode "Bearbeite" mit einer switch/case-Anweisung realisiert und nach einem "case-Block" wurde die "switch-Variable" verändert. Beim nächsten Durchgang (nach 15ms) wurde dann erneut die switch/case-Anweisung mit der neuen Variablen aufgerufen und etwas anderes wurde durchgeführt.


int a=0;
public void Bearbeiten(ref struct SPSein, ref struct SPSaus)
{
   switch (a)
      Case 0:
         //Mache was beim ersten Aufruf
         a=1;
         break;
      Case 1:
         //Mache was beim nächsten Aufruf
         ....

Hierbei verliert man aber irgendwann schnell den Überblick und auch die Durchlaufzeit wird immens hoch. Daher wollte ich nun mehrere Blöcke zusammenfassen.
Jetzt stehe ich aber vor dem folgenden Problem:
Der Methode Bearbeiten übergebe ich den Strukturen der SPS mit ref.


public void Bearbeiten(ref struct SPSein, ref struct SPSaus)
{
   SPSaus.motoran = 1
   // Warte kurz
   if (SPSein.motorläuft==1)
   {
      //hier kommt man beim ersten Aufruf nicht rein
   }
}

Scheinbar werden die Variablen in der struct erst nach dem Verlassen der Methode geändert und nicht sofort, oder irre ich mich da.
Gibt es eine andere Möglichkeit dies zu realisieren?
Vielen Dank für eure Hilfe.

24.08.2010 - 15:21 Uhr

Hallo nochmal,
erstmal vielen Dank für die Antworten und die Suchfunktion wie auch die vom Großen Goo habe ich auch schon oft verwendet.
Folgende Aufgabe:
Ich möchte ein Bild auf dem Bildschirm als Fenster finden. Hierfür benutze ich die Funktion FindWindow, diese gibt mir einen IntPtr zurück. Den übergebe ich der Funktion GetDC, welche mir wiederum einen IntPtr zurückgibt. Diese Funktionen habe ich mit Hilfe der Funktion "CreateCompatibleBitmap" sowie mit "BitBlt" überprüft. Dadurch erzeuge ich ein Bitmap des DCs.
Nun möchte ich das Bild Pixel für Pixel untersuchen und mit einem vorher abgespeichertem Bild vergleichen. Hierfür gibt es die Funktionen Get Pixel sowie GetR(G,B)Value.
Die Funktion GetPixel möchte aber einen IntPtr übergeben bekommen. Und hier liegt halt mein Problem, da ich nicht weiß, wie ich vom gespeichertem Bild den Pointer bekomme. In meiner Codesammlung habe ich von einem ehemaligem Bekannten den Code in C++ gefunden


HBITMAP hOneBmp = (HBITMAP)LoadImage(NULL, "H:\\Projekte\\explainbear\\Btn1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);//Eine Bitmap zum vergleichen laden
	hOneDC = ::CreateCompatibleDC(NULL);//DC vorbereiten
	SelectObject(hOneDC, hOneBmp);//Inhalt der Bitmap in den DC laden
	DeleteObject(hOneBmp);//Bitmap selber wird jetzt nicht mehr gebraucht

Ich programmiere aber in C#, vieleicht kann mir jemand helfen diesen Code auf C# zu ändern.
Vielen dank

23.08.2010 - 19:19 Uhr

Ich möchte mit Hilfe von GetPixel nach kleinen Bildern in größeren suchen und dafür benötige ich die Bilder in Form von DCs.
Gibt es denn in .Net dafür andere Funktionen?
Benutze VisualStudio 2008

23.08.2010 - 18:51 Uhr

Hallo Leute,
ich habe folgendes Problem,
ich möchte gerne eine Bilddatei (Bitmap) laden und dann als DC umwandeln.
Der Befehl den ich dafür gefunden habe ist "SelectObject"
Hier werden 2 IntPtr benötigt, also der Quellpointer und der Zielpointer.
Den Zielpointer erzeuge ich durch "CreateCompatibleDC"
Wie bekomme ich aber nun den Pointer der Bitmapdatei?
Vieleicht umweg über Image oder Graphic?
Vielen Dank

07.04.2008 - 14:45 Uhr

Hallo Leute folgenden Code habe ich geschrieben:

In der Programm.cs steht folgendes drinnen:

static void Main(string[] args) 
{ 
Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
if (args.Length == 0) 
Application.Run(new Analyser("")); 
else 
{ 
string file = args[0]; 
if (args[1] == "OpenDocument") 
{ 
Application.Run(new Analyser(file)); 
} 
} 
}  

Hier wird der Application der Filename mit string übergeben. Wird die Application direkt über die .exe gestartet, so wir ein leerer String übergeben.
Hier nun der Einsprung in die Application:

public Analyser(string datei) 
        { 
            InitializeComponent(); 
            start(); 
            if (datei != "") 
            { 
                open1(datei); 
            } 
        }  

Hier wird die Componente Initialisiert und der Programmcode start (Ein paar vordefinierte Zeichen für das Diagramm) ausgeführt. Wird nun kein leerer String übergeben, so startet nun noch die Funktion open1, an der der Dateiname übergeben wird.
In der Funktion open1 wird nun die Datei geöffnet und WErte ausgelesen. Am Ende dieser Funktion steht dann folgender Codeblock:

if (graphen[dateiname].a != 0 | graphen[dateiname].theta != 0 | graphen[dateiname].hkl != null) 
                    { 
Beugungslinien BL = new Beugungslinien(Convert.ToString(Spektrenname.SelectedItem), graphen[Convert.ToString(Spektrenname.SelectedItem)].a, graphen[Convert.ToString(Spektrenname.SelectedItem)].theta, graphen[Convert.ToString(Spektrenname.SelectedItem)].hkl); 
                            BL.hklanzeige += new Methode(hklanz); 
                            BL.Owner = this; 
                            BL.Show(); 
                            BL.hklberechnen(); 

                        }  

Hier wird nun abgefragt ob diese Datei schon einmal bearbeitet wurde, wenn ja (a,theta und hkl müssen vorhanden sein), dann öffnen Die Form Beugungslinien.

Dieser Code funktioniert einwandfrei, wenn das Programm über die .exe gestartet wird, bzw. wenn die Datei die geöffnet wird noch nicht bearbeitet wurde.

Wird nun eine Datei mit Doppelklick geöffnet, die schon einmal bearbeitet wurde, so erscheint weder die Mainform noch sonst eine.
Durch eine Fehlerabfrage, die nach einer weiteren Datei sucht (Diese habe ich zum Test einfach entfernt)weiß ich aber, dass der Code ausgeführt wird nur wird die Mainform einfach nicht geöffnet und dadurch können natürlich auch nicht die anderen Formen geöffnet werden (.Owner = this)

Hoffe ihr könnt mir helfen wo mein Fehler ist oder wie man den Code stoppen kann bis die Mainform geöffnet ist.

21.02.2008 - 11:24 Uhr

Hallo Leute,
ich schreibe gerade ein Programm welche smir Daten aus eine XML-Datei ausliest damit damit gearbeitet werden kann.
Dabei werden gewisse Daten zugeschrieben.
Ich benutze folgenden Code:

string markiert = Convert.ToString(Spektrenname.SelectedItem);
            XmlDocument doc = new XmlDocument();
            doc.Load(graphen[markiert].dateipfad);
            XmlElement elem = doc.CreateElement("Translationsverfahren");
            if (doc.InnerXml.Contains("Translationsverfahren") == false)
            {
                XmlNode root = doc.DocumentElement;
                root.InsertAfter(elem, root.LastChild);
            }
            // Elemente die gespeichert werden sollen mit nachfolgenden Werten
            XmlElement elem1 = doc.CreateElement("BravaisGitter");
            elem1.InnerText = graphen[markiert].hkl;
            elem.AppendChild(elem1);
            XmlElement elem2 = doc.CreateElement("Gitterkonstante");
            elem2.InnerText = Convert.ToString(graphen[markiert].a);
            elem.AppendChild(elem2);
            XmlElement elem3 = doc.CreateElement("Thetawinkel");
            elem3.InnerText = Convert.ToString(graphen[markiert].theta);
            elem.AppendChild(elem3);
            //Einstellungen zum Schreiben setzen
            XmlWriterSettings xWriteSett = new XmlWriterSettings();
            xWriteSett.Indent = true;
            xWriteSett.IndentChars = " ";
            xWriteSett.NewLineOnAttributes = true;
            xWriteSett.Encoding = Encoding.Default;
            XmlWriter xWriter = XmlWriter.Create(graphen[markiert].dateipfad, xWriteSett);
            //Zum Speichern des XmlDokument
            doc.Save(xWriter);
            xWriter.Close();

Die if-abfrage musste ich einsetzen, da mir sonst die gesamten Daten noch einmal unten angefügt wurden und sollte nur dazu dienen, dass wenn die neuen Daten noch nie zugefügt wurden, die Elemente ersteinmal erstellt werden.
Nun ist aber das Problem, dass beim weiteren speichervorgang die Daten wie beispielsweise "Gitterkonstante" nicht aktualisiert werden.
Woran liegt das, oder gibt es einen einfacheren Code für das speichern.
Vielen Dank im Vorraus.

30.10.2007 - 15:55 Uhr

Vielen Dank, hat super funktioniert.
Die eine Zeile war bei mir auch überflüssig uns wurde gelöscht.

15.09.2007 - 18:37 Uhr

Hallo,
Ich möchte ein Windowsprogramm schreiben in dem ein Diagramm mit Hilfe von ZedGraph angezeigt wird.
Meine Frage ist, wie kann ich dass Diagramm oder auch einzelne Textboxen in den anderen Klassen sichtbar machen. Habe es schon mit public ausprobiert, aber er findet es trotzdem nicht.
Kann mir einer helfen.
Vielen Dank

15.09.2007 - 18:12 Uhr

Hallo,
ich nutze ein NumericUpDown Element in denen der User bei Aufforderung Daten eintragen muss.
Da der Anwender auch per Tabulatortaste sich in die einzelnen Felder bewegen soll, soll dann der Wert des nächsten Feld markiert werden, damit der alte Wert gelösch wird und der neue eingetragen wird.
Leider finde ich keinen passenden Befehel dafür.
Vielen Dank

12.09.2007 - 10:30 Uhr

Wow, danke, das ging schnell.

12.09.2007 - 10:10 Uhr

Habe so ein änliches Problem.
Ich möchte Form2 von Form1 abhängig machen, Form2 soll aber solande sie offen ist im Vordergrund von Form1 sein, auch wenn Form1 aktiv ist. Form2 kann man selbsttändig schließen. Beim schließen oder minimieren von Form 1 soll auch Form2 geschlossen bzw minimiert werden.
Wie kann ich diese Abhängigkeit herstellen?

22.08.2007 - 15:24 Uhr

Hallo,

ich bin gerade dabei ein Programm zu schreiben, welches mir aus einer XML-Datei Daten auslesen soll und diese dann weiterverarbeitet.
Die Datei hat folgendes aussehen (kleiner Bereich, da die gesamte Datei über 5 Seiten geht)

<?xml version="1.0" encoding="WINDOWS-1252" standalone="yes"?> 
<TRTSpectrum> 
<RTHeader/> 
<ClassInstance Type="TRTSpectrum" Name="W_R_Fe_600s_39,6_KS_g.spx"> 
<TRTHeaderedClass> 
<TRTBase/> 
<ClassInstance Type="TRTSpectrumHardwareHeader"> 
<TRTKnownHeader> 
<TRTBase/> 
<Type>RTHardware</Type> 
<Size>137</Size> 
</TRTKnownHeader> 
<RealTime>556533</RealTime> 
<LifeTime>528680</LifeTime> 
<DeadTime>5</DeadTime>  

Meine Frage ist nun, ob ich Daten, die ich aus der Datei lese immer vorher deklarieren muss, oder ob es eine Funktion gibt, die das während des einlesens tut.
Bsp, ich klicke später einen Button und dieser zeigt mir dann die Reallife an, ohne dass ich diese irgendwo deklariert habe.
Ich hoffe, ich habe mich klar genug ausgedrückt.
Vielen Dank im voraus.

20.08.2007 - 10:52 Uhr

Also ich stand vor dem selben Problem und bei mir hat es nach der Änderung der Einstellung im Eigenschaftsfenster der Datei die ausgeführt werden soll:
InstallerClass = False
funktioniert.

01.08.2007 - 15:25 Uhr

Entweder ich verstehe dich nicht oder du mich.

ICh möchte gerne die Y2Achse festhalten, aber alles mit den in ZedGraph integrierten Funktionen beim Zoomen.
Da dachte ich, es gibt vieleicht eine Möglichkeit, diese zweite yAchse schon von vornherein festhalten ohne in den Bibliotheken rumspielen zu müssen.

Gruß Sparki

01.08.2007 - 14:32 Uhr

Hallo Leute,

ich möchte gerne meine Autosammlung in meinen Rechner eingeben.
Dazu möchte ich halt, Marke, Typ, Farbe,... eingeben und später abrufen können.
Ich selber Programmiere mit C# und kann halt die Grundlagen und ein wenig mehr.
Dachte mir an folgendes.


class Auto
{
string Marke;
string Typ;
string Farbe;
}

Damit erstelle ich dann die einzelnen Datensätze.
Mit Hilfe von "Hashtable" bzw. "Dictonary" kann ich diese ja dann auch wieder finden.
Mein Problem ist nur, wie speicher ich das ganze ab?
Hat einer einen Tip, welchen Befehl ich dafür verwenden muss, also wie ich alle Datensätze in eine Datei speichern kann.

Vielen Dank im Voraus.

Gruß Sparki

01.08.2007 - 14:24 Uhr

Hallo Leute,

ich bin gerade dabei einen Graphen zu erstellen, der mir verschiedene Messwerte über eine Zeit als Liniendiagramm darstellt.
Für eine weiter Auswertung werden noch zu bestimmten Zeiten sogenannte Sticks eingezeichnet (siehe Bild). Die Höhe der Sticks bestimmt eibne Wahrscheinlichkeitsrechnung und deshalb werden diese an der zweiten Achse (Y2Axis) angezeigt.

Mein Problem ist nun, ich möchte beim Zoomen diese zweite Achse festhalten können, also sie sollte nicht gezoomt werden.
Kennt da jemand eine Funktion und kann mir helfen.

Vielen Dank im Vorraus.

Gruß
Sparki

15.12.2006 - 11:15 Uhr

also hier ein Lösungsansatz. Ist bestimmt nicht der Beste, aber er funktioniert.


        // Erstellen eines neuen Graphen
        public void Kurvehinzufuegen(GraphPane Messdiag,string markiert, Dictionary<string,Funktionsgraph> graphen)
        {
            PointPairList liste;
            liste = graphen[markiert].liste;
            LineItem kurve = Messdiag.AddCurve(markiert, liste, Color.Empty, SymbolType.None);
            graphen[markiert].Zähler = Messdiag.CurveList.Count;          // Zähler = Anzahl der Kurven  
            string farbe = "blue";
            kurve.Color = Color.FromName(farbe);
        }

        // Löschen eines bestehendem Graphen
        public void Kurveloeschen(GraphPane Messdiag, string markiert, Dictionary<string,Funktionsgraph> graphen, Hashtable Diagramme)
        {
            int a = graphen[markiert].Zähler;
            Messdiag.CurveList.RemoveAt(a - 1);                             // löscht die Kurve
            graphen.Remove(markiert);                                       // löscht den Graph
            Diagramme.Remove(markiert);                                     // Löscht den Eintrag des Graphen aus der Hashtable
            foreach (DictionaryEntry dicentry in Diagramme)                 // Alle in Hasttable enthaltenen Einträge überprüfen
            {
                string entry = Convert.ToString(dicentry.Key);              
                int b = graphen[entry].Zähler;                              // Zähler raussuchen
                if (b > a)                                                  // Wenn Zähler größer als gelöschter Zähler
                {
                    graphen[entry].Zähler = b - 1;                          // Zähler - 1
                }
            } 
        }
namespace Translationsverfahren
{
    class Funktionsgraph
    {
        public int[] impulse;
        public double[] energie;
        public PointPairList liste = new PointPairList();
        public int Zähler;
    }
}

Beim erstellen einer Kurve wird die aktuelle Anzahl aller Graphen ausgelesen und in Zähler gespeichert.
Beim löschen wird nun der Graph mit dem Eintrag "markiert" gesucht, der Zähler gespeichertund alle angaben des Graphen gelöscht (Objekt, Zuweisung in der Hashtable und die Kurve im Diagramm). Danach werden die Zähler aller anderen Graphen überprüft und gegebenfalls um 1 vermindert.

15.12.2006 - 09:31 Uhr

Wenndu nur zwei Graphen hast, kannst du das mit RemoveAt(x) leicht machen. wobei x für den Graph steht.
Erstelle einfach 2 Buttons:
Den einen mit x=0 für den original Graphen (ersten Graphen den du zeichnest).
Den anderen mit x=1 für den veränderten (zweiten Graph den du zeichnest).

Weiss jemand, ob und wenn ja wo die einzelnen Graphen gespeichert werden und wie man diese Aufrufen kann? Bei "Add" gibt man ja einen Namen für den Graphen ein, über diesen Namen müsste man dann doch auch ans Objekt gelangen und so dieses speziell ändern können (Farbe,Symbole,löschen)
Hat einer eine Idee?

14.12.2006 - 11:35 Uhr

Danke, habe es hinbekommen,
Darf man gar keinem erzählen, was war, aber ich schiebe es mal auf die kurze Nacht.
Habe ausversehen das Dictionary durch kopieren neu erstellt, dadurch befindet sich natürlich kein Schlüssel in dem Ditionary.
Jetzt klappt alles wunderbar.
Danke nochmal

14.12.2006 - 10:48 Uhr

Gibt es denn eine möglichkeit während des Debugmodus einzusehen, ob, bzw welche Dictionary einträge erstellt werden, also sozusagen, ein Blick in den Speicher?
Ich speicher ja alles Dictionary einträge in eine Hashtable


Dias.Add(graphen[dateiname], dateiname);

Kann das sein, dass meine erste Zeile beim Graphen falsch ist?


Dictionary<string, Funktionsgraph> graphen =  new Dictionary<string, Funktionsgraph>();

Mich stört in diesem Kontex das new.

14.12.2006 - 10:34 Uhr

Bedeutet das, dass das Objekt nicht existiert.
Der Schlüssel bezieht sich doch auf den Name also in dem Fall markiert, oder?

14.12.2006 - 10:22 Uhr

Sorry, habe ich vergessen:

KeyNotFoundException wurde nicht behandelt:
Der angegebene Schlüssel war nich im Wörterbuch angegeben.
Dabei zeigt er auf die Zeile:


energie = graphen[markiert].energie;

14.12.2006 - 10:14 Uhr

[EDIT]Abgetrennt von Dictionary mit mehreren Werten?[/EDIT]

Habe auch gerade ein kleines Problme mit Dictionary.
Lese aus einer Datei verschiedene Sachen aus, die ich in einem Objekt Funktionsgraph speicher, das Objekt wird aber mit dem DAteinamen angesprochen,
Also:


Dictionary<string, Funktionsgraph> graphen = new Dictionary<string, Funktionsgraph>();
public ...
graphen.Add(dateiname, new Funktionsgraph());
...
graphen[dateiname].energie = energie;
...

Nun möchte ich diese Graphen in einer Textbox auswählen und anzeigen lassen. Um den Code übersichtlicher zu lassen, befindet sich der Code zum anzeigen in einer anderen Klasse (Datei).
Habe dort folgenden Code verwendet:


Dictionary<string, Funktionsgraph> graphen =  new Dictionary<string, Funktionsgraph>();
public void kurve (markiert)
{
 double[] energie;
 energie = graphen[markiert].energie;
 ...

markiert ist dabei der in der Textbox angeklickte Dateiname, den ich in einer hashtable gespeichert habe.
Leider zeigt er mir ein Problem beim ausführen des Programmes an.
Hat einer eine Idee, spreche ich das Objekt falsch an?
Bin relativ neu auf dem Gebiet.
Vielen Dank im Vorraus.