Hi,
ich möchte die folgende Schleife als "CodeIterationStatement" abbilden.
int i = 0;
int j = 0;
for (i = 0; ((i < 10) && (j < 10)); ++i, ++j)
{
}
Allerdings unterstützt das "IncrementStatement" Property nur ein einzelnes "CodeStatement" anstatt einer Liste. In C++ ließen sich die beiden "++i" bzw. "j++" als "CodeBinaryOperatorExpression" abbilden mittles des Komma-Operators. Diesen gibt es unter C# aber nicht. Wie also lässt sich obiges Konstrukt in C# mittels der Klassen im CodeDom-Namespace abbilden? Jemand eine Idee?
https://learn.microsoft.com/de-de/dotnet/api/system.codedom?view=dotnet-plat-ext-7.0
PS: Es gibt zwar eine "CodeStatementCollection" aber diese ist nicht von der "CodeStatment"-Klasse abgeleitet. Lässt sich so also auch nicht (direkt) zuweisen.
PPS: Witzigerweise hat die ForStatementSyntax-Klasse aus dem CodeAnalysis Namespace eine Liste von Incrementoren wie man es erwarten würde (https://learn.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.csharp.syntax.forstatementsyntax.incrementors?view=roslyn-dotnet-4.3.0)
@hkdd sagte in Zeitstempel in Directorys und Dateien setzen:
Da der XP-Explorer offenbar keine Zeitumrechnungen macht und die Zeit so anzeigt, wie sie gespeichert ist (analog DIR), sind die gespeicherten Zeiten alle um eine Stunde nach vorn gesetzt
Nein, das stimmt nicht. Auch der Windows-XP Explorer macht ne Umrechnung. Und zwar von UTC nach lokaler Zeit. Er macht sie nur falsch.
@DocShoe sagte in Konsolen-Ausgaben unter Windows 7 und 8.1 (Encoding):
Wie startest du denn den Programm?
Jetzt habe ich es gefunden - das wusste ich eigentlich schon von einem anderen Programm, habe aber nicht gleich daran gedacht.....
CHCP 65001 - ist die eine Sache.
ABER => man muss im CMD-Fenster bei WIndows 7 und 8.1 die Schriftart auf eine umstellen, die auch UTF8 darstellen kann.
Voreingestellt ist = Rasterschriftart.
Das muss man ändern in => Lucia Console
Mein kleines Testprogramm sieht jetzt so aus und funktioniert:
using System;
using System.Reflection;
using System.Text;
using System.Management;
namespace ConsoleNET472Vm81
{
internal class Program
{
public static int WinVer = 0; //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
static void Main(string[] args)
{
WinVer = GetOperatingSystem(); //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
string Text =
"Fröhliches Ostern\n" +
"auf der grünen Wiese\n" +
"Eintritt: 5,00 €\n" +
"x²+y² = z²\n" +
"2³ = 8\n"+
"äöüß AÖÜ € @ °";
if ((WinVer == 10) || (WinVer == 11))
{
Console.OutputEncoding = Encoding.Default;
Console.InputEncoding = Encoding.Default;
}
Console.WriteLine(Text);
Console.ReadLine();
} // Main
//===================================================================
// Ermitteln, unter welchem Windows das Programm läuft
//===================================================================
static int GetOperatingSystem()
{
ManagementScope scope = new ManagementScope("root\\CIMV2");
SelectQuery query = new SelectQuery("Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject item in searcher.Get())
{
string sCaption = (string)item.Properties["Caption"].Value; // Operating System
if (sCaption.Contains("Microsoft Windows 11")) return 11;
if (sCaption.Contains("Microsoft Windows 10")) return 10;
if (sCaption.Contains("Microsoft Windows 8.1")) return 81;
if (sCaption.Contains("Microsoft Windows 7")) return 7;
}
return 0; // kein Windows 7, 8.1, 10 oder 11 gefunden
} // GetOperatingSystem()
}
}
Und schon können UTF8-Zeichen, wie das €-Zeichen angezeigt werden.
Auch unter Windows 7 klappt es...
Link Text
So genau habe ich mich damit auch noch nicht beschäftigt.
Auf die Schnelle habe ich aber folgende Links gefunden:
C++ – Obtain a list of partitions on Windows
C++ method for Diskpart list disk
drive.c (Code für USB-Zugriff)
Edit:
In How to list physical disks? stehen auch einige Möglichkeiten (besonders Zugriff auf "\\.\PhysicalDriveX" sowie mittels Registry in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\disk\Enum).
@Finnegan
TOLL - das ist die Lösung, ich habe noch die Abfrage auf PageUp und PageDown ergänzen müssen. Right und Left spielt bei mir keine Rolle, kann aber nicht schaden
//=============================================
// Ausgabe von Tonsignal unterbinden
//=============================================
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.Up ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.Down ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.PageUp ||
richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.PageDown ||
richTextBox1.SelectionStart == richTextBox1.TextLength && e.KeyData == Keys.Right ||
richTextBox1.SelectionStart == 0 && e.KeyData == Keys.Left
)
e.Handled = true;
} // richTextBox1_KeyDown
Es geht aber noch einfacher, wenn man diesen Warnton generell nicht haben will, dann kann man die IF-Abfrage weglassen.
//=============================================
// Ausgabe von Tonsignal unterbinden
//=============================================
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
Nochmals DANKE für diesen Hinweis.
@firefly
Link Text
Es geht ja auch etwas um das Anzeigefenster, die Mail-Adressen sind breiter, als die Telefonnummern.
Ich werde in die Überschrift SIP/URI/Mail-Adresse schreiben. Dann ist hoffentlich alles klar.
PS: Du bist ja auch ein Frühaufsteher.
Hello this is Gulshan Negi
Well, ensure that the file is saved as an XML file and not in a different format such as a text file or word document.
Hope it will work.
Thanks
Guten Morgen,
ich möchte jegliche Art von Daten (string/byte[]) speichern, und zwar so, dass diese mit in der dll kompiliert wird.
Meine Ist was grob folgendes (pseudo):
[MyRessourceAttribute(type: "xml")]
class MyResourceX
{
private string _base64Content =".......";
public string AsString() => BitConverter.ToString(Convert.FromBase64String(_base64Content ));
public byte[] AsBytes() => Convert.FromBase64String (_base64Content );
}
Die klass wird dann via roslyn o.ä. erstellt,
Nun frage ich mich hab ihr vll. ne bessere , performantere idee, daten driekt in ner assembly zuspeichern und abzurufen!?
Ich denke schon dass ich verstehe was du machen willst.
Nur nicht wieso du meinst da dynamic oder Casts zu brauchen.
Das Setzen der Werte wird wohl meist über Strings passieren - Kommandozeile, Configfile - das ist ja alles textbasiert. Und beim Lesen wirst du die Objekte ja nicht per Name nachschlagen müssen. D.h. dort kannst du direkt auf die abgeleitete Klasse zugreifen.
public interface IParameterBase
{
string Name { get; }
string Description { get; }
string DefaultValueString { get; }
string ValueString { get; set; }
void ResetToDefault();
}
public interface IParameter<T> : IParameterBase
{
T Value { get; set; }
}
public class IntParameter : IParameter<int>
{
public string Name { get; private set; }
public string Description { get; private set; }
public string DefaultValueString
{
get { return m_defaultValue.ToString(); }
}
public string ValueString
{
get { return m_value.ToString(); }
set { m_value = int.Parse(value); }
}
public int Value
{
get { return m_value; }
set { m_value = value; }
}
public IntParameter(string name, string description, int defaultValue)
{
Name = name;
Description = description;
m_defaultValue = defaultValue;
m_value = defaultValue;
}
public void ResetToDefault()
{
m_value = m_defaultValue;
}
private int m_defaultValue;
private int m_value;
}
public class StringParameter : IParameter<string>
{
public string Name { get; private set; }
public string Description { get; private set; }
public string DefaultValueString
{
get { return m_defaultValue; }
}
public string ValueString
{
get { return m_value; }
set { m_value = value; }
}
public string Value
{
get { return m_value; }
set { m_value = value; }
}
public StringParameter(string name, string description, string defaultValue)
{
Name = name;
Description = description;
m_defaultValue = defaultValue;
m_value = defaultValue;
}
public void ResetToDefault()
{
m_value = m_defaultValue;
}
private string m_defaultValue;
private string m_value;
}
public class MyParameters
{
public IntParameter FooCount { get; private set; }
public StringParameter BarPath { get; private set; }
public MyParameters()
{
FooCount = Add(new IntParameter("foo_count", "Initial number of foo instances", 3));
BarPath = Add(new StringParameter("bar", "Path of the bar directory", "C:\\Bar"));
}
public void SetValue(string name, string value)
{
m_parameters[name].ValueString = value;
}
// if necessary:
public IParameter<T> Get<T>(string name)
{
// yes, this is a cast, but only in one central place.
// and I don't think this function would be needed often - if at all.
return (IParameter<T>)m_parameters[name];
}
private T Add<T>(T p) where T : IParameterBase
{
m_parameters.Add(p.Name, p);
return p;
}
private readonly Dictionary<string, IParameterBase> m_parameters = new Dictionary<string, IParameterBase>();
}
class Usage
{
public static void Example(MyParameters param)
{
param.SetValue("foo_count", "123"); // use string API to set value from cmdline/config-file
int i = param.FooCount.Value; // get value by accessing object directly
}
}
Du musst für den Zugriff immer Deine Credentials angeben. Du musst eben nur auf ein anderes Konto Zugreifen.
Exchange regelt das, ob Du es darfst oder nicht.
@hustbaer sagte in Warum klappt Binary bei mir nicht:
spielt ja der File-Cache immer mit rei
Das habe ich mir ja auch gedacht, deshalb habe ich jeweils zweimal das Programm laufen lassen.
Beim Delphi-Programm war der zweite Lauf schneller (warmer Cache).
Beim C# Programm war er allerdings langsamer, als der erste ( überhitzter Cache ??? )
Die Klammern sind normale Block-Klammern, wie bei anderen Anweisungen auch (if, for, while), d.h. bei nur einer folgenden Anweisung können diese entfallen.
Ab C# 8 können sogar die using-Anweisungen ohne Verschachtelung geschrieben werden (und gelten dann bis zum Ende des Blocks, in dem sie sich selbst befinden): using-Deklaration (es entfallen zur Syntaxerkennung dann die runden Klammern).
using var file1 = new FileStream(fileName1, FileMode.Open);
using var file2 = new FileStream(fileName2, FileMode.Open);
// keine Blockklammern mehr nötig
@hkdd https://www.microsoft.com/en-us/wdsi/filesubmission/ hätte ich noch gefunden. Da sollte man sich entsprechend als "Home user" auch mit einem privaten Account anmelden können.
Virus Total gibt dir auch aus, welche Hersteller ein Virus melden. Bei denen kann man i.d.R. auch False Positives melden.
@hkdd sagte in DivRem in BigInteger nicht vorhanden:
Jetzt habe ich new entfernt, damit klappt es.
Hast du auch eine Frage? Ist die Frage warum das "new" da nicht hingehört?
Falls ja, "DivRem" ist eine statische Methode und keine innere Klasse von BigInteger.
@hkdd sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:
@hustbaer sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:
Ich würde empfehle das mit using zu machen
Ich mache doch am Ende in jedem Fall folgende Close-Aufrufe - ist das nicht identisch ?
fs1.Close();
fs2.Close();
Bei der Anwendung meines Programmes ist es ja so, dass zwar viele Dateien und Bytes verglichen werden, es dabei i.d.R. aber weder Lesefehler noch Differenzen gibt. (...)
Mir ist das im Prinzip Wurst wie du das machst Ich wollte dich nur darauf hinweisen dass man das üblicherweise in .NET halt nicht so macht. Sondern eben using verwendet. Weil es eben nicht identisch ist. Deine Close Aufrufe werden halt nur erreicht wenn keine Exception fliegt. Die using Blöcke machen die Files dagegen auch in dem Fall zuverlässig zu.
Damit ist diese Funktion nur für relativ kleine Dateien nutzbar.
Ich würde ein paar GB schon als relativ gross bezeichnen. Ist halt relativ
Hallo Zusammen,
da ich schlicht nicht weiß, unter welchen Stichwörtern ich suchen muss, könnte es ganz leicht sein, das diese Frage schon zig mal gestellt wurde, ich aber einfach nicht weiß wie ich danach suchen muss.
Für diesen Fall bitte ich vorsichtshalber schon einmal um Entschuldigung und hoffe, das ich nicht verbal "zerlegt" werde.
Frage: Ich habe eine laufende Anwendung (Avaya IX Workplace) und ich möchte den aktuell angezeigten Präsenzstatus auslesen. Über Visual Studio habe ich die Methode "Avaya.ClientServices.Presence" gefunden, die mir diese Information liefern müsste. Kann ich den Wert einer Methode eines laufenden Programms auslesen und evtl. auch verändern.
Bin für jeden Hinweis dankbar
VG
Rainer
@Mechanics sagte in Dictionary mit 2 (alternativ) Key:
Guter Punkt, hab nicht drauf geachtet.
Hab mal kurz gegoogelt, gab wohl schon paar Versuche, die in die Richtung gehen, schaut mir auf den ersten Blick aber sehr fragwürdig aus.
ja das dachte ich mir auch ,und ich dachte es gibt vll. ne elegantere lösung.. egal;)
Hallo
ich hoffe es kann mir jemand helfen
ich würde gerne einen Datensatz zu meiner Liste hinzufügen schaff es aber nicht.
ich öffne eine XMLDatei und befülle mein Formular mit einer treeView,
wenn ich dann auf die Grupppe klicke wird meine listView befüllt.
Wenn ich dann einen Eintrag in einen anderem Formular öffne, ändere und wieder schließe wird alles richtig aktualisiert.
wenn ich aber einen neuen Eintrag hinzufügen will funktioniert es bis zum anzeigen in der listView.
Leider wenn ich dann in der treeView die Grupppe wechsle und wieder auf die vorherige Gruppe zurück gehe ist der neue Eintrag weg.
Wie schaffe ich es das der neue Eintrag gespeichert wird.
namespace BaumarktVerwaltung
{
public partial class FormMain : Form
{
private Datei datei = null;
public FormMain()
{
InitializeComponent();
}
private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "XML Dateien|*.xml|Alle Dateien|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
this.datei = Datei.Open(dialog.FileName);
this.datei.Save();
this.statusLabelCurrentFile.Text = dialog.FileName;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
this.ShowItem();
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
listView1.Items.Clear();
if (e.Node.Level == 2)
{
List<Produkt> produkts = datei.AbteilungListe.Find(x => x.Warengruppe.Contains(e.Node.Parent.Text)).GruppenListe.Find(x => x.Kategorie.Contains(e.Node.Text)).ProduktListe;
foreach (Produkt produkt in produkts) this.ShowItem1(produkt);
}
}
private void ShowItem1(Produkt produkt)
{
ListViewItem item = new ListViewItem();
item.Tag = produkt;
item.Text = produkt.ProduktId;
item.SubItems.Add(produkt.ProduktBezeichnung);
item.SubItems.Add(produkt.Marke);
item.SubItems.Add(produkt.Groesse);
item.SubItems.Add(produkt.Anzahl);
item.SubItems.Add(produkt.Wert);
this.listView1.Items.Add(item);
if(produkt.Anzahl == "10") item.BackColor = Color.Red;
}
private void ShowItem()
{
string ProjectPath = Assembly.GetExecutingAssembly().Location;
string WorkPath = Path.GetDirectoryName(ProjectPath);
datei = Datei.Open(Path.Combine(WorkPath, "Waren.xml"));
TreeNode Root = new TreeNode("Abteilungen");
treeView1.Nodes.Clear();
foreach (Abteilung item in datei.AbteilungListe)
{
List<TreeNode> nodes = new List<TreeNode>();
foreach (Gruppe gruppe in item.GruppenListe)
{
nodes.Add(new TreeNode(gruppe.Kategorie));
}
TreeNode node = new TreeNode(item.Warengruppe, nodes.ToArray());
Root.Nodes.Add(node);
}
treeView1.Nodes.Add(Root);
treeView1.EndUpdate();
}
private void editAbteilungToolStripMenuItem_Click(object sender, EventArgs e)
{
FormAbteilungen abteilungForm = new FormAbteilungen();
if (abteilungForm.ShowDialog() == DialogResult.OK)
{
this.ShowItem();
}
}
private void MenuItemWarengruppen_Click(object sender, EventArgs e)
{
FormGruppen gruppenForm = new FormGruppen();
if (gruppenForm.ShowDialog() == DialogResult.OK)
{
this.ShowItem();
}
}
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListViewItem item = this.listView1.GetItemAt(e.X, e.Y);
Produkt produkt = (Produkt)item.Tag;
FormProdukt produktForm = new FormProdukt(produkt);
if (produktForm.ShowDialog() == DialogResult.OK)
{
item.SubItems[0].Text = produkt.ProduktId;
item.SubItems[1].Text = produkt.ProduktBezeichnung;
item.SubItems[2].Text = produkt.Marke;
item.SubItems[3].Text = produkt.Groesse;
item.SubItems[4].Text = produkt.Anzahl;
item.SubItems[5].Text = produkt.Wert;
}
}
private void MenuItemNew_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode.Level == 2)
{
FormProdukt produktForm = new FormProdukt();
if (produktForm.ShowDialog() == DialogResult.OK)
{
//if (treeView1.SelectedNode != null)
//{
//gruppe = (Gruppe)this.treeView1.SelectedNode.Tag;
//gruppe.ProduktListe.Clear();
//List<Produkt> produktse = datei.AbteilungListe.Find(x => x.Warengruppe.Contains(Abteilungsname)).GruppenListe.Find(x => x.Kategorie.Contains(Gruppenname)).ProduktListe;
//foreach (ListViewItem item in this.listView1.Items)
// foreach (Produkt produkt in produktse)
// produktse.Add((Produkt)item.Tag);
//}
this.ShowItem1(produktForm.Produkt);
}
}
}
}
}
private void MenuItemNew_Click(object sender, EventArgs e) hier liegt der Fehler
Kann mir jemand helfen