Laden...

Forenbeiträge von jeanfischer Ingesamt 39 Beiträge

26.08.2008 - 13:59 Uhr

Hallo zusammen,

vielen Dank für die Link. Mit dessen Hilfe habe ich es geschafft. Es ist aber nicht leicht zu verstehen für Anfänger. Daher meine Empfehlung für unerfahrene, lasst die Finger von einer solchen Idee. Alle anderen sollte das mal machen, man lernt doch eine Menge! Ist eine schöne Fingerübung. Ich habe allerdings darauf verzichtet allen neu zu schreiben und einfach die Beispieldateien includiert.

jeanfischer

25.08.2008 - 16:40 Uhr

Hallo zusammen,

ich möchte gerne mithilfe von C# Verknüpfungen von Dateien erstellen. Warum? Ganz einfach:
Ich benutze eine Anwendung, der man über die Eigenschaft "Ziel" im Reiter "Verknüpfungen" Attrribute übergeben kann. Da das ganze ziemlich kryptisch ist, hätte ich gern ein kleines Tool geschrieben, dass die Komplette Erstellung des Links (*.lnk Datei) übernimmt.
Wie kann man aber so einen Link erzeugen? Ich habe leider so weit nur Bsp. für VB gefunden, konnte die aber nicht auf C# ummünzen.

Vielen Dank für eure Hilfe!
jeanfischer

28.03.2008 - 11:51 Uhr

Hallo,
das mit dem Timer verstehe ich.
Der Thread ist noch da, die Anwedung aktualisert noch immer fleissig Daten.

28.03.2008 - 11:43 Uhr

Hallo JAck30lena,

OK, aber wie hält das den Thread an/beendet diesen und warum funktioniert Abort() nicht?

28.03.2008 - 11:15 Uhr

Hallo Ihr zwei,
es gibt keine Aufgabenstellung.
Ich lese Werte über die Serielle Schnittstelle ein. Alle 2,5s werte ich die Daten aus. Damit die Anwendung weiter läuft, habe ich das Auslesen in einen Thread verlagert, der sich alle 2,5s wieder von alleine startet (neben bei, die Zeit 2,5s ist frei gewählt). Über ein Delegate aktualisiere ich nun die Form-Elemente. Nun soll dieser Thread beendet werden wenn ich keine Daten mehr auslesen möchte und um es ganz sauber zu machen möchte ich lieber den Thread manuell beenden bevor ich die Anwendung schliesse.

Zu meinem Code. Ich habe mich wie gesagt entschlossen alle 2,5s daten auszulesen. Da ich nicht immer sagen kann wie lang das auslesen dauert stoppe ich die Zeit für das Auslesen der Daten. Diese ziehe ich wieder von den 2,5s ab, da die Zeit ja nun schon verstrichen ist. Der Thread schläft also weniger als 2,5s. (s. Code)

private void UpdateValuesThread()
        {
            object[] args = new Object[2];

            UpdateValuesDelegate GetValues = new UpdateValuesDelegate(UpdateStatusGui);

            TimeSpan abfragezeit = new TimeSpan(0, 0, 0, 2, 500);

            while ((Thread.CurrentThread.ThreadState & ThreadState.Running) == ThreadState.Running)
            {
                DateTime zeitStart = DateTime.Now;
                // Auslesen der Daten

                try
                {
                    this.Invoke(GetValues, args);
                }
                catch
                {
                    this.updateValues.Abort();
                    MessageBox.Show("Fehler bei 'Invoke'.");
                }

                DateTime zeitStop = DateTime.Now;

                TimeSpan deltaZeit = zeitStop - zeitStart;

                int vergleich = TimeSpan.Compare(deltaZeit, abfragezeit);

                if (vergleich < 0)
                {
                    Thread.Sleep(abfragezeit - deltaZeit);
                }
            }
        }

So, wie implementiere ich nun den von euch vorgeschlagenen Timer? Mein Timer wird lediglich dafür verwendet um zu einem genau definierten Zeitpunkt die Abfrage zu starten. Daher verstehe ich euren Ansatz nicht.

28.03.2008 - 09:08 Uhr

