Laden...
Avatar #avatar-2603.jpg
Dr.Z myCSharp.de - Member
Fachinformatiker Nettetal Dabei seit 07.12.2007 88 Beiträge
Benutzerbeschreibung

Forenbeiträge von Dr.Z Ingesamt 88 Beiträge

29.05.2008 - 16:11 Uhr

Hi,

da hatte ich dich dan wohl falsch verstanden. Wo holt sich das Programm denn die Liste der möglichen Sprachen her? Und wovon ist es abhängig, welche Sprachen nun in der Liste angezeigt werden sollen?

Dr. Z

28.05.2008 - 15:37 Uhr

Vllt kannst du die Systemvariablen auslesen und dir die dort gefundene Sprache anzeigen lassen.
Eine Systemvariable heißt "LANG" und da steht das Länderkürzel hinter. Diese Sprache sollte der User doch beherschen und diese könntest du dann in deinem Programm nutzen?!

Viele Grüße

Dr.Z

28.05.2008 - 12:34 Uhr

Hi,

ich habs mal versucht zu programmieren, das ist bei rausgekommen. Ist nicht besonders originell, aber ich finde, dass es funktioniert. vllt meintest du was völlig anderes und wir haben eigentlich komplett aneinander vorbei geredet.
Hier mal meine Lösung zum Sortieren von nem zweidimensionalen Array:

            
string[,] Liste = new string[,] { { "c", "3", "cx" }, { "b", "2", "by" }, {"a", "1", "az"} };
            string[] Sortieren = new string[3];

            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    Sortieren[j] = Liste[j, i];
                }

                Array.Sort(Sortieren);

                for (int k = 0; k < 3; k++)
                {
                    Liste[k, i] = Sortieren[k];
                }

            }

Vorher sieht das Array so aus:
c; 3; cx;
b; 2; by;
a; 1; az;

Nachher dann so:
a; 1; az;
b; 2; by;
c; 3; cx

Bei deiner nächsten Frage kann ich dir leider nicht helfenn, hab da leider total keine Ahnung von

27.05.2008 - 15:12 Uhr

Vllt nicht die Beste Idee,

aber wie wäre es, wenn du jede Spalte des Ausgangs-Arrays in ein eigenens Sortier-Array mit nur einer Spalte kopierst, dieses dann sortiertst und schließlich wieder in die entsprechende Spalte deines Ausgangs-Arrays schreibst?

Dr. Z

27.05.2008 - 13:18 Uhr

Color.FromArgb(IntegerWert);

Dr. Z

16.05.2008 - 09:14 Uhr

Hallo nochmal

Danke für eure hilfreichen und sehr guten Antworten 🙂

Damit hat sich meine Frage auch schon erledigt und ich hab wieder was gelernt.

Danke nochmals

Dr.Z

16.05.2008 - 08:00 Uhr

Hallo zusammen,

ich hab die Forumssuche benutzt, hab aber nicht das gefunden, was ich gesucht habe, weil ich auch nicht genau wusste, nach welchem Suchbegriff ich zu suchen habe.
Also für den Fall, dass es schon so ein Thema gibt, einfach eben drauf verweisen.

Also, wenn man mit Standard .net Klassen Arbeitet und man sich durch einen .(Punkt) nach dem Klassennamen die Eigenschaften / Methoden anzeigen lässt, enthält man immer kurze Informationen über die Eigenschaft oder Methode:
Bei Eigenschaften: Typ und Name + eine kurze Beschreibung der Funktion
Bei Methoden: Rückgabetyp, Name und in Klammern die erwarteten Übergabewerte + eine kurze Beschreibung der Funktion.

Erstellt man eigene Klassen so werden auch Typ und Name bei Eigenschaften bzw. Rückgabetyp, Name und die zu erwartenden Übergabewerte angezeigt. Jedoch ist kein kurzer Informationstext vorhanden.

siehe Anhang

