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
@hustbaer sagte in Stackoverflow bei instanzierung eine großen Objekts.:
Ja. Oder sagen wir so: wenn es am JIT liegt, dann müsste das so sein. Bzw. auch umgekehrt: wenn es so ist, dann liegt es ziemlich sicher am JIT.
Alles klar Kommender ich kam bisher nicht dazu , heute probiere ich es
EDIT: @hustbaer Ja die zweite Instanziierung scheint schneller zu gehen;)
@whatever sagte in C# + ESP8266 (WemosD1Mini) Serielle Verbindung nicht möglich:
void loop() {
Serial.print('1');
delay(200);
}
...
while (true)
{
Console.WriteLine(port.ReadLine());
}
Wenn du mit ReadLine liest, dann wäre es schlau auch Zeilenumbrüche zu schicken.
Bzw. wenn du byteweise lesen willst, dann solltest du ReadByte verwenden.
while (true)
{
int b = port.ReadByte();
if (b >= 0)
Console.Write((char)b);
}
Hallo Leute,
ich habe noch ne ne Denker Frage: Ich möchte Met-Daten in Form einer Auflistung von "primitive" Daten in einem Attribute-Darstellen. Da die erlaubten Argument Typen in Attributen eingeschränkt sind, habe ich mir sowas in der Art vorgestellt, ist sehr kryptisch, aber einfach geht es wohl nicht!? Die Attribute werden "Maschinell" generiert, muss so für das menschliche Auge nich so schön sein:)
Bwp:
[MetaProperty(
new object[] { "A", typeof(System.Int32), "0" } ,
new object[] { "B", typeof(System.String), "a" },
new object[] { "C", typeof(System.Guid), "d0c3317b-52eb-4b9d-9f91-aafac1bbcd13" },
new object[] { "D", typeof(System.DateTime), "2021-21-8 07:44:44" })]
class X{}
Das Attribute Signatur sähe dann so aus:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MetaProperty : Attribute
{
// See the attribute guidelines at
// http://go.microsoft.com/fwlink/?LinkId=85236
public MetaProperty(params object[] ss)
{
}
}
Hab ihr vll. noch nei de, wie e schönes sein könnte? Am ende soll ne Dictionary mit den werten rausploppen;=)
Danke euch
@micha7 sagte in Visual Studio: Projekt kopieren und mit der Kopie weiterarbeiten:
Ein erfahrener Programmierer wird immer eine Lösung finden um sein Ziel zu erreichen. Ich habe noch nicht so viel Erfahrung. Mir ist es schon mehrfach passiert, dass ich irgendwas in einem Projekt verändert habe, und irgendwann geht plötzlich gar nichts mehr und man weiss nicht warum. Dann wünscht man sich dass man vorher eine Kopie gemacht hätte.
Daher wird ein erfahrener Progarmmierer ein VCS verwenden, wo man den alten Stand wieder herstellen kann, wenn man zu viel verpfuscht hat. Idealerweise sowas wie Github, dann ist dein Projektordner überall verfügbar, wo ein Internet-Zugang existiert.
@Tossi65 sagte in C# soll MFC Programm mit Event benachrichtigen:
Deshalb dachte ich an ein Event, welches die Werkerführung empfängt. ZUm Beispiel "OnExternalProgramFinished". Diese gibt es und wird von Programmen erzeugt, die durch die Werkerführung auch gestartet wurden.
OK. Scheint aber was proprietäres zu sein. Der Knackpunkt hierbei ist auch: das funktioniert, weil die Programme von deinem C++ Programm aus gestartet wurden. Das ist einfach. Wenn das Programm anders gestartet wurde, und vor allem wenn es weiter läuft nachdem ein Task fertiggestellt wurde, dann wird es ungleich schwerer.
Aber die Schnittstelle läuft komplett im Hintergrund, da sie mehrere verschieden Aufgaben hat.
OK. Eine offensichtliche Möglichkeit wäre jetzt die MFC Anwendung auch die DB pollen zu lassen. Ansonsten könntest du noch einen "out of process" DCOM Server in deinem Hintergrundprozess implementieren. Der kann dann irgend ein Kommunikationsobjekt "anbieten". Das MFC Programm könnte dann eine Instanz dieses Kommunikationsobjekts erstellen. Weiters müsste das MFC Programm noch ein Benachrichtigungs-Interface implementieren. Das Benachrichtigungs-Interface kann dann an das Kommunikationsobjekt übergeben werden. Da das Kommunikationsobjekt im Hintergrundprozess implementiert ist, erhält der Hintergrundprozess so Zugriff auf ein Interface in der MFC Applikation. Und kann dann über dieses Interface eben Funktionen in der MFC Applikation aufrufen.
Ich weiss jetzt halt nicht wie gut du dich mit DCOM und C#/DCOM Interop auskennst. Wenn nicht gut, dann ist das vermutlich alles ein bisschen viel. Wenn schon eher gut, dann könnte das ein guter Weg sein.
Hallo zusammen,
ich habe eine Anwendung (erstellt unter VS 2019), in der ein Barcodescanner der Fa. Zebra (DS 2278) eingebunden ist.
Für die Kommandos zum Scanner nutze ich die SDK der Fa Zebra.
Der Scanner ist entsprechend konfiguriert und das Scannen von Barcodes und QR-Codes funktioniert wie gewünscht.
Nun soll der Scanner auch in einer anderen Anwendung (keine eigene Entwicklung) eingesetzt werden. Dazu muss der
Scanner quasi als Tastatur arbeiten.
In meiner Anwendung ist es erforderlich, dass vor den gescannten Daten der Codetyp (Barcode / QR-Code) gesetzt wird.
Dies funktioniert über den Parameter "AIM". In der externen Anwendung darf der Codetyp jedoch nicht enthalten sein.
Ich habe in meiner Form zwei Events registriert, über die ich die Umschaltung durchführe. Die Events sind Form_Activated"
und "Form_Deactivate". Von hier setze und lösche ich z.B. die Funktion "AIM" des Scanners. Bis hierher funktioniert alles.
Die andere Anwendung erfordert jetzt zusätzlich, dass nach den gescannten Daten noch ein Tabstop angehängt wird.
Dieser Tabstop darf aber in meiner Anwendung nicht angehängt werden. Ich möchte nun den Scanner mit einem
zusätzlichen Kommando so konfigurieren, dass in meiner Anwendung kein Tabstop angehängt wird, außerhalb meiner
Anwendung soll dann der Tabstop angehängt werden. Diese Funktion kann ich in meinen beiden Events aufrufen.
Ich habe versucht, dass mit verschiedenen Konfigurationswerten zu realisieren, jedoch bisher ohne Erfolg. Die Doku
zur SDK ist hier leider keine wirkliche Hilfe. Hat jemand sowas schon umgesetzt und kann mir mit einem Codeschnipsel
weiterhelfen?
@Arti sagte in einfach verkettete liste, listen ende ermitteln:
ListElement listStart = new ListElement();
ListElement listEnd = null;
Warum ist das keine Datenstruktur List?
@hustbaer sagte in WPF DateTemplate eventhander memoryleak:
(Form-Unload oder Close oder sowas)
ja das meine ich auch mal gelesen zu haben, zum sollte man observableCollection statt IEnumerale /NotifyPropertyChange
verwenden um leak zu vermeiden.. aber is schon länger her als ich darüber gelesen hab
Ne mögliche alternative wäre, wenn die "generatoren" kein generisches Tree<T>/List<T> erzeugen würden sondern eine instanz einer Klasse die dann von Tree<T>/List<T> abgeleitet ist.
Dann wären die namen sprechender.
z.b.
class ConfigurationAsTree : Tree<string>
{}
@hustbaer: Schau dir mein zweites Beispiel an. Dies benutze ich selber in meinen eigenen Projekten sehr oft, damit ich für Zugriff auf die Sub-Namespaces nicht immer wieder den eigenen Main-Namespace angeben muß.
Afaik verwenden aber die Code-Generatoren immer die erste Schreibweise mit voll ausgeschriebenen Namespace.
Eigene Delegate-Typen braucht man i.d.R. nicht mehr definieren, sondern kann die Generics Action<...>, Func<R, ...> bzw. EventHandler<EventArgs> benutzen.