Hallo zusammen,
ich habe eine Windows Form Anwendung unter VS 2005 erstellt. Wenn der Benutzer einen Button drückt wird ein Thread gestartet. Dieser Thread aktualisiert alle 2,5s einige Form-Elemente. betätigt der Benutzer nun einen 2. Button. Soll dieser Thread wieder anhalten (und meinet-wegen das Thread Objekt gelöscht werden).

Hier mein Code zum starten des Threads:

private Thread updateValues;
updateValues = new Thread(new ThreadStart(UpdateValuesThread));
                        updateValues.IsBackground = true;
                        updateValues.Start();                        

Hier der Thread an sich:

while ((Thread.CurrentThread.ThreadState & ThreadState.Running) == ThreadState.Running)
{
//... Code ausführen

//Thread für ca. 2,5s anhalten:
Thread.Sleep(abfragezeit - deltaZeit);
}

Und nun meine Idee um den Thread zu stoppen:

this.updateValues.Abort();

Leider führt das zu einer ObjectDisposedException und ich verstehe nicht warum. Eigentlich üsste ich doch den Thread durch die Hauptanwendung beenden können, oder?

Vielen Dank für Eure Hilfe im Voraus!!!

30.08.2007 - 15:17 Uhr

Hast du es schon mit einem Cast versucht???

float Test = 25.75;
int zahl;

zahl = (int) Test;

Dies sollte die Nachkommastellen abschneiden.

29.08.2007 - 07:53 Uhr

Original von herbivore
einfach einen Timer verwenden. Wenn das andere Ereignis vorher auftritt den Timer stoppen.

Was meinst du damit?
Einen Timer aus System.Timers oder System.Threading?

28.08.2007 - 17:10 Uhr

Hallo winx,#

die gleiche Frage stelle ich mir gerade auch. Um das Problem zu lösen habe ich folgende Idee.

Eine Endlosschleife programmieren zB

do{
}while(true);

vor der Schelife die Zeit mit

DateTime start = DateTime.Now;

speichern.
In der Schleife bei jedem Durchlauf die aktuelle Zeit ermitteln

DateTime jetzt = DateTime.Now;

Nun die Differenz bilden

TimeSpan differenz = jetzt - start;

Nun überprüfen ob die DIFFERENZ grösser x sec. ist, wenn ja, break durchführen.

if (differenz.Seconds > x)
                        break;

Das ganze sollte das so aussehen:

const int x = 5;
                DateTime start = DateTime.Now;
                do
                {
                    DateTime jetzt = DateTime.Now;
                    TimeSpan differenz = jetzt - start;
                    if (differenz.Seconds > x)
                        break;

                    if (this.updateValues.ThreadState == ThreadState.WaitSleepJoin)
                        break;
                } while (true);

Ich bin selber von dem Code noch nicht überzeugt und halte ihn persönlich für äusserst ineffektiv. Endlosschleifen belasten den Prozessor quasi zu 100%. Aber eine andere Möglichkeit habe ich auch nicht.
Ich benötige diese art des nichtstun da in einer Multithread-Anwendung der Hintergrund-Thread "schlafen" muss bevor ich ihn beende, sonst gibt es Datensalat.
Würde mich auch freuen wenn jemand gute verbesserungsvorschläge hat.

19.07.2007 - 08:58 Uhr

Hallo Leute,

ich schreibe mit DrawString(string, Font, Brush, PointF) einen Text in eine Picturebox. Aufgrund des ausgewählten Fonts, kenn ich auch die Höhe des Textes. Aber wie bekomme ich die Breite? Müsste sich ja irgendwie herausfinden lassen, da der zu schreibende Text und der/die/das(???) Font bekannt ist. Kennt da jemand eine Funktion???

Vielen Dank im Voraus!

10.07.2007 - 09:45 Uhr

Sorry wenn das faul wirkt, aber ich wollte wissen ob es evtl. unterschiede gibt.

Trotzdem, Danke für die Hilfe. ch werde mal schauen ob es da ein paar Fussangeln gibt.

10.07.2007 - 09:20 Uhr

Hallo Forum,

ich würde gern ein Array vom Typ Label erstellen. Nun weiss ich aber leider gar nicht ob man nach demErstellen des Array auch noch einmal den Konstruktor aufrufen muss. Also bis jetzt habe ich folgendes:

Label[] labelArray = new Label[iArrayLaenge];

Muss jetzt auch noch folgendes ausgeführt werden:

for ( int i = 0; i < iArrayLaenge; i++)
labelArray [i] = new Label();

?(

Bei Label ist es ja recht unkritisch da es ja einen Standartkonstruktor hat, aber wie würde man das mit einem Konstruktor machen dem man Parameter übergeben muss???

Vielen Dank für eure Hilfe!

03.07.2007 - 15:23 Uhr

Hmm, so richtig fündig bin ich nicht geworden, oder es ist zu komplex für mich 😦

Eigentlich möchte ich ja auch nur eine simple kleine Klasse schreiben, die für sich kompilierbar ist und auf diverse dll's zugreifen kann. Von aussen greifen dann die GUI Anwendungen zu. Aber wenn das nicht so einfach geht, dann muss ich weiter die Forms verwenden.

03.07.2007 - 14:28 Uhr

Hallo Leute,

ich habe schon ein wenig mit Forms gearbeitet, finde diese aber auf Dauer ein wenig umständlich. Ich möchte lieber "Das Programm" und die grafische Oberfläche sauber trennen. Daher schweb mir eine Art Kernel vor, der dann von der GUI aufgerufen wird. Aber wie stellt man so etwas am besten an mit MS VS 2005 EE an?
Was sollte man für eine Projektart wählen?
Wie bindet man hinterher den 'Kernel' in die GUI ein?
Welche Überlegungen sollte man machen damit man hinterher Änderungen am Kernel vornehmen kann ohne die GUI Anwendung komplett neu schreiben zu müss?

Vielen Dank für Eure Antworten, Tipps und Ideen.

22.06.2007 - 11:51 Uhr

Hallo zusammen.

Original von Noodles
Hast Du schonmal in die Doku geschaut. Da sind doch ausführliche Beispiele für XmlReader.

jo, habe ich.

mir geht es nur darum, wie ich es schaffe ohne zu wissen wieviele Elemente vorhanden sind alle auszulesen.

while (reader.Read())
{
    string txt = reader.ReadElementString();
    counter++;
}

funktioniert bei mir nicht 🙁

evtl ist ja meine XML-Datei nicht i.o.

 <?xml version="1.0" encoding="utf-8" ?> 
<Freunde>
  <Kumpel>Hannes</Kumpel> 
  <Kumpel>Max</Kumpel> 
  <Kumpel>Moritz</Kumpel> 
</Freunde>

ich möchte einfach belibig viele Kumpel unten anfügen können, bis die Liste durch ist.

22.06.2007 - 00:06 Uhr

verwendetes Datenbanksystem: keine

Hallo Leute,

ich habe gerade erst angefangen mich mit XML zu beschäftigen und hab schon mein erstes Problem.
Ich habe unter einem Element (zB Test) eine unbekannte Anzahl an Unterelementen, die alle gleich heissen (zB Wert). Wie kann ich nun nur solange die XML datei auslesen bis ich am Ende des Knoten bin?

hier mein Code


int counter = 0;
do
{
    reader.ReadStartElement("Wert");
    counter++;    
    reader.ReadEndElement();
} while (???);

Vielen Dank für eine Antwort

21.06.2007 - 12:08 Uhr

Danke für die Antwort.

Aber ich scheine meine Frage nicht richtig gestellt zu haben. Wie mache ich dass denn nun das diese Werte global verfügbar sind?

Sollte ich ein neues namespace erzeugen und diese Werte dort definieren?

Bsp:

namespace MyDefines
{
    public const int Teufel 666;
}

und dann das Namespace durch using einbinden?

21.06.2007 - 11:24 Uhr

Moin Forum,

wie sieht es eigentlich in C# aus mit dem definieren von Werten?
In C/C++ würde ich eine Header-Datei erstellen in der ich einfach eine lange Liste an defines reinschreibe
#define Null 0
#define Etwas 23
#define Teufel 666
Jede Klasse die die Werte benötigen würde muss dann nur noch die Header-Datei laden.

Aber wie mancht man so etwas in C#?

Vielen Dank für eure Antworten/Lösungen!

20.06.2007 - 17:45 Uhr

Ach so, d.h. also dass ich zu dem was auch immer windows bei einem Click ausführ noch zusätzlich meinen Code in button1_Click ausführt.
Gut zu wissen!

Vielen Dank

20.06.2007 - 17:28 Uhr

Ist 'button1_Click' ein Standart Event welches man überschreiben kann???

(Sorry für den Edit vor deinem Post, müssen gleichzeitig geschrieben haben)

20.06.2007 - 17:18 Uhr

OK, vielen Dank.

aber nun tut sich die nächste Frage auf. Wie kann man da einen EventHandler daran bekommen? Das ganze soll ja dynamisch geschehen und bis jetzt hat mich keine Hilfe zu dem Thema weiter gebracht 🙁

Edit:
Hab da jetzt doch eine Lösung gefunden, hoffe die ist richtig.

public MainForm()
        {
            Button closeForm = new Button();

            closeForm.Text = "Schliessen";

            closeForm.Location = new Point(10, 10);

            closeForm.Click += new EventHandler(this.Button_Clicked);

            this.FindForm().Controls.Add(closeForm);

            InitializeComponent();
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            this.FindForm().Close();
        }
20.06.2007 - 16:44 Uhr

Hallo Leute,

ich probiere eine Windows Form so dynamisch wie möglich zu erstellen. Da ich damit nur mässigen Erfolg hatte habe ich zwei verschieden Ansätze verfolgt.1.Mithilfe von VS 2005 EE eine Grundform erstellen und dann alle benötigten Buttons manuell hinzufügen 1.Auch die Form durch manuellen Code erstellen

Zu 1.:
Die Form ist da, sehr schön, aber an welcher Stelle sollte ich meine Button erzeugen und auf der Form platzieren? Ich halte die Datei Form.Designer.cs dafür am geeignetsten, aber leider stweht an der 'richtigen' Stelle ein dicker Eintrag, dass man an der Stelle nichts ändern soll.

Zu 2.:
Ich habe ein leeres Projekt erzeugt und einfach nur eine *.cs Datei hinzugefügt. In diese habe ich folgenden Code geschrieben:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace DynGui001
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
           // Create a new instance of the form.
           Form form1 = new Form();
           // Create two buttons to use as the accept and cancel buttons.
           Button button1 = new Button ();
           Button button2 = new Button ();
          
           // Set the text of button1 to "OK".
           button1.Text = "OK";
           // Set the position of the button on the form.
           button1.Location = new Point (10, 10);
           // Set the text of button2 to "Cancel".
           button2.Text = "Cancel";
           // Set the position of the button based on the location of button1.
           button2.Location
              = new Point (button1.Left, button1.Height + button1.Top + 10);
           // Set the caption bar text of the form.   
           form1.Text = "My Dialog Box";
           // Display a help button on the form.
           form1.HelpButton = true;

           // Define the border style of the form to a dialog box.
           form1.FormBorderStyle = FormBorderStyle.FixedDialog;
           // Set the MaximizeBox to false to remove the maximize box.
           form1.MaximizeBox = false;
           // Set the MinimizeBox to false to remove the minimize box.
           form1.MinimizeBox = false;
           // Set the accept button of the form to button1.
           form1.AcceptButton = button1;
           // Set the cancel button of the form to button2.
           form1.CancelButton = button2;
           // Set the start position of the form to the center of the screen.
           form1.StartPosition = FormStartPosition.CenterScreen;
           
           // Add button1 to the form.
           form1.Controls.Add(button1);
           // Add button2 to the form.
           form1.Controls.Add(button2);
           
           // Display the form as a modal dialog box.
           form1.ShowDialog();

        }
    }
}