Meine Frage ist nun, ob es möglich ist dieses Informationstext zusätzlich zu den "Standardinformationen" zu integrieren und wenn ja, wie?

Danke schonmal für eure Hilfe

Dr.Z

15.04.2008 - 13:49 Uhr

Hallo zusammen,

habe mal wieder ein Problem zu dem ich noch keine Lösung gefunden habe.
Ich habe ein paar TabPages mit checkboxen. Nun möchte ich überprüfen, welche Kombination von Checkboxen beim verlassen derTabPage aktiviert ist. Ist eine falsche checkbox aktiviert, soll diese TabPage nicht verlassen werden. Leider funktioniert das nicht so, weil sobald ich auf eine andere TabPage klicke, wird zwar die Prüfung bei LeaveTabPage durchlaufen, nur kann weiß ich nicht zu verhindern, dass die vorher ausgewählte TabPAge aktiviert wird.

Habt ihr da eine Idee, wie ich das realisieren könnte?

Vielen Dank für eure Hilfe

Dr.Z

12.03.2008 - 11:19 Uhr

lol 🙂

Da könnte man ja auch irgendwie alleine drauf kommen.
Danke dir trotzdem 🙂

Dr. Z

12.03.2008 - 10:38 Uhr

Hallo, habe jetzt auch dieses Problem.

Habe in meiner Klasse eine private Variable

private int wert;

, die ich mittels


public int pwert
{
set { wert= value; }
get { return pwert; }
}

setzen, bzw. zurückgeben möchte. Nur bekomm ich auch die "Endlosschleife". Aber wie kann ich das Problem denn dann umgehen?Würde mich über eure Hilfe freuen.

Dr. Z

11.03.2008 - 12:57 Uhr

Hallo Jürgen.

Genau das war der nötige Tipp.
Jetzt wo ich das DockStyle auf Fill gesetzt habe, klappt es.
Danke euch für eure Hilfe 🙂
Ihr seit echt Spitze 👍

Dr. Z

11.03.2008 - 12:06 Uhr

Hallo Jürgen,

danke für deine Antwort. So wie du das darstelltst, mache ich es auch. Bzw. hatte es vor, dies so zu machen.

Das Panel habe ich soweit erstellt. Einfach die entsprechenden Steuereleente im Oberflächengestalter zusammengepackt.
Das ganze heißt dann panel1.

Nun versuche ich beim aktivieren einer TabPage das Panel dementsprechend anzeigen zu lassen:


private void tabPage2_Enter(object sender, EventArgs e)
        {
            tabControl1.SelectedTab = tabPage2;
            tabControl1.SelectedTab.Controls.Add(panel1);
        }

Beim Verlassen des Tabs, ist auch klar, entnehme ich dem Tab das Panel wieder:


        private void tabPage2_Leave(object sender, EventArgs e)
        {
            tabControl1.SelectedTab.Controls.Remove(panel1);
        }

Nur seh ich dann auf dem entsprechenden Tabs nichts.
Habe auch wie herbivore in seiner Antwort panel1.Parent = tabControl1.SelectedPage gesetzt.

Aber auch das funktioniert nicht 🙂

11.03.2008 - 10:29 Uhr

hi,

hoffe ich kann dir Helfen.

Schreibe dir doch eine eigene Funktion, die aus dem String ein Char-Array macht. Anschließend durchläufst du das CharArray so lange, wie du kein " findest. Findest du ein " speicherst du alle Zeichen des CharArray meinetwegen in ein string-Array. Aschließend schneidest du alle Zeichen inklusvie dem gefunden " ab und beginnst die Suche vom neuen.

Denke so oder so ähnlich sollte es funktionieren, oder hab ich was falsch verstanden?

Dr.Z

11.03.2008 - 09:56 Uhr

Ok, ich gucks mir an. 🙂
aber ich find die Sache mit den Tabs gut 🙂

