Laden...

Forenbeiträge von Gerri3d Ingesamt 57 Beiträge

17.02.2018 - 15:44 Uhr

Gibt es eine empfehlenswerte Möglichkeit, Spracherkennung zu verwenden? Wörter und Befehle sollten auch selbst erweitert werden können. Und es müsste offline sein. Ist ein Uniprojekt - digitale Fabrik..

07.02.2018 - 15:12 Uhr

Hallo, das hört sich durchaus interessant an. Welche Kosten kommen da pro Lizenz auf einen ca zu?

20.12.2017 - 10:12 Uhr

ja, für die anderen passt es.

20.12.2017 - 09:38 Uhr

Hallo, ich habe im grafische editor eine Groupbox definiert. Das Maximieren klappt, aber beim Minimieren passt es sich nicht mehr an, andere Elemente arbeiten aber korrekt.

Gibt es einen Bug oder muss etwas aktualisiert werden?

18.12.2017 - 14:33 Uhr

Hallo, es wird mehrmals ein PaintEventArgs gestartet, den ich nicht nachvollziehen kann.
Ist es möglich in VS2017 die letzten Aufrufe anzuzeigen bzw zurück zu verfolgen?

Auswirkungen sieht man an einem Messagebox Aufruf, was ein guter Breakpoint ist.

12.12.2017 - 15:42 Uhr

Vielen Dank.
Tatsächlich wird nur eine Berechnung durchgeführt in diesem Programm von daher hatte ich mir nie Gedanken über die Sinnhaftigkeit gemacht.

Was mich mehr verwundert ist, warum der Syntax so im Buch

Visiual C# - Grundlagen und Profiwissen, 2010. Hanserverlag auf Seite 181 beschrieben wird.

12.12.2017 - 15:19 Uhr

Zeige mal bitte den Code, vermutlich wird der EventHandler zu oft angemeldet.

Calculation.cs


        public delegate void MessageOfEventDelegate(object sender, string e);
        public event MessageOfEventDelegate MessageOfEventDelegateInstance1;

        private void MsgBoxEventTrigger(string msg, string capture)
        {
            MessageOfEventDelegateInstance1?.Invoke(this, msg); // gibt null zurück wenn Delegate keine Wert aufweißt - Mind. ein Event-Handler muß angemeldet sein
        }

In Forms1.cs


 private void messageOfEventHandling(object o, string s)
        {
            string caption = "Fehler";
            MessageBoxButtons button = MessageBoxButtons.OK;
            DialogResult result = MessageBox.Show(s, caption, button);
            if (result == DialogResult.OK)
            {
                return;
            }
        }

        private void buttonGeneriere_Click(object sender, EventArgs e)
        {
            // calculate
            calculation = new Calculation(inputData.excelName, inputData.csvCodierungName, inputData.csvKloepperbodenName,
                                            inputData.csvFlanschName, inputData.dxfName, inputData.iniName, inputData.Torch,
                                            inputData.flexIsoMuffe, inputData.flexIsoNippel, inputData.flexIsoFlansch, excelSel);
            
            // Event-Handler anmelden
            calculation.MessageOfEventDelegateInstance1 += new Calculation.MessageOfEventDelegate(messageOfEventHandling);

            // Berechne / Generiere mit allen Circles
            ColCheckAndExportIniData(false);

            // new object - all modifications lost
            buttonReGenerate.Visible = false;

            // Event-Handler abmelden
            calculation.MessageOfEventDelegateInstance1 -= new Calculation.MessageOfEventDelegate(messageOfEventHandling);
        }

        private void buttonReGenerate_Click(object sender, EventArgs e)
        {
            if (calculation == null)
            {
                return;
            }

            // Event-Handler anmelden
            calculation.MessageOfEventDelegateInstance1 += new Calculation.MessageOfEventDelegate(messageOfEventHandling);
            

            // Berechne / Generiere alle nicht abgewählten Circles
            ColCheckAndExportIniData(true);

            // Event-Handler abmelden
            calculation.MessageOfEventDelegateInstance1 -= new Calculation.MessageOfEventDelegate(messageOfEventHandling);
        }