(Ist aus der MSDN kopiert)

Leider ist C# nicht in der Lage den Namespace Windows.Forms zu finden, daher kann die Anwendung nicht erstellt werden. Warum?

Vielen Dank für Eure Hilfe
Jean

04.06.2007 - 08:04 Uhr

Original von herbivore

(Hoffentlich versteht Ihr meinen Gedankengang...)
nein, nicht wirklich. 🙂

schlecht, also probiere ich das noch einmal anders zu erklären.

Also, ich kann mich noch an MFC Anwendungen erinnern bei denen das Setzen eines Wertes eines Steuerelements nicht sofort dargestellt worden ist (k.A. was das war...). Als Trick gab es dann die Möglichkeit einfach den Bildschirminhalt der Anwendung nach dem Ändern von Werten manuell als ungültig zu erklären, worauf Windows den Fensterinhalt neu gezeichnet hat.

Nun arbeite ich mit C#. Ich ändere einen Wert eines Steuerelements um genau zu sein ob das TabControl aktiv sein soll oder nicht. Um das zu realisieren habe ich der Form-Klasse eine Variable spendiert die beim konstruieren des Objektes auf false gesetzt wird. Hat der Anwender einen Button gedrückt so soll sich dieser Wert auf true ändern, das klappt auch!

Um nun zurück zu meinen MFC Erfahrungen zu kommen habe ich einfach probiert nach einem Klick auf den Button den Bildschirminhalt als ungültig zu erklären damit das TabControl neu gezeichnet wird, aber Pustekuchen, nix passiert.
Daher die Frage vieleicht zu erst, ist mein Lösungsansatz evtl falsch? wie würdet Ihr soetwas realisieren?

