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.
Nope: long ist ein System.Int64
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
C# type/keyword Range Size .NET type
long -9,223,372,036,854,775,808 Signed 64-bit integer System.Int64
to 9,223,372,036,854,775,807
@Smitty sagte in Zugriff auf Textdatei in der Projektliste:
Ganz einfach:
die Textdatei in die Projektmappe aufnehmen, auf die Ebene der .cs Dateien
dann sowas hier:
...
DANN ist die Textdatei ja auch da, nämlich in Deiner Anwendung! Allerdings statisch ...
... dann gibst Du Deine Anwendung weiter und aktualisierst zu Hause auf Deinem System die Textdatei.
Und nun soll die weitergegebene Anwendung erkennen, dass bei Dir zu Hause die Textdatei aktualisiert wurde ...
Und deshalb:
Leider erkennt der Compiler nicht wenn das txtFile aktualisiert wurde, hier hilft dann einmal neu erstellen.
Thats all
@micha7 War in der Nacht schon zu müde. Wenn ich Dir
@Swordfish sagte in Externe Anwendung starten und Fenster minimieren:
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.createnowindow?view=netcore-3.1
?
hinwerfe und Du darauf sagst daß Du das schon versucht hast dann gehe ich schon davon aus, daß Du den Beispielcode liest und genauso umsetzt wie im Beispiel angegeben. Von Deiner Aussage
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
startInfo.CreateNoWindow = true;
Das hatte ich schon ausprobiert, aber es zeigt keine Wirkung. Es werden trotzdem beide Fenster erzeugt.
kann man im Leben nicht darauf kommen, daß StartInfo.UseShellExecute nicht false gesetzt wurde. Auch empfand ich ehrlich gesagt
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
@Swordfish Wenn ich alles hinschreiben würde was ich schon ausprobiert habe und was nicht funktioniert hat, dann wäre der Text so lang dass du's nicht lesen würdest.
ziemlich daneben, denn entweder interessiert einen Leser etwas und er liest es oder er lässt es bleiben. Aber es gehört zum guten Ton bei einer Bitte um Hilfe zu erwähnen was schon versucht worden ist. Je vollständiger und präziser desto gut - das spart zeit- und nervenraubende Nachfragen. Bei der Kommunikation über solche Themen ist Präzision unbedingt notwendig.
Schreibe bitte in eine Zeile vor deinem Code ```csharp und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code, wähle in dem Drop-down in der Toolbar über dem Textfenster "C#" aus und klicke auf den </>-Button rechts daneben.
Du kannst Deine Beiträge auch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
Topic: Wenn das Ding immer global erreichbar und immer dasselbe ist ... wofür dann überhaupt ein Parameter dafür??
@Waly sagte in Möglich eigenständige C# (oder c++) Files zu kompilieren, damit man den Source nicht weitergeben muss:
ist es möglich eigenständige C# (oder c++) CS Files zu kompilieren, damit man den Source nicht weitergeben muss?
C# hat @Th69 ja schon beantwortet.
Bei C++ gibt es statische und dynamische Bibliotheken.
Kann man c# oder C++ auch in andern VS Projekten hinzufügen? So wie es bei Dephi möglich ist. PAS > DCU
C++ Source Files kann man immer mit C Source Files mischen. Sonst aber nichts.
C# Source Files kann man gar nicht mischen soweit ich weiss.
Wenn du aber eine Assembly (C#) bzw. Bibliothek (C++) erstellt hast, dann kann man das schon mischen. Die mit C# erstellte Assembly kannst du in allen .NET Sprachen verwenden. Und die mit C++ erstellte DLL kannst du quasi überall verwenden, vorausgesetzt du beschränkst dich auf ein reines C Interface.
Hab noch etwas gegoogelt. Um die schwarze Magie zu verwenden müsstest du hier Expression<Action<T>> als Parameter nehmen statt des Delegates. Das blöde dabei ist nur: um das Ding dann auszuführen müsstest du es runtime compilieren. Was zu Garbage und schlechter Performance führt.
=> Vermutlich nicht so gut.
Bessere Variante kenne ich nicht. Heisst aber nicht dass es keine gibt, ich bin was C# angeht nicht mehr wirklich auf dem Laufenden.
@DocShoe Ja das sieht wesentlich besser aus als mein Vorschlag
Ist trotzdem nicht schön, da alle Informationen schon zur Compile Time zur Verfügung stehen.
Eh. Aber das ist halt der Unterschied zwischen Generics und Templates. Über "T" ist im Generic nur das bekannt was als Constraint mitgegeben wurde. Hier also dass es ne "class" ist und dass diese einen Default-Konstruktor hat.
Es gibt wie vermutet eine technische Lösung, und sie heisst "depency injection" (DI).
Genauer beschrieben wird sie hier in den MS Docs:
Environment-based startup class and methods
Die Unterscheidung "development | production" (oder mehr wie z.B. "staging") wird in Visual Studio 2019 als String hinterlegt in "Projekteigenschaften / Debug / Environment variables":
Name
ASPNETCORE_ENVIRONMENT
Value
Development
Sowohl in der "startup.cs" der Azure App als auch den Azure App Pages "*.cshtml.cs" werden diese Namensräume hinzugefügt:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
Allen Methoden der "startup.cs" kann das "IWebHostEnvironment" Interface hinzugefügt werden:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsProduction())
{
// do something
}
else if (env.IsDevelopment())
{
// do something
}
}
Die Model-Klasse einer Page (bei mir "class IndexModel : PageModel") bekommt eine neue Eigenschaft:
private readonly IWebHostEnvironment Env;
und dessen Konstruktur einen neuen Parameter:
public IndexModel(IWebHostEnvironment env)
{
this.Env = env;
}
So erhält auch die Page die Umgebungsvariable.
Mit DI werden auch andere Objekte weitergereicht innerhalb einer Azure App, z.B. die "appsettings.json".
Hoppelmoppel
Wenn es nur unterschiedliche Vektoren sind, aber ansonsten alles gleich, kann man die Implementierung ja einfach als Template machen:
HRESULT query_something(WrappedSomething** result)
{
return query_impl(result, [WrappedSomething& r](){ r.data = query_something(); });
}