Edit:
Alles klar, hab mir mal das Video dazu angeguckt.

  1. Bin ich mir nicht sicher, ob ich wirklich das brauche.
  2. Das liegt bestimmt daran, dass ich das nicht realisiert bekomme 😉
    Bin eher en noob in C# 🙂 und versuche mich erstmal mit kleinen Verbesserungschritten voran zu arbeiten. Daher auch von 1720 Steuerelementen auf 120 Steuerelemente und diese dann in jedem Tab anzeigen lassen 🙂

Also, hast du ne Idee, wie ich das realisieren könnte? 😉

Vllt, aber wirklich nur vllt, komme ich auf die Sache mit der DB wieder zu sprechen, wenn ich mein jetziges Ziel erreicht habe und es mal wieder daran geht, das Programm zu verändern und es sich bietet, den ganzen alten Kram mal übern haufen zu werfen 🙂
Sche... auf Termine und fristen 😉
Ich als Azubi (und dann auch noch für Systemintegration 😄) hab alle Freiheiten der Welt 🙂

11.03.2008 - 09:43 Uhr

Wohin ich drifte, weiß ich selber noch nicht so ganz 🙂

Ich müsste jetzt erst mal die Sache mit einem Panel und den 17 TabgPages auf die Reihe bekommen. Habt ihr da noch nen Hinweis, wie ich das Panel auf dam entsprechenden Tab sichtbar mache? Die eingeistellten Daten im Programm zu behalten sollte dann nicht das Problem sein. Auch später das Speichern nicht.

Wäre dankbar für ne Hilfe in die Richtung 🙂

Dr.Z

11.03.2008 - 07:50 Uhr

Das hört sich alles sehr interessant an 🙂

Muss jetzt erstmal die Sache mit der Oberfläche hinbekommen und dem Druchschalten der einzelnen TabPages, dem damit verbundenen Anzeigen des Panels (hab och noch nicht ganz so raus) und dem Speichern der Werte in meiner Instanz der Klasse. (das sollte nicht das Problem sein 🙂

Danach gehts dann erstmal ans Speichern 🙂 aber für weitere Anregungen, Anmerkungen und Vorschläge bin ich offen.

Dr. Z

Edit: HAt noch jemand nen Tipp, wie ich das Panel mit den Steuerelemeten immer auf dem entsprechenden (ausgewählten) Tab sichtbar mache?
Irgendwie will das nicht so ganz klappen 🙂

11.03.2008 - 06:52 Uhr

Hi,

ich habe eine Konfigurationsoberfläche für ein Programm. Darin befindet sich ein TabControl mit 17 TabPages. AUf jeder TabPage befinden sich immer wieder die gleichen Einstellungsmöglichkeiten.
Deshalb 17 * 20 🙂
Dass das Unmengen an Steuerelementen sind, ist mir auch schon aufgefallen. Daher wollte ich das ganze auf nur eine Steuerelementgruppe mit 20 Steuerelementen reduzieren.

Aber danke für deinen Hinweis, der hat mich auf eine Idee gebracht. Die Einstellungen müssen auch nach dem Schließen des Programms gespeichert werden. Bisher mache ich das in eine XML-Datei. Ist auch irgendwie nicht so das Gelbe vom ein.
Nun kommt deine Idee ins Spiel. Wie siehts aus mit ner kleinen Datenbank? bzw nur eine Tabelle 🙂 Hier kann ich doch alle Änderungen reinspeichern. Auch nach dem schließen meines Programms hab ich alles schön sortiert und fein an seinem Platz.
Zusätzlich könnte ich ja noch weitere Informationen zur entsprechenden TabPage speichern.

Also, da muss ich mich dann auch nochmal mit auseinader setzen.
Vielenk Dank für Deine Idee 🙂
Wie das im einzelnen mit der Einzelblatt-Ansicht und dem Databinding funktioniert, weiß ich noch nicht, werde micha ber mal drum kümmern

Danke nochmal für den Tipp 👍

Dr. Z

07.03.2008 - 12:07 Uhr

Das dauert doch wirklich nicht schlange das zu programmieren, oder?
Anstatt den Beitrag hätte man auch eben die 5 Zeilen programmieren können 🙂

Um aber auf deine Frage zu sprechen zu kommen:
Ich wüsste nicht, dass es sowas gibt 🙂

07.03.2008 - 11:33 Uhr

Ich glaub ich hab verstanden wie ihr das meint 🙂
1 Klasse
20 Properties

17 mal diese Klasse instanzieren
Jede Instanz gehört zu einem TabControl (insgesamt 17) und nimmt die Werte davon entgegen

1 Panel mit 20 Steuerelementen, das immer nur auf dem aktuell geöffneten Tabcontrol angezeigt wird.

So, das werde ich mir nun realiseren. Vielen Dank für eure Hilfe, wenn ihr noch Anmerkungen, Verbesserungsvorschläge oder sonstiges habt, immer her damit, kann nicht schaden.

Echt Klasse eure Hilfe 👍 und nochmal vielen Dank

Dr. Z

07.03.2008 - 11:12 Uhr

Dann hätte ich doch eine Klasse mit allen 17 * 20 Steuerelementen als jeweilige Eigenschaft oder ich mach mir 17 Klassen, die alle den gleichen Inhalt haben und instanziere diese 20 mal.
aus meiner Sicht ist da ein Array mit 17 * 20 Elementen auf den ersten Anblick angenehmer.
Aber vllt hast du recht. Wenn ich mal viele viele Schritte weiter denke, könnte sich "die Mehrarbeit" evtl später lohnen.

Nur nehme ich dann eine Klasse oder lieber 20?

07.03.2008 - 10:55 Uhr

Hallo und vielen Dank für die Antworten.

Die haben mir sehr geholfen und habe wieder ne Menge gelernt, aber auch mal wieder den Wald vor lauter Bäumen nicht gesehen 🙂

So wie ich es mir jetzt denke ist die Methode von herbivore die einfachste / leichteste / schnellste. Ich zeige immer nur im ausgewählten Tabstop das Panel an und schreibe die Werte meiner Steuerelemente beim verlassen dieses TabStopps in mein Werte-Array zur weiteren Verarbeitung.

Vielen Dank nochmal für eure Hilfe. 👍

Viele Grüße
Dr. Z

07.03.2008 - 08:17 Uhr

Hallo zusammen,

Habe eine Oberlfläche mit einem TabControl. Das TabControl enthält 17 TabPages. Auf jeder Seite kommen immer wieder die gleichen 20 Steuerelemente vor. Das alles über den Desinger zu erstellen und so ist zwar geglückt, aber jetzt beim erstellen einer neuen Version des Programms habe ich ich mir gedacht, dass das auch anders machbar sein muss.
Also: Steuerelemente dynamisch erzeugen. Klappt Prima. Wieder habe ich das Progrblem, dass ich dann 17 * 20 Steuerelemente programmieren müsste. Ist auch irgendwie nicht so das Gelbe vom Ei.
Also habe ich mal weitergedacht und bin auf die Idee gekommen, mir ein Control-Array zu erstellen, in dem ich alle Steuerlemente (also nur einmal 20 Stück) generiere und speicher.
Bei jedem Aufruf einer TabPage des TabControls adde ich mittels einer For-Schleife und this.TabPageXYZ.Control.Add(Steuerelement) die Steuerelemente in die Form und mache diese somit sichtbar.
Auch das klappt.
Ändere ich nun die Werte der Steuerlemente, z.b. eine Checkbox wird markiert, ein Text wird geändert usw. möchte ich diese Werte beim verlassen der TabPage in ein zweites Array speichern.
Ich habe mir gedacht, ich kann so vorgehen:


        Control[] Steuerelemente = new Control[3];
        string[,] WerteVonSte = new string[2, 3];

        private void Form1_Load(object sender, EventArgs e)
        {
            Button btn1 = new Button();
            btn1.Left = 25;
            btn1.Top = 25;
            Steuerelemente[0] = btn1;
            
            CheckBox chb = new CheckBox();
            chb.Left = 25;
            chb.Top = btn1.Top + btn1.Height + 25;
            chb.Text = "Markier mich";
            Steuerelemente[1] = chb;

            NumericUpDown nud = new NumericUpDown();
            nud.Left = 25;
            nud.Top = chb.Top + chb.Height + 25;
            nud.Value = 100;
            Steuerelemente[2] = nud;
        }

Das funktioniert bestens.
Zum Speichern der Werte wollte ich dann folgendes machen:


private void tabPage2_Leave(object sender, EventArgs e)
        {
            WerteVonSte[1, 0] = Steuerelemente[0].Name;
            WerteVonSte[1, 1] = Steuerelemente[1].Checked;
            WerteVonSte[1, 2] = Steuerelemente[2].Value;
        }

Leider geht das nicht, denn über Steuerlemente[index].Eigenschaft bekomme ich nicht alle Eigenschaften die die von mir zugewiesenen Steuerelemente besitzen. So kann ich über Steuerelemente[1] z.B nicht die Eigenschaft .Checked der Checkbox, die an dieser Position liegt, abrufen.

Habt ihr da ne Idee, wie ich da weiter kommen, bzw. wo das Problem/Fehler/Grund/Ursache liegt?

Vielen Dank für eure Hilfe.

Dr. Z

13.02.2008 - 14:59 Uhr

Danke für deine Antwort, diese war sehr hilfreich und verständlich. 👍
Mal gucken wie ich mein Problem nun lösen werde, habe ja jetzt mehrere Methode, wie man es machen kann.

Danke dir nochmals.

Eine allgemeine Frage zum verlinkten Artikel hätte ich noch:
Es kommt eine Zeile wie folgt im Quellcode vor:

RoBitmap robmp = new RoBitmap();

Ich finde die Klasse RoBitmap nirgends. Finde nur die Standard "Bitmap".
Kann mir da noch jemand weiter helfen?

Danke euch.

Dr. Z

13.02.2008 - 13:16 Uhr

Danke für den sehr interessanten Link. Damit kann ich auf jedenfall was anfangen und werde es auch versuchen umszusetzen. 👍

Jedoch sind meine Fragen noch nicht damit beantwortet, so richtig 🙂

...warum entsteht ein so ein großer Zeitunterschied beim Suchen von bestimmten Punkten zum einen in einem Array und zum anderen in einem Image. Letztendlich sind die Pixel der Bitmap doch auch nichts anderes als ein zwei dimensionales Array?

Vielen Dank

Z

13.02.2008 - 07:28 Uhr

Hallo zusammen,

ich beschäftige mich momentan mit dem Zeichnen in c#. Ich will nichts aufwendiges machen, sondern nur verschiedene Zahlen und Buchstaben malen und bestimmte Punkte zu lokaliseren (höchster gemalter Punkt, tiefster gemalter Punkt usw...).

Jetzt gibt es ja zwei Möglichkeiten zu Zeichen:

  1. in das Form an sich.
  2. in das Image einer PictureBox.

Ich wusste nicht, wie ich in der Form an die bemalten Pixel heran kommen sollte. Also habe ich zusätzlich ein zweidimensionales bool Array erstellt, welches die Maße der Form hat und jedes Element, in das auf der oberfläche Zeichne, auf true gesetzt. Um nun nachher die oben genannten Punkte zu lokalisieren, durchsuche ich einfach nur das Array nach bestimmten Kriterien. Das klappt auch ganz gut und geht sehr schnell.

Um in der PicureBox, bzw. dem Image der PictureBox an die Pixel zu gelangen, die ich "bemalt" habe, gehe ich wie folgt vor:


for (int y = 0; y <= bmp.Height - 1; y++)
            {
                for (int x = bmp.Width; x >= 0; x--)
                {
                    col_pixel = bmp.GetPixel(x, y);

                    if (col_pixel.Name != "0")
                    {
                        pnt_oben.X = x;
                        pnt_oben.Y = y;
                        bol_pixelfound = true;
                        break;
                    }
                }

                if (bol_pixelfound == true)
                {
                    break;
                }
            }

bmp ist das Image der PictureBox und eine Instanz der Klasse Bitmap.
Ich frage halt jedes Pixel ab, ob es schwarz ist oder nicht. Da gibts bestimmt noch ne bessere Lösungsmöglichkeit, habe aber erstmal keine gefunden, so als Laie.
Auch mit dieser Methode lassen sich meine Punkte (höchster gemalter Punkt, tiefster gemalter Punkt usw...) finden. Nur dauert das sehr sehr lange.

Ansich ist das kein Problem, ich finde das Zeichnen in eine PictureBox aber besser, da ich meiner Meinung nach mehre Optionen in der weiteren Verarbeitung des Bildes habe.

Meine Frage lautet eigentlich nur (und dafür so viel Text 🙂 ) warum entsteht ein so ein großer Zeitunterschied beim Suchen von bestimmten Punkten zum einen in einem Array und zum anderen in einem Image. Letztendlich sind die Pixel der Bitmap doch auch nichts anderes als ein zwei dimensionales Array?

Würde mich sehr über eure Antworten freuen

24.01.2008 - 15:32 Uhr

Hallo,

danke für deine schnelle Antwort und Hilfe 🙂
Das klappt wie gewollt 🙂 und die auch die Sache mit dem Tag ist gut, mache das ganze nämlich über eine Schleife. Aber der Name tut's ja auch, oder nicht?#

Also nochmals vielen vielen Dank 🙂

Dr. Z 👍

24.01.2008 - 14:53 Uhr

Hallo zusammen,

ich habe ein gefülltes PictureBox-Array. Jeder PictureBox in diesem Array habe ich den gleichen EventHandler beim Click-Ereginis hinzugefügt. Klicke ich nun auf irgend eine meienr PB's in meiner Oberfläche, so wird die entsprechend angegebene Funktion durchlaufen. Mein Problem ist nun, dass ich nicht weiß, welche PictureBox die Funktion aufruft. Über object sender und EventArgs e bekomme ich auch keine mir nützlichen Informationen, oder sehe ich das falsch? Es soll je nach PB was anderes verarbeitet werden, dazu bräuchte ich halt diese Unterscheidungsmöglichkeit, wenn es diese gibt.

Hintergrund der ganzen Geschichte ist, dass ich mir keine 36 PB_Click-Ereginisse im Programmcode erstellen will, sondern dieses mittels nur eines PB_Click-Ereignisses realisieren will.

Weiß jemand von euch Rat, oder hat eine Idee? Würde ja die Forumsssuche nutzen, aber die geht ja leider nicht 🙂

Freundliche Grüße

Dr. Z

13.12.2007 - 09:34 Uhr

Hallo herbivore.

Das was du erklärt hast, ist soweit klar, kann und kenn ich auch. Mir war nur nicht klar, dass die Variable einer "globalen" Deklaration Membervariable genannt wird.

Ich kenne auch den unterschied und weiß auch dem entsprechend die Variablen anzuwenden.

Trotzdem schaffe ich es nicht, meinen Thread entsprechend zu initialiseren.

Kein Mensch weiß warum.

🙂

13.12.2007 - 07:07 Uhr

Das finde ich im Internet dazu:

Term: Member variable
Definition: Typed memory locations for storing values. Also known as a field or a local variable.
See also:
This C# Online.NET definition is from the Glossary of .NET / C# Terms.

12.12.2007 - 16:35 Uhr

Das Buch kenn und nutze ich. Habe mich auch den Teil über Threads durch gelesen.

gucke nocvhmal da rein und hoffe etwas zu finden.

vielen Danke für deine hilfe.

12.12.2007 - 16:12 Uhr

mache ich das nicht?

public Form1()
        {
            InitializeComponent();
            Thread thr_voncomlesen = new Thread(new ThreadStart(voncomlesen));
        }

?????

Ich verstehs nicht 🙂

12.12.2007 - 16:04 Uhr

Original von Programmierhans
this statt WindowsApplication1.Form1

und an welcher Stelle?

12.12.2007 - 16:03 Uhr

Danke für deine Antwort. Den FAQ-Artikel hab ich selbstverständlich genutzt.

Leider funktioniert dies auch nicht wirklich, vllt mache ich ja was falsch.

so siehts bei mir aus:


public Form1()
        {
            InitializeComponent();
            ThreadStart tst_auslagern = new ThreadStart(voncomlesen);
        }

        #region Deklaration von Variablen & Instanzierung von Klassen
        ChangeAndSaveConfig obj_casc = new ChangeAndSaveConfig();
        FolderBrowserDialog obj_fbdquelle = new FolderBrowserDialog();
        FolderBrowserDialog obj_fbdziel = new FolderBrowserDialog();
        Thread thr_voncomlesen = new Thread(tst_auslagern);
.
.
.

Als Resultat der oben aufgeführten Möglichkeit erhalte ich dann die Meldung, dass tst_auslagern an der entsprechenden Stelle nicht bekannt ist.

Folgende Methode habe ich auch Probiert:


public Form1()
        {
            InitializeComponent();
            Thread thr_voncomlesen = new Thread(new ThreadStart(voncomlesen);
        }

        #region Deklaration von Variablen & Instanzierung von Klassen
        ChangeAndSaveConfig obj_casc = new ChangeAndSaveConfig();
        FolderBrowserDialog obj_fbdquelle = new FolderBrowserDialog();
        FolderBrowserDialog obj_fbdziel = new FolderBrowserDialog();
.
.
.

Das Funktioniert auch nicht. Habe wieder den gleichen Fehler wie im ersten Beitrag.

Vielen Dank für eure Hlfe, auch wenn ich mich vllt ein wenig dumm anstelle, aber ich bin noch ein Anfänger.

Dr. Z

12.12.2007 - 15:41 Uhr

Hallo zusammen,

ich habe erneut ein Problem.
Ich möchte einen bestimmten Programmteil in einen Thread auslagern, damit dieser Unabhängig vom restlichen Programm läuft.

Ich weiß ja nicht wie ihr es macht, aber um einen eigenen Thread zu erstellen gehe ich wie folgt vor:


Thread thread_name = new Thread(new Threadstart(funktion/methode ide ausgelagert werden soll)

so weit so gut.
Versuche ich diese Initialiserung in der Form1 Klasse zu erzeugen, bekomme ich immer eine Fehlermeldung:

"Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "WindowsApplication1.Form1.voncomlesen()" verweisen...."

Versuche ich oben geschriebenes in Form1_Load zu integrieren, bekomme ich diese Meldung nicht, habe jedoch später ein Problem, wenn ich z.B. bei einem bestimmtem Click-Ereginisses eines Buttons den Thread suspenden oder abbrechen möchte.
Da ist der Thread dann nicht bekannt.

Habt ihr ne Idee, wo ich was falsch mache?

Dr. Z

11.12.2007 - 14:14 Uhr

Wollte es eigentlich für mich behalten, weil wegen peinlich 😉

Da hatte jemand vergessen den Thread zu starten 😁

11.12.2007 - 12:39 Uhr

Vielen Dank für eure Hilfe.

Problem hat sich gelöst. Hab den Wald vor lauter Bäumen nicht gesehen.
Naja, dann hab ich ja jetzt schon wenigstens meinen peinlichsten Beitrag hinter mir 🙂
Kann ja jetzt nur noch bergauf gehen.

11.12.2007 - 12:26 Uhr

Danke für deine Antwort.

Das ich Prüfen muss, ob was ankommt, ist mir klar.
Ich versuche nochmal mein Problem genauer zu schildern:

Ich betätige den Button um den COM1-Port zu "öffnen".
Dieser soll dann so lange geöffnet sein und lesen und die gelesenen Daten verarbeiten, bis die Bedingung der While-Schleife nicht mehr erfüllt ist.

Das Problem ist folgendes:
Würde ich diese Vorgehensweise innerhalb meines Form1 machen, kann ich den Rest vom Programm nicht mehr bedienen, weil das Programm permanent darauf wartet, dass über COM1 was gelesen wird.

Das ist nicht gut. Von daher wollte ich dieses Teil des Programms in einen eigenen Thread auslagern, so dass das Lesen über COM1 unabhängig von Form1 statt findet und meine Anzeigen in Form1.

Hoffe das ist jetzt was genauer.

Dr.Z

@urj:
Dieses Thema habe ich auch gefunden, nur habe ich in dem sinne keine Controls in meinem Formular, sondern nur Variablen, die weiter verarbeitet werden sollen.
Wie z.B im angezeigten Code str_gescannt und die in der verwendeten Klasse privaten Variablen.
Diese Daten bekomme ich leider nicht zurück in meine eigentlich Programm.

11.12.2007 - 12:00 Uhr

Hallo zusammen,

bin schon des öfteren auf der Suche nach Lösungen von meinen Programmierproblemen über diese Seite gestolpert und ich hab immer genau das gefunden was ich gesucht habe 🙂
Da muss man euch einfach mal ein Lob für geben, für die tolle und gute Arbeit und Erläuterungen, Erklärungen für die ganzen Probleme. Macht weiter so.
Aus dem Grund habe ich mich dan auch mal hier angemeldet und schon habe ich die erste Frage, die ich (vllt nicht gut genug gesucht, vllt nicht alles Gefundene verstanden) nicht gelöst bekomme. Auch mit Hilfe des Forums nicht.

Nun komme ich einfach mal zu meinem Problem:
Ich habe ein Programm mit einer GUI. Wenn ich einen Button betätige, "öffne" ich die Verbindung zur seriellen Schnittstelle.
Hier wird auf ein etsprechendes Signal (ein gescannter string) gewartet und soll weiter verarbeitet werden. Und das über die ganze Dauer, wo das Programm gestatrtet ist.

Meine erste Idde:
Ne Schleife.
Mein erster Gedanke nach Umsetzung:
Nicht gut, alles andere im GUI kann nicht mehr verwendet werden 🙂
Meine zweite Idee:
Ich erstelle einen zusätzlichen Thread, in den ich den Teil auslagere, der die ganze Zeit laufen soll.

So weit, so gut. Problem ist nun folgendes:
Möchte ich mir die gescannten Daten anzeigen lassen, passiert leider nichts 🙂


private void btn_comoo_Click(object sender, EventArgs e)
        {
                ThreadStart tst_auslagern;
                tst_auslagern = new ThreadStart(voncomlesen);
                Thread thr_voncomlesen = new Thread(tst_auslagern);
         }

private void voncomlesen()
        {
            SerialPort obj_sp = new SerialPort();

            while (btn_comoo.Text == "Deaktivieren")
            {
                obj_sp.Open();
                string str_gescannt = obj_sp.ReadLine();
                obj_sp.Close();
                CutString obj_cs = new CutString();
                obj_cs.betweenintern(str_gescannt, 'b', 'c');
                MessageBox.Show(str_gescannt + obj_cs.str_knummer + obj_cs.str_anummer);
            }
        }

Ich hoffe ihr habt mein Problem verstanden und könnt mit weiter helfen.