thx jean

03.06.2007 - 12:04 Uhr

Hallo Leute,

ich habe eine Windows Form mit einem TabContol über die MS VS C# EE erstellt. Der Form-Klasse habe ich eine bool Variable spendiert mit der man das TabControl de-/aktivieren können soll (über Enabled true/false).
Zusätzlich gibt es einen Button der die bool-Variable ändern soll um den Status des TabControls zu ändern.

Als Lösung habe ich mir folgendes vorgestellt:1.Der Form Konstruktor wird aufgerufen. 1.Die ItemDraw Methode vom TabControl überprüft ob das TabControl Enabled gemacht werden soll oder nicht. 1.Nach einem Klick auf den Button wird der Bildschirminhalt als ungültig erklärt (über Invalidate) und die ItemDraw-Methode sollte wieder aufgerufen.

(Hoffentlich versteht Ihr meinen Gedankengang...)

Nun mein Problem:
Scheinbar wird nach der Konstruktion des Form-Objektes die DrawItem-Methode gar nicht aufgerufen. Der Debugger läuft nie dort rein. Ist das überhaupt richtig ItemDraw zu verwenden oder gibt es für solche Sachen besser geeignete Ereignisse?

Vielen Dank im Voraus
Jean

07.05.2007 - 15:36 Uhr

😄Ich Idiot!

Jetzt verstehe ich was Ihr mir sagen wollt! Wenn dummheit weh tun würde müsste ich wohl schreien. Das ist mir jetzt echt peinlich 8o

Ich habe jetzt einfach in der TextChanged Nachricht den Methodenaufruf eingeführt. Mehr muss man gar nicht machen!

Ich dachte immer man muss die Methode an sich überschreiben...

Vielen Dank für Eure Geduld! 😁

07.05.2007 - 13:20 Uhr

Hmm dann bin ich wohl doch blind oder die IDE von MS ist einfach nur schlecht.
Also ich finde zwar in der Hilfe von der TextBox was zu dem Thema ScrollToCaret() aber nirgends eine möglichkeit damit zu arbeiten. Oder gibt es einige Methoden und Ereignisse die in der Express Edition nicht zur Verfügung stehen?

Kann natürlich auch an einem Mega Bug liegen, denn trotz abarbeiten der Hilfe hab ich es bis heute noch nicht geschafft die Zeilennummerierung zu aktivieren, da es den Menüpunkt nicht git der beschrieben wird. Des Weiteren hat sich die Toolbox gerade verabschieded... Na die konnte ich zum Glück unter Ansicht wiederfinden...

Jean

PS: Bin also noch immer nicht schlauer 🙁

07.05.2007 - 12:58 Uhr

Hey jan223,

vielen Dank für den Tipp, hab auch etwas vielversprechendes gefunden. Leider finde ich das Ereigniss "ScrollToCaret()" nicht im Eigenschaften-Feld von VS C# 2005. Muss man das Ereignis manuell einfügen?
Hab einfach die Textbox angeklickt und bin dann das komplette Eigenschaften-Fenster durch (Nachrichten und Eigenschaften). Habs aber immer übersehen. Bin ich blind?

PS:
Die Hilfe sagt dazu TextBoxBase, ist das die Vaterklasse von der TextBox Vererbt wurde?

Jean

07.05.2007 - 12:09 Uhr

Hey Leute,

ich suche eine Möglichkeit wie man eine TextBox automatisch runterscrollen kann.

Über die Serielle Schnittstelle lese ich Werte ein und schreibe diese in eine TextBox. Nach einer Weile ist sie so voll, dass der Text der unten hinzugefügt wird verschwindet und der Scrollbalken immer größer wird. Wenn ich nun den Scrollbalken herunter ziehe fährt er automatisch beim befüllen der nächsten Zeile wieder hoch. Ich möchte aber dass der Balken, wenn er denn da ist, immer unten ist, und man imer die aktuelle Zeile lesen kann.

Welches Ereignis der TextBox muss ich dafür bearbeiten? Hab keins finden können das auf Veränderungen des Scrollbalkens reagiert. Und welchen Wert müsste ich dann setzen, damit der Balken nach unten fährt?

Vielen Dank im Voraus
Jean

02.05.2007 - 16:25 Uhr

Original von winSharp93
Bist du dir sicher, dass das:
1.9092.762.993

und nicht:
1.092.762.993

heißt?

Sorry, du hast recht. Tippfehler.
Der Wert lautet: 1.092.762.993.

@winSharp93:
Sorry ich verstehe deinen Code nicht ganz. Was ist stelle? Anzahl der Nachkommastellen? Die weiß ich nämlich nicht. Ich hatte gehoft das ein Real so aufgebaut ist, dass man sagen kann, 2Byte für die Vorkommastelle und zwei für die Nachkomma...
Lieg ich da falsch?

02.05.2007 - 14:49 Uhr

Hallo Leute,
ich habe zwei ushort Werte in einem Array (Eindiminsinal, zwei Felder). Macht also 2 * 16 bit. Diese 32 Bit ergeben zusammen ein Float-Wert (alles Binär gesehen).
Wie kann man nun also die beiden ushort zu einem Float zusammensetzen? BitArray will nicht da es keine Int Werte sind. Ausserdem müsste das auch das Ergebnis verfälschen, da Int 32 Bit hat.

Hier ein kleines Beispiel:
===============
ushort[0] = (dez) 15729 (bin: 0011 1101 0111 0001)
ushort[1] = (dez) 16674 (bin: 0100 0001 0010 0010)

Float sollte also folgendes sein:
bin: 0100 0001 0010 0010 0011 1101 0111 0001
dez: 1.9092.762.993
oder?

Nun das ganze "nur noch" konvertieren. Aber wie?

Achso, die gesamte Zahl habe ich wie folgt zusammen gebastelt:

int i = ushortArray[1];
i = i << 16;
i = i | ushortArray[0];
02.05.2007 - 14:10 Uhr

Original von gn0m0r
Hallo jeanfischer,

geh mal in den Design-View deines Forms. Dort markierst du dein Form und gehst auf den Reiter "Eigenschaften". Hier siehst du in der obersten Zeile mehrere Buttons, mit denen du die Ansicht umschalten kannst. Hier gehst du auf den Blitz (Events). Anschließend solltest du eine Übersicht über alle Events zu sehen bekommen, die das Form hat. Wenn du jetzt hier einen Doppelklick in das Feld neben dem Closed-Event machst, wird dir dein entsprechender Event-Handler angelegt.

Gruß,
Bastian

Zu dumm. da haber ich eigentlich schon geschaut gehabt, aber nun ist der Eintrag da... heißt allerdings FormClosed

Vielen Dank euch allen
Jean

02.05.2007 - 13:35 Uhr

Original von herbivore
In der Form-Klasse und entsprechend in allen Unterklassen von Form.

Ich bin zu blöd! Wo finde ich das in der Visual C# Express Edition? Ich kann mir die Dateien anzeigen lassen eines Projektes, aber die Klassen finde ich nicht!

02.05.2007 - 11:35 Uhr

Ersteinmal vielen Dank.

_Original von herbivore_Closed und Closing gibt es auch in .NET 2.0. Die neue Ereignisse heißen: FormClosed und FormClosing.

Wo finde ich denn die beiden Ereignisse?

_Original von herbivore_Diese braucht man jedoch nur, wenn man die zusätzlichen Member aus den FormClosed/ClosingEventArgs benötigt.

Das verstehe ich nicht. Meine Serieller Port ist ein Member der Klasse. Wenn ich also die Form schließe sollte ich den doch schon beenden, oder? Hab halt angst dass die Anwendung den Port nicht ordentlich schließt unds dann keine andere Anwendung mehr auf den COM-Port zugreifen kann.

02.05.2007 - 11:18 Uhr

Hallo Leute,

ich habe eine Windows.Forms-Anwendung geschrieben. Da diese auf die Serielle-Schnittstelle zugreift möchte ich unbedingt vor dem Beenden der Anwendung die Serielleschnittstelle schliessen, damit evtl. andere Programme daruaf zugreifen können. In einem schlauien Buch das ich habe werden dafür die Ereignisse Close() und Closing() vorgeschlagen. Dem Buch nach zu urteilen wäre wohle Close besser. Aber wie/wo finde ich das Ereignis? Wenn ich die Form im Designer auswähle erscheint weder Close noch Closing bei den Nachrichten.

Kann mir jemand sagen in welche Nachricht ich das schließen schreiben soll und wie ich das Ereignis abfangen kann?

Vielen Dank
Jean

01.05.2007 - 15:34 Uhr

Jo vielen Dank, genau das habe ich gesucht!

Jean

01.05.2007 - 15:10 Uhr

Hallo Leute,

ich bin gerade auf C# umgestiegen und hab mal eine weile mit Visual C++ gearbeiten. Dort gab es so etwas wie Standarddialoge also nicht nur zum Öffnen und Speichern von Dateien, sondern auch ganz einfache die nur zum Ausgeben von Hinweisen waren. Man konnte angeben welcher Text angezeigt werden soll und ob auch ein Systemsysmbol eingeblendet werden soll. zusätzlich konnte man angeben welche Buttons dargestellt werden sollten (Ignorieren, Abbrechen, OK...). Natürlich konnte man auch abfragen welchen Button der Benutzer gedrückt hat.

Gibt es solche Dialoge in C# auch?

Jean

01.05.2007 - 14:29 Uhr

Danke für die Antwort, genau das wollte ich wissen!

Euch noch ein sonnigen Feiertag!

01.05.2007 - 13:56 Uhr

Ahh vielen Dank, jetzt klapt es!

Aber wie sieht es aus mit dem Konstruktor von SerialPort? Dort muss man den Protnamen mitangeben, aber ich möchte ja das der benutzer ersteinmal angibt an welchem Port das Gerät angeschlossen ist. Erzeugt

public SerialPort port;

schon das Objekt oder nur die Refernz?
Wenn das nur die referenz ist kann man ja einfach später das Objekt erzeugen, also alles kein Problem.

Kann man eigentlich in C# überprüfen ob an der Referenz ein Objekt höngt? Bei C++ hätte ich das mit nem Pointer gemacht der ja dann NULL sein müsste wenn da nichts ist.

01.05.2007 - 12:41 Uhr

Hallo Leute,

ich habe ein kleines Problem bei der Verwendung der Klasse SerialPort. Da es in meinem Programm nur eine Verbindung mit der Seriellenschnittstelle geben darf, habe ich mir überlegt die Verbindung mit der Seriellenschnittstelle als Member der Haupklasse anzulegen. Dafür habe ich mir folgenden Code ausgedacht:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;

namespace TestAnwendung
{
   public SerialPort port;

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Dann bekomme ich aber den Fehler:

Klasse, Delegat, Enumeration, Schnittstelle oder struktur erwartet

für die Zeile public SerialPort port;

Ich habe ein anderes Beispiel wo auch die Serielleschnittstelle verwendet wird, dort wird sie wie folgt aufgerufen:

using System;
using System.IO.Ports;

namespace ConsoleApplication2
{
	class Program
	{
		static void Main(string[] args)
		{
			using (SerialPort port = new SerialPort("COM1"))
			{
				// configure serial port
				port.BaudRate = 9600;
				port.DataBits = 8;
				port.Parity = Parity.None;
				port.StopBits = StopBits.One;
				port.Open();

			}
		}
	}
}

... also mit using. Das verstehe ich aber leider nicht ganz. Kann mir jemand erklären wo der Fehler in meiner idee ist und was ich verbessern muss?

Als kleine Zusatzinfo, ich bin blutiger C#-Anfänger, hab mich aber schon erfolgreich durch Java und C++ geschlagen.