12.12.2017 - 14:58 Uhr

vielen Dank, hat geklappt.

Da das PopUp (Ereignisbehandlung) mit jedem anmelden des Events (buttonClick) um einmal mehr ausgeführt wird, sollte man ja das Event wieder abmelden.

Gibt es hier ein Standardprozedere?

Ich habe das Event im Augenblick als letzte Anweisung der buttonClick Methode der Form Klasse ausgeführt und es klappt zumindest.

12.12.2017 - 14:07 Uhr

Hallo, ich habe eine Grundlegende Frage zu Events.

Es gibt 2 Klassen, eine zur Berechnung von Werten, die andere ist die standard Windows Forms Klasse "Form1".

Nun möchte ich eine MsgBox aufrufen wenn ein Fehler erkannt wird in der Berechnungsklasse,
klassiches 3 Schichten Software Architecture eben.

Nun zu meiner Frage - wo werden welche Teile des Ereignisses geschrieben?

  1. Delegate / delegate
  2. Instanz / event
  3. Auslösen
  4. Ereignisbehandlung
  5. Eventhandler anmelden.

1,2,3 in der Berechnugsklasse
4,5 in der Formsklasse?

Es wird eine Instanz der Berechnugsklasse in der Formsklasse erzeugt (ich hoffe dass das soweit verständlich ist)

Gruß Gerri3d

04.12.2017 - 16:58 Uhr

Ich habe einen Tab, auf dem etwas gezeichnet wird. Das klappt auch.
Wird das Tab aufgebaut wird das event angetriggert.

Nun muß ich auch neu Zeichnen, wenn ein Mouseklick Event auftritt, leider steht ich hier aber an.
Kann mir jemand einen Tipp geben?

Zeichenmethode


        private void drawDxf(Graphics g)
{
....
}

Hier PaintEventArgs beim TabAufbau


        private void tabPageDxf_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            drawDxf(g);
        }

Hier das Problem:


        private void tabPageDxf_MouseClick(object sender, MouseEventArgs e)
        {

            int circleIdx = dxfMouseAreaCheck(Convert.ToDouble(e.X), Convert.ToDouble(e.Y));
              
            if ( circleIdx > -1)
            {
                actCircle = (Calculation.S_Circle)calculation.CircleList[circleIdx];
                actCircle.inactive = !actCircle.inactive;
                calculation.CircleList[circleIdx] = actCircle;
            }

            // change Textbox Infos
            textBoxStyle(circleIdx);

            ?? Graphics g = CreateGraphics();
            drawDxf(g);

        }

30.11.2017 - 16:32 Uhr

du hats recht, es scheint, dass ich die Bereich, die ich auswerte verschoben habe.

30.11.2017 - 15:02 Uhr

Ich will das Ereignis auslösen, wenn ich in einem bestimmten Bereich einer Form bin.

Es gibt mehrere Bereich die in einer List hinterlegt sind. Sobald das Ereignis angestoßen wird, Läuft eine Schleife durch und vergleicht die Cursorposition mit den Hinterlegten Objekten.

Nun wird oft erst nach wiederholtem eindringen in den Bereich das Event ausgelöst.

