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..
Hallo, das hört sich durchaus interessant an. Welche Kosten kommen da pro Lizenz auf einen ca zu?
👍 vielen Dank!
..Minimierien
..Maximieren
ja, für die anderen passt es.
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?
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.
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.
löschen
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);
}
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.
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,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
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);
}
du hats recht, es scheint, dass ich die Bereich, die ich auswerte verschoben habe.
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);
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
wo definere ich das es nicht Fform sondern in der TabPage ist?
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);
}
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.
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.
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?
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
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 -
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.
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.
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
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?
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
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 => different for flansch ->
bearbeiten.
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?
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);
}
}
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);
}
}
das dachte ich mir auch schon, nur kann ich dann nicht auf die CSV Daten ohne xlApp.Quit() zugreifen.
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;
}
}
}
}
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
...
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]);
..
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.
vielen danke
ja, von 2011 http://www.jarloo.com/excel-to-csv/
wie würde man dass heute lösen?
Marshall.ReleaseComObject wird in mienem Beispielcode verwendet. Ind er Vorlage steht auch nix von Dispose, deswegen stand ich da ja auch am schlauch
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)
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);
}
}
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.
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...
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.
Hallo, wie kann man Abfragen, ob der Accesor das lesen beendet hat bzw geht man vor um das restliche Programm nicht zu beeinträchtigen?
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);
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.
Hallo, wenn ich nicht mit breakpoints arbeite, dann sehe ich keine Werte [ Console.Writeline(string) ] auf der C# Konsolenausgabe. Wieso ist das so?
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);