Gibt es noch etwas zu beachten?


        private void tabPageDxf_MouseMove(object sender, MouseEventArgs e)
        {
            if (pipeData.lengthX == 0 || pipeData.lengthX == 0)
            {
                return;                
            }

            // Update the mouse path that is drawn onto the Panel.
            int mouseX = e.X;
            int mouseY = e.Y;

            // load circles and check if in circle area            
            for (int i = 0; i < calculation.CircleList.Count; i++)
            {
                double vectorX = Convert.ToDouble(e.X) - ((Calculation.S_Circle)calculation.CircleList[i]).CsDrawX;
                double vectorY = Convert.ToDouble(e.Y) - ((Calculation.S_Circle)calculation.CircleList[i]).CsDrawY;
                int vector = Convert.ToInt32( Math.Sqrt( vectorX * vectorX + vectorY * vectorY));
                if ( (((Calculation.S_Circle)calculation.CircleList[i]).DiameterDraw+5) / 2 > vector)
                {
                    textBoxCircleInfo.Text = ((Calculation.S_Circle)calculation.CircleList[i]).ID + "\r\n"
                                            + "Höhe: " + Convert.ToString(Math.Round(((Calculation.S_Circle)calculation.CircleList[i]).height,0)) + " mm \r\n"
                                            + "Höhe (inkl. Klöpperboden): " + Convert.ToString(Math.Round(((Calculation.S_Circle)calculation.CircleList[i]).height + pipeData.kloepperseam[0],0)) + " mm \r\n"
                                            + "Winkel: " + Convert.ToString(Math.Round(((Calculation.S_Circle)calculation.CircleList[i]).angle,1)) + "°";
                    textBoxCircleInfo.BackColor = ((Calculation.S_Circle)calculation.CircleList[i]).ColorDraw;                     
                    break;
                }
                
            }


this.tabPageDxf.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tabPageDxf_MouseMove);

27.11.2017 - 13:19 Uhr

vielen Dank, jetzt klappts. Stimmt schon, alles noch ziemlich schwammig, nur ist .Net, OOP und C# ein dermaßen großes Thema dass man das benötigte als Anfänger schwer bei speziellen Fragen findet.

Jedenfalls zur LÖSUNG:

Ich habe im Form1.Designer.cs das Event für den Tab hinzugefügt:


 this.tabPageDxf.Paint += new System.Windows.Forms.PaintEventHandler(this.tabPageDxf_Paint);

und dann meine Methode im Form1.cs geschrieben:


         private void tabPageDxf_Paint(object sender, PaintEventArgs e)
        {            
                Graphics g = e.Graphics;
                g.DrawRectangle(Pens.Red, 0, 0, tabPageDxf.Width-1, tabPageDxf.Height-1);
        }

Gruß Gerri3d

27.11.2017 - 11:32 Uhr

wo definere ich das es nicht Fform sondern in der TabPage ist?

27.11.2017 - 10:09 Uhr

vielen Dank, ich habe nun versucht simple ein Rechteck zu Zeichnen.
Was auch irgendiwe schon läuft.
Wie kann ich das nun auf einer bestimmten tabPage darstellen?


protected override void OnPaint(PaintEventArgs e)
         {
             base.OnPaint(e);

             Graphics g = e.Graphics;

             g.DrawRectangle(Pens.Red, 25, 25, tabControlHelp.Width-50, tabControlHelp.Height-50);

         } 

23.11.2017 - 15:11 Uhr

Gibt es eine Möglichkeit, anzuzeigen, welche Frameworkversion man braucht bzw welche erweiterungen?

Beispielsweise verwende ich COM um Excell Daten auszuwerten. Das Thema ist noch etwas neu, deshalb mal sorry wenn noch Infos fehlen.

Es geht darum, das der User mit dem Programm dann problemlos arbeiten kann.

23.11.2017 - 15:08 Uhr

Hi, Danke. Schade. Ich werde wohl die *.htm Files im Browser irgendwie anzeigen und so einbetten, dazu bräuchte ich nur ermitteln, welche htm Files in dem Ordner sind. Nicht so elegant aber ja.

22.11.2017 - 14:01 Uhr

Hallo, ich bin noch ziemlich am Anfang und wollte eine einfache Linie Testweise zeichnen.

Hier mal meine FOrm-Klasse:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DrawTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {




        }

        private void ShowLineJoin(PaintEventArgs e)
        {
            InitializeComponent();
            Graphics g;
            g = this.CreateGraphics();

            // Create a new pen.
            Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);

            // Set the pen's width.
            skyBluePen.Width = 8.0F;

            // Set the LineJoin property.
            skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;

            // Draw a rectangle.
            e.Graphics.DrawRectangle(skyBluePen,
                new Rectangle(40, 40, 150, 200));

            //Dispose of the pen.
            skyBluePen.Dispose();

        }
    }
}


was fehlt, um die Linie im Form darzustellen?

21.11.2017 - 14:20 Uhr

hab hier mal eine help Methode gefunden, leider wird das CHM wieder extern geöffnet.
https://msdn.microsoft.com/de-de/library/system.windows.forms.help_methods(v=vs.110).aspx

21.11.2017 - 11:05 Uhr

Ich würde gerne eine Hilfedatei (chm Datei mit HTML Help Workshop erstellt) in einem Windows Form Tab darstellen.

Die CHM läuft extern und bei Button_Click (als eigenes CHM File, also nicht eingebettet.

Wenn ich diese nun bei anwählen der TabPage "Help" aufrufen will, passiert leider gar nichts.

Deshalb zwei Fragen dazu -

  1. welches elment muß angelegt werden, um die CHM darzustellen
  2. wiekann man das starten bei anwählen einer TabPage antriggern?

so funktionierts leider nicht:


        private void tabPageHelp_Click(object sender, EventArgs e)
        {
            Help.ShowHelp(textBox1, "D:\\igm\\dxf\\ChmHelp\\DiemWerkeHelp.chm");

        }

textbox1 ist in der tabPage enthalten.

15.11.2017 - 16:57 Uhr

Danke, tatsächlich habe ich 3 Klasse.
Eine für Ordner/Verzeichnis/ Dateiverwaltung
Eine die Form
Eine für Berechnungen.

Wie implementiere ich nun eine Schnittstelle, wenn bei der Berechnung zB Fehler erkannt wurden.
Wird die Berechnungen Klasse in der Form Klasse aufgerufen?

Augenblicklich laufen beide Klassen in der Form zusammen bzw wird eine Instanz jeweils erzeugt.

15.11.2017 - 11:53 Uhr

Hallo, ich schreibe an einem WindowsForms Projekt mit C#. Nun habe ich eine Klasse für Berechnungen gebaut und will Messageboxes verwenden können.

Es scheint zu klappen, nur das Close() macht mir noch Probleme.

Die Form heißt Form1.cs
in Calcualtion.cs soll nun ein MsgBox Dialog abgearbeitet werden:


            if (CircleDataTmp.asm == assembly.NONE)
            {              
                string msg = "Für mindestens einen Durchmesser wurde keine Bauteiltype gefunden.";
                string caption = "Hinweis";
                MessageBoxButtons button = MessageBoxButtons.OK;
                DialogResult result = MessageBox.Show(msg, caption, button);
                if (result == DialogResult.OK)
                {
                    ; // do your stuff
                    this.Close();
                }
            }

Das Problem ist bei this.Close();

wie aknn man das anpassen?

Fehlermeldung:
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS1061 "Calculation" enthält keine Definition für "Close", und es konnte keine Close-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ "Calculation" akzeptiert (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). CSgeneratorWin D:\igm\dxf\Tool\CSgeneratorWin\CSgeneratorWin\CSgeneratorWin\Calculation.cs 490 Aktiv

03.10.2017 - 17:03 Uhr

Hallo,

ich habe einen neuen Wert (Struct) den ich an eine gewisse Stelle in einer Arraylist schreiben will. Die Daten die davor am index waren können überschrieben werden.
Wie geht ihr da am besten vor?

03.10.2017 - 10:20 Uhr

nun ja, es wird immer das Struct übergeben und auch benötigt. Bei jedem Aufruf. Also habe ich get/set richitg vertsanden, würde das nicht klappen

03.10.2017 - 09:31 Uhr

Hallo, ich würde gerne eine struct mit teilweise schon gültigen werten in einer Methode vervollständigen.
Gibt es etwas eleganteres als:



 struct S_Circle
        {
            public int idx;
            public double height;       // y  // CS on Pipe
            public double angle;        // x   // CS on Pipe
            public int diameterBottom;  // for collision prevention calculation
            public assembly asm;
            public int length;          // assembly length / heigth
            public int diameterTop;     // same like bottom if not flansch => different for flansch -> Cone
        }
...

S_Circle GetAssemblyDimensions(int diaBottom, S_IsoHeight isoHeight, S_Circle incompleteCircleData)


in der Methode will ich nur

        public int length;          // assembly length / heigth  
        public int diameterTop;     // same like bottom if not flansch =&gt; different for flansch -&gt;   

bearbeiten.

02.10.2017 - 16:43 Uhr

Hallo, ich habe folgendes enum:


        enum assembly: int { Muffe = 1, Nippel, GewindeRohr, SiedeRohr, Stahlrohr, Winkel

dazu noch ein Struct


        struct S_Codierung
        {
            public int idx;
            public string ID;
            public int diameter;
            public int thickness; // 2 strings ->10^1, 1^0
            public assembly asm;
            public int subtype;
        }

nun würde ich gerne aus einem text den wert umwandeln und in das Struct schreiben:


         actCodierung.asm = Convert.ToInt32(subStr);

klappt leider nicht. Wie geht man hier vor?

29.09.2017 - 14:42 Uhr

vielen Dank für das Feedback


       private void WriteAllDataToArr(string excellPath, string actDict)
        {            
            string[] pathTmp = new string[3];
            Application xlApp = new Application(); // excell application
            Workbook xlWbk = xlApp.Workbooks.Open(excellPath);
            int SheetsCount = xlWbk.Worksheets.Count;

            try
            {                  
                for (int i = 0; i < SheetsCount; i++)
                {
                    xlApp.DisplayAlerts = false;
                    Worksheet xlWks = (Worksheet)xlWbk.Sheets[i + 1];
                    xlWks.Activate();                 
                    pathTmp[i] = Path.Combine(actDict, xlWks.Name) + ".csv";
                    if (File.Exists(pathTmp[i]))
                    {
                        File.Delete(pathTmp[i]); // delete old csv file                                               
                    }

                    xlWks.SaveAs(pathTmp[i], XlFileFormat.xlUnicodeText); // Trennzeichen = Tab
                    Marshal.ReleaseComObject(xlWks);                    
                }                
                xlWbk.Save();
                xlApp.Quit();
                Marshal.ReleaseComObject(xlWbk);
                Marshal.ReleaseComObject(xlApp.Workbooks);
                
                // replace tab with ;
                for (int y = 0; y < SheetsCount; y++)
                {
                    string txt = File.ReadAllText(pathTmp[y]);
                    txt = txt.Replace("\t", ";").Replace("{tab}", "\t");
                    File.WriteAllText(pathTmp[y], txt, Encoding.UTF8);
                    
                    switch (y)
                    {
                        case 0: WriteCodierungDataToArr(ReadText(pathTmp[y])); break;
                        case 1: WriteKlopperDataToArr(ReadText(pathTmp[y])); break;
                        case 2: WriteFlanschDataToArr(ReadText(pathTmp[y])); break;
                        default: break;
                    }
                }                
            }
            finally
            {
                xlApp.DisplayAlerts = true;
                Marshal.ReleaseComObject(xlWbk);
                Marshal.ReleaseComObject(xlApp.Workbooks);
                Marshal.ReleaseComObject(xlApp);
            }
        }

29.09.2017 - 12:36 Uhr

oh mann.. jetzt klappts 😃


        private void WriteAllDataToArr(string excellPath, string actDict)
        {            
            string[] pathTmp = new string[3];
            Application xlApp = new Application(); // excell application
            Workbook xlWbk = xlApp.Workbooks.Open(excellPath);

            try
            {
                int i = 0;
                
                foreach (Worksheet xlworksheet in xlWbk.Worksheets)
                {
                    xlApp.DisplayAlerts = false;
                    Worksheet xlWks = (Worksheet)xlWbk.Sheets[i + 1];
                    xlWks.Activate();                 
                    pathTmp[i] = actDict + @"\" + xlWks.Name + ".csv";
                    if (File.Exists(pathTmp[i]))
                    {
                        File.Delete(pathTmp[i]); // delete old csv file                                               
                    }

                    xlWks.SaveAs(pathTmp[i], XlFileFormat.xlUnicodeText); // Trennzeichen = Tab
                    Marshal.ReleaseComObject(xlWks);
                    i++;
                }                
                xlWbk.Save();
                Marshal.ReleaseComObject(xlWbk);
                xlApp.Quit();
                Marshal.ReleaseComObject(xlApp.Workbooks);

                // replace tab with ;
                for (int y = 0; y < i; y++)
                {
                    string txt = File.ReadAllText(pathTmp[y]);
                    txt = txt.Replace("\t", ";").Replace("{tab}", "\t");
                    File.WriteAllText(pathTmp[y], txt, Encoding.UTF8);
                    
                    switch (y)
                    {
                        case 0: WriteCodierungDataToArr(ReadText(pathTmp[y])); break;
                        case 1: WriteKlopperDataToArr(ReadText(pathTmp[y])); break;
                        case 2: WriteFlanschDataToArr(ReadText(pathTmp[y])); break;
                        default: break;
                    }
                }                
            }
            finally
            {
                xlApp.DisplayAlerts = true;
                Marshal.ReleaseComObject(xlApp);
            }
        }

29.09.2017 - 11:08 Uhr

das dachte ich mir auch schon, nur kann ich dann nicht auf die CSV Daten ohne xlApp.Quit() zugreifen.

29.09.2017 - 09:57 Uhr

OK - man muß das Sheet noch aktivieren ->
xlWks.Activate();



using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

        private void WriteAllDataToArr(string excellPath, string actDict)
        {            
            string pathTmp;

            for (int i = 0; i < 3; i++)
            {
                Application xlApp = new Application(); // excell application
                Workbook xlWbk = xlApp.Workbooks.Open(excellPath);
                Worksheet xlWks = (Worksheet)xlWbk.Sheets[i+1];
                xlWks.Activate();
             
                pathTmp = actDict + @"\" + xlWks.Name + ".csv";

                try
                {
                    if (File.Exists(pathTmp))
                    {
                        File.Delete(pathTmp); // delete old csv file                                               
                    }

                    xlWks.SaveAs(pathTmp, XlFileFormat.xlUnicodeText); // Trennzeichen = Tab
                    xlApp.DisplayAlerts = false;
                    xlWbk.Save();
                    xlApp.Quit();

                }
                finally
                {

                    xlApp.DisplayAlerts = true;
                    // xlApp.Quit();

                    Marshal.ReleaseComObject(xlWks);
               //     Marshal.ReleaseComObject(xlWbk.Sheets[i + 1]);
                    Marshal.ReleaseComObject(xlWbk);
                    Marshal.ReleaseComObject(xlApp.Workbooks);
                    
                    Marshal.ReleaseComObject(xlApp);
                    
                    // replace tab with ;
                    string txt = File.ReadAllText(pathTmp);
                    txt = txt.Replace("\t", ";").Replace("{tab}", "\t");
                    File.WriteAllText(pathTmp, txt, Encoding.UTF8);

                    switch (i)
                    {
                        case 0: WriteCodierungDataToArr(ReadText(pathTmp)); break;
                        case 1: WriteKlopperDataToArr(ReadText(pathTmp)); break;
                        case 2: WriteFlanschDataToArr(ReadText(pathTmp)); break;
                        default: break;
                    }
                }
            }
                        
        }

29.09.2017 - 09:12 Uhr

vielen Dank,
hatte jemand das Problem, dass der Worksheet Name zwar KOrrekt, der Inhalt aber von einem anderen Worksheet ist (also vom nächsten)?



        private void WriteAllDataToArr(string excellPath, string actDict)
        {            
            string pathTmp;
             
            for (int i = 0; i < 3; i++)
            {
                Application xlApp = new Application(); // excell application
                Workbook xlWbk = xlApp.Workbooks.Open(excellPath);
                Worksheet xlWks = (Worksheet)xlWbk.Sheets[i+1];

                Console.WriteLine( ((Worksheet)xlWbk.Sheets[i + 1]).Name + " / " + ((Worksheet)xlWbk.Sheets[i + 2]).Name + " / " + ((Worksheet)xlWbk.Sheets[i + 3]).Name );
                pathTmp = actDict + @"\" + xlWks.Name + ".csv";

                if (File.Exists(pathTmp))
                {                     
                    File.Delete(pathTmp); // delete old csv file                                               
                }
            
                xlWks.SaveAs(pathTmp, XlFileFormat.xlUnicodeText); // Trennzeichen = Tab
                ...


28.09.2017 - 13:46 Uhr

ja klar, nur die lasse ich default.

habs jetzt so gelöst:


...
  xlWks.SaveAs(pathTmp, XlFileFormat.xlCSV);
                xlWbk.Save();



                xlApp.Quit();
                
                Marshal.ReleaseComObject(xlWks);
                
                // Marshal.ReleaseComObject(xlWbk.Sheets[i+1]);

..

28.09.2017 - 13:07 Uhr

Im Anhang sieht man, dass die Anwendung (obwohl vorher kein CSV da war, dieses nochmals Speichern will - es poppt auch ein Dialog auf aus Excell).

Da ich save as ja Ausführe, sollte das nicht passieren oder?
Wenn ich diesen Dialog schließe ist die Datei auch wieder frei.

28.09.2017 - 10:50 Uhr

Marshall.ReleaseComObject wird in mienem Beispielcode verwendet. Ind er Vorlage steht auch nix von Dispose, deswegen stand ich da ja auch am schlauch

28.09.2017 - 10:25 Uhr

Das wusste ich nicht, hab mich jetzt versucht, durch Dispose durchzuarbeiten...
Ist für mich leider so komplett neu, aber kannst du mir bitte hierbei helfen, das auf mein Programm umzuwälzen?

* soll ich in IDisposable in der Klasse implementieren, also class xy: IDisposible?

* Die Dispose Methode selbst wäre dann ja leer oder?

* wo wende ich using an (Ich weiß, dass die Dispose Methode nach der Ausführung von Using
aufgerufen wird)

27.09.2017 - 17:59 Uhr

mein Code:


       private void WriteAllDataToArr(string excellPath, string actDict)
        {
            string[] sheetName = new string[3];
            string pathTmp;
            Application xl = new Application();

            try
            {


                // Thread.Sleep(2000);
                int i = 0;
             //   for (int i = 0; i < 3; i++)
             //   {

                    Workbook workbook = xl.Workbooks.Open(excellPath);

                    Worksheet ws = (Worksheet)workbook.Sheets[i+1];

                   

                    sheetName[i] = ws.Name;

                    pathTmp = actDict + @"\" + sheetName[i] + ".csv";


                    /*  if (File.Exists(pathTmp))
                      {
                          Thread.Sleep(2000);
                          File.Delete(pathTmp); // delete old csv file
                          Thread.Sleep(2000);
                      } */

                    // ws.Unprotect();
                    ws.SaveAs(pathTmp, XlFileFormat.xlCSV);
                    // Hier wird excell nicht beendet                    
                    
                    Marshal.ReleaseComObject(ws);
                   
                    switch (i)
                    {   
                        case 0: WriteCodierungDataToArr(ReadText(pathTmp)); break;
                        case 1: WriteKlopperDataToArr(ReadText(pathTmp)); break;
                        case 2: WriteFlanschDataToArr(ReadText(pathTmp)); break;
                        default: break;
                    }                    
                //}
            }            
            finally
            {
                xl.DisplayAlerts = false;
                xl.Quit();

                Marshal.ReleaseComObject(xl);
            }
        }

27.09.2017 - 17:57 Uhr

Hallo,
ich bin noch ziemlich unerfahren mit komplexeren Programmen in C#.
nichts destotrotz versuche ich ein Excell FIle in eine CSV Datei umzuwandeln nach folgender anleitung:



using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;
 
namespace jarloo
{
    public static class ExcelHelper
    {
        public static void ConvertExcelToCsv(string source, string destination, int sheetNumber=1)
        {
            if (File.Exists(destination)) File.Delete(destination);
 
            Application xl = new Application();
 
            try
            {
                Workbook workbook = xl.Workbooks.Open(source);
                Worksheet ws = (Worksheet) workbook.Sheets[sheetNumber];
                ws.SaveAs(destination, XlFileFormat.xlCSV);
 
                Marshal.ReleaseComObject(ws);
            }
            finally
            {
                xl.DisplayAlerts = false;
                xl.Quit();
 
                Marshal.ReleaseComObject(xl);
            }
        }
    }
}

namespace Jarloo
{
    class Program
    {
        static void Main(string[] args)
        {
            ExcelHelper.ConvertExcelToCsv(@"c:tempsample.xlsx",@"c:tempsample.csv");
        }
    }
}

leider wird die CSV zwar erstellt, aber Excell behält die CSV im Prozess und ich kann die Datei nicht speichern unter, bzw weiter verarbeiten.

Nach jedem Start sehe ich im Ressouorcenmonitoring, dass Excell die Datei noch geöffnet hält und sperrt.

Ich verwende Win10Prof, VS 2117 u Excell 2016.

17.02.2017 - 12:51 Uhr

alles klar. sorry. Bin gerade nur etwas ausgebremst weil ich immer wieder einen schritt zurück geh um die probleme neu anzugehen und da sind die Fragen oft gleich obwohl der thread eigentlich anderst anfängt...

17.02.2017 - 09:09 Uhr

ich habe eine Klasse geschrieben, in der eben aus einem Shared Memory gelesen wird.
Wenn ich breakpoints irekt am Accesor setze, dan sehe ich, dass Werte ausgelesen werden. Lasse ich das Program normal laufen, dann sehe ich keine neuen Werte zB wenn diese an der Konsole ausgegeben werden collen mit Console.WriteLine.

Deshalb denke ich, dass die Zeit zu kurz ist oder ich das Prinzip von .Net nicht verstehe.

17.02.2017 - 08:34 Uhr

Hallo, wie kann man Abfragen, ob der Accesor das lesen beendet hat bzw geht man vor um das restliche Programm nicht zu beeinträchtigen?

16.02.2017 - 21:18 Uhr

da könnte etwas drann sein. Ich hole die Daten mit


 // Open a mapped file with read access and one with write access. 
            using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
            using (var accessorRead = mmfRead.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Read))
                            
            // Read the structure
            accessorRead.Read(0, out dataExchangeReadTmp);
                       
           

16.02.2017 - 20:34 Uhr

es ist nur schwer es zu erklären.

Ich bekomme Daten über "MemoryMappedFile" und will diese auf der Konsole ausgeben.
nur ist der String eben ller. Ausser bei einem Breakpoint.

Aufgerufen wird das mit

While(true)
{..}

wenn ich breakpoints setze, dann kann ich die Daten in den Varaiblen sehen. AUch die Konsolenausgabe passt. Nur ohne Breakpoints eben nicht.

16.02.2017 - 18:51 Uhr

Hallo, wenn ich nicht mit breakpoints arbeite, dann sehe ich keine Werte [ Console.Writeline(string) ] auf der C# Konsolenausgabe. Wieso ist das so?

16.02.2017 - 18:13 Uhr

Hallo, ich habe ein byte bzw char(Ascii - Größe sind 8 bit) Array, das ich in ienen string wandeln will.
Leider komme ich mit dem encoding nicht ganz zurecht.

Wo liegt der Fehler beim Encoding?
gruß Gerri


            char[] TmpArrayC = new char[255];
            byte[] TmpArrayB = new byte[255];

            for (int i = 0; i < TmpArrayC.Length; i++)
            {
                TmpArrayC[i] = Convert.ToChar(dataExchangeReadTmp.server[i]); //Fixed array size
                TmpArrayB[i] = dataExchangeReadTmp.server[i];
            }

            string server = Encoding.Unicode.GetString(TmpArrayB);