Laden...
Avatar #avatar-1651.gif
Programmierhans myCSharp.de - Experte
Coden was das Zeug hält Zentralschweiz Dabei seit 05.04.2005 4.221 Beiträge
Benutzerbeschreibung

Forenbeiträge von Programmierhans Ingesamt 4.221 Beiträge

07.09.2018 - 11:24 Uhr

(ich habe nicht alles im Detail durchgelesen).

Aber wie wäre es mit einem ganz anderen Ansatz.

Mit einem ContinueWith.

https://msdn.microsoft.com/de-de/library/dd537612(v=vs.110).aspx

Die Objekte würden sich dann selber für den nächsten Prozesschritt anmelden sobald sie verfügbar sind.

13.07.2017 - 15:10 Uhr

Mach den Designer mal im Debugger auf.. damit Du eine Ahnung hast wieso es knallt...

Hier hatte ich das mal beschrieben: UserControl kann im Designer nicht hinzugefügt werden

13.07.2017 - 14:29 Uhr

Du könntest das Zielform im Code so ändern dass es von Form erbt... dann scheint das kopieren ja zu funktionieren.

Nach dem kopieren änderst Du die Form wieder so ab, dass die wieder von Deiner Baseclass erbt.

11.04.2017 - 15:51 Uhr

Hallo herbivore

Danke für den Hinweis.
Habe ich sofort angepasst.

Gruss
Programmierhans

11.04.2017 - 15:15 Uhr

RangeCheck-Extension für IComparable:

Eine kurze generische ExtensionMethode um zu prüfen ob sich ein Wert innerhalb / ausserhalb oder auf der Grenze befindet.



    public static class Extensions
    {
        public static RangeCheck IsInRange<T>(this T pValue, T pBorder1, T pBorder2) where T: IComparable
        {
            return (RangeCheck)(Math.Sign(pBorder1.CompareTo(pBorder2)) == 0 ? 
                Math.Abs(Math.Sign(pValue.CompareTo(pBorder1))) + 1 : 
                Math.Abs(Math.Sign(pValue.CompareTo(pBorder1)) + Math.Sign(pValue.CompareTo(pBorder2))));
        }
    }



    public enum RangeCheck
    {
        Inside = 0,
        Border = 1,
        Outside = 2
    }


TestCode:

        private void Test()
        {

            int border1 = 3;
            int border2 = 7;

            System.Diagnostics.Debug.WriteLine("RealBorder (3-7)");

            for (int value = 1; value < 10; value++)
            {
                System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
            }


            border1 = 5;
            border2 = 5;

            System.Diagnostics.Debug.WriteLine("EqualBorder (5)");

            for (int value = 1; value < 10; value++)
            {
                System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
            }
        }
    }



Ausgabe:

RealBorder 3-7
1=Outside
2=Outside
3=Border
4=Inside
5=Inside
6=Inside
7=Border
8=Outside
9=Outside

EqualBorder (5)
1=Outside
2=Outside
3=Outside
4=Outside
5=Border
6=Outside
7=Outside
8=Outside
9=Outside

Edit: herbivore hat natürlich Recht... (Math.Sign eingebaut)

Range Check IComparable Extension

04.07.2016 - 12:50 Uhr

Hi,

Bei deinen Einschränkungen fällt mir dann somit auch nur eines ein:
Implementiere die Schnittstelle vollständig - und wenn es gar nicht anders möglich ist wirfst du bei Aufruf der Methode eine "NotSupportedException".

--> NotImplementedException 😃 Ansonsten sehe ich das auch so wie Du.

18.07.2015 - 09:53 Uhr

Tritt das noch auf wenn This.Invokerequired um && this.Handle != Intptr.Zero ergänzt ?

28.01.2015 - 16:12 Uhr

Herzlich willkommen.

Bitte als erstes dies hier beachten:

[Hinweis] Wie poste ich richtig?

Dann stellst Du konkrete Fragen.

Gruss
Programmierhans

15.12.2014 - 11:41 Uhr

Hallo Sebastian

Das mit dem Google für faule ist jeweils eher als Hilfe gedacht (ist doch bequem wenn man die Suche nicht selber tippen muss)... War sicher nicht böse gemeint.

Das mit dem ReferenceConverter... wie schon geschrieben schau mal welcher TypeConverter auf dem IComponent ist... und dann dessen Base... und schon haste den gefunden 😃

Sich in das Designerverhalten eigener Controls einzuarbeiten ist hart ... aber mit der Zeit verstehst Du da auch immer mehr...

Viel Spass beim experimentieren
Gruss
Programmierhans

15.12.2014 - 09:17 Uhr

Meiner Meinung nach fährst Du aber besser wenn Du die inneren Klassen von Component ableiten lässt (Dann brauchst Du auch den ReferenceConverter nicht... und kriegst gratis den Designer-Support)

Also in etwa so:




    public class MyClassA : System.Windows.Forms.Panel
    {
        private IContainer components;
        private MyClassB _Property1 = new MyClassB();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public MyClassB Property1 { get{return this._Property1;} private set{this._Property1=value;} }

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.components.Add(_Property1);
        }
    }

    
    public class MyClassB:Component
    {

        private IContainer components;
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.components.Add(_Property1);
        }

        private string _Name = "myClassB";
        public string Name { get{return this._Name;} set{this._Name=value;} }


        private MyClassC _Property1 = new MyClassC();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public MyClassC Property1 { get{return this._Property1;} private set{this._Property1=value;} }

        private BindingList<MyClassC> _Test=new BindingList<MyClassC>();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public BindingList<MyClassC> Test { get{return this._Test;} private set{this._Test=value;} }
    }

    public class MyClassC:Component 
    {
        private string _Name = "myClassC";
        public string Name { get { return this._Name; } set { this._Name = value; } }
    } 


Schau Dir mal auf dem Interface IComponent vorhandenen Attribute an...

15.12.2014 - 09:04 Uhr


    public class MyClassA : System.Windows.Forms.Panel
    {
        private MyClassB _Property1 = new MyClassB();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public MyClassB Property1 { get{return this._Property1;} private set{this._Property1=value;} }
    }

    [TypeConverter(typeof(ReferenceConverter))]
    public class MyClassB
    {
        private string _Name = "myClassB";
        public string Name { get{return this._Name;} set{this._Name=value;} }

        private MyClassC _Property1 = new MyClassC();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public MyClassC Property1 { get{return this._Property1;} private set{this._Property1=value;} }

        private BindingList<MyClassC> _Test=new BindingList<MyClassC>();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public BindingList<MyClassC> Test { get{return this._Test;} private set{this._Test=value;} }
    }

    public class MyClassC
    {
        private string _Name = "myClassC";
        public string Name { get { return this._Name; } set { this._Name = value; } }
    } 

Und im Form ergibt das dann:



            this.myClassA1 = new Test.MyClassA();
            this.SuspendLayout();
            // 
            // myClassA1
            // 
            this.myClassA1.Location = new System.Drawing.Point(79, 76);
            this.myClassA1.Name = "myClassA1";
            this.myClassA1.Property1.Name = "myClassB";
            this.myClassA1.Property1.Property1.Name = "myClassC";
            this.myClassA1.Size = new System.Drawing.Size(330, 152);
            this.myClassA1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(529, 297);
            this.Controls.Add(this.myClassA1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);



Gruss
Programmierhans

11.12.2014 - 16:47 Uhr

Oder mit minimem Aufwand

DataSet / DataTable mit dem Designer erstellen... DataSet hat WriteXml/ReadXml-Methoden um File zu lesen/schreiben.

11.12.2014 - 16:45 Uhr

Nur als blöde Frage damit gefragt ist...

Process.Start liefert doch schon den Process zurück... wieso nimmst Du nicht direkt den return der Methode statt nachher nochmal über die Processes zu loopen.

10.12.2014 - 08:41 Uhr

Wirf mal Google an mit "Typeconverter instancedescriptor"

Google-Suche nach typeconverter instancedescriptor

Das hilft Dir im Designer-Generated-Code die SubObjekte (inkl. Aufruf eines parametrisierten Konstruktors) zu erstellen.

Gruss
Programmierhans

09.12.2014 - 16:08 Uhr

Werden dabei auch Indizierte Felder geändert ? (ein Update von Indizierten Feldern ist teuerer als ein Insert).

05.12.2014 - 16:13 Uhr

Events und delegates wirst Du 100% brauchen (sind Grundlagen)...

05.12.2014 - 08:51 Uhr

Ich verwende Xamarin (nur für eine App welche auf unterschiedlichen Plattformenen rennen muss)...

UI-unabhängiges ist aufgrund der Mono-Libs fast zu 100% kompatibel mit Win-Version... UI sind alles die ios-spezifischen Baisisklassen.

Entwicklung mit Visual-Studio... kompiliert wird remote mit einem Build-Mac.

Ist sehr teuer... aber funzt (mal von gewissen Update-Problemen von Zeit zu Zeit) relativ gut.

04.12.2014 - 08:36 Uhr

DataBinding gehört in den UI-Thread

01.12.2014 - 17:29 Uhr

Die Versions-Dll NICHT im Bin ablegen sondern in einem Unterverzeichnis dessen....

Häng dich in AppDomain.CurrentDomain.AssemblyResolve - Event

Dann kannst Du entweder das eine oder das andere dll zurückliefern.

Aber Achtung: Einmal geladen ist geladen ! das kriegst Du nicht mehr raus.

28.11.2014 - 15:04 Uhr

Modale Forms müssen explizit disposed werden (oder per using).
Nicht modale Forms disposen sich selber wenn diese geschlossen werden.

25.11.2014 - 11:48 Uhr

Zusätzlich zu dem was vbprogger geschrieben hat....

Das findest Du sehr einfach raus beim Debugging...

z.B: setzt Du sFile zusammen aus sPath und labName... dies bevor Du sPath gesetzt hast... das kann ja nicht funktionieren...

Directory.Exists wenn am Pfad die Backslashes dran hängen... auch das ist nicht unbedingt schlau...

24.11.2014 - 16:32 Uhr

[FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls (wirst Du brauchen um Deiner nächsten Frage vorzugreifen (wie finde ich meine Controls aufgrund des Namens))

06.11.2014 - 15:23 Uhr

Verwendest Du beim Start der Anwendung Code um festzustellen ob die Anwendung schon läuft ... um diese laufende Instanz dann zu aktivieren ?

Dann könnte es sein, dass die neu gestartete Anwendung merkt, dass sie schon läuft (aber im Context eines anderen Users) und kackt dann ab wenn diese versucht die schon laufende Instanz in den Vordergrund zu holen.

Zugegeben ist einfach ein Schuss in's Blaue... aber könnte ja sein 😃

05.11.2014 - 21:00 Uhr

Wenn schon frickeln... Dann in etwa so

(Gar nicht so einfach zu editieren auf einem Pad)


using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    

    public partial class Form1 : Form
    {
        
       

        public Form1()
        {
            InitializeComponent();
        }

        public string Output 
       {
          get
          {
             return String.Format("/K \"C:\\DATA\\Intermec\\VW\\printraw.exe C:\\DATA\\Intermec\\VW\\{0} {1}\"", Configfile.Text, Printername.Text);
          }
       }


     

        //Sendbutton
        private void button1_Click(object sender, EventArgs e)
        {
            
           System.Diagnostics.Process.Start("CMD.exe", this.Output);
           
        }

       
    }
}

05.11.2014 - 20:33 Uhr

@SteelLynx1978

Na wenn Du keine erprobte Lösung willst, dann viel Spass beim frickeln.

Dieses Basisverfahren funktioniert bei Pago / Zebra / Intermec und sicher auch bei anderen Makrodruckern im Hostmodus.

Nb: ihr seid nicht die einzigen die aus SAP auf solche Druckertypen drucken.

Gruss
Programmierhans

05.11.2014 - 16:54 Uhr

Wenn es keinen Grund gibt dass man printraw verwenden muss... dann findest Du x-Beispiele im Internet wie das DIREKT geht (File einlesen und an einen Drucker pushen).

z.B: KB322091: Wie Sie unformatierte Daten an einen Drucker senden, indem Sie mithilfe von Visual C# .NET

Googeln nach "c# print raw"

05.11.2014 - 08:58 Uhr

Könntest Du das nicht ohne Array mit einem Counter und einem Decimal abfackeln.

Beispiel:

10+20+30+40+50=150 / 5 Messwerte = 30

Berechnung:

10 Count 1 = 10
20 Schnitt=Schnitt +((20-10)/Count) Count 2 = 15
30 Schnitt=Schnitt +((30-15)/Count) Count 3 = 20
40 Schnitt=Schnitt +((40-20)/Count) Count 4 = 25
50 Schnitt=Schnitt +((50-25)/Count) Count 5 = 30

Also immer Schnitt = Schnitt + ((NeuerWert-Schnitt)/NewCount))

Je mehr Messwerte Du hast, desto kleiner wird die Beeinflussung durch die Abweichung des neuen Messwertes zum Schnitt.

03.11.2014 - 17:06 Uhr

http://msdn.microsoft.com/de-de/library/8kb3ddd4(v=vs.110).aspx

/=Datumstrennzeichen... und das ist in DE nunmal der Punkt.

Wer lesen kann ist klar im Vorteil:

Um das Datumstrennzeichen für ein bestimmtes Datum und eine Uhrzeit-Zeichenfolge zu ändern, geben Sie das Trennzeichen in einem Zeichenfolgenliteral-Trennzeichen an. Die benutzerdefinierte Formatzeichenfolge mm'/'dd'/'yyyy erzeugt beispielsweise eine Ergebniszeichenfolge, in der "/" immer als Datumstrennzeichen verwendet wird. Um das Trennzeichen für Datumsangaben für alle Termine für eine Kultur zu ändern, entweder ändern Sie den Wert der DateTimeFormatInfo.DateSeparator-Eigenschaft für die aktuelle Kultur, oder instanziieren Sie ein DateTimeFormatInfo-Objekt, weisen Sie das Zeichen der DateSeparator-Eigenschaft zu, und rufen Sie eine Überladung der Formatierungsmethode auf, die einen IFormatProvider-Parameter enthält.

30.10.2014 - 21:18 Uhr

Stell dir ein Bild als Schachbrett vor. Es hat eine gewisse Anzahl Felder.
Ein kleineres Bild derselben Grösse hat gleich grosse Felder (aber logischerweise weniger).
Durch die Erhöhung der Resolution im kleinen Bild erhöhst Du die Anzahl der Felder (diese werden dadurch kleiner).

Dann ist es plötzlich ganz logisch.

Umgekehrt wird beim vergrössern eines Bildes nur Speicher verschwendet wenn man nicht gleichzeitig die Auflösung reduziert (ohne Reduzierung der Auflösung hast Du dann mehr Felder... Also 1 Ausgangsfeld wird auf mehrere Zielfelder projiziert).

Alles klar ? Ist so ähnlich wie die Körnigkeit in der Analogphotographie.

Das waren noch Zeiten als ich noch selber aus Schwarzweiss Negativen Abzüge erstellt habe 😃

Gruss Programmierhans

30.10.2014 - 16:41 Uhr

Du hast meinen Post falsch verstanden... lies es nochmals 😃

Statt bm2.SetResolution (das OriginalBild)

Mach newImage.SetResolution in der originalen ResizePicByWidth

Damit Du beim verkleinern des Bildes auf ein Bild mit kleinem Size aber hoher Auflösung zeichnest.

30.10.2014 - 09:52 Uhr

Du nimmst somit ein Bild... veränderst dessen Auflösung und zeichnest es dann auf einem kleineren Bild.

Hast Du mal versucht, statt beim OriginalBild die Resolution zu ändern in der ResizePicByWidth auf dem newImage die Resolution zu ändern ?

29.10.2014 - 11:49 Uhr

Und dann liest Du noch in Doku was der DataRowState ist... und dann müsstest Du es verstehen.

28.10.2014 - 08:27 Uhr

@herbivore

Ich gehe davon aus, dass Tools wie RawCopy ähnliche Mechanismen wie Backup-Tools verwenden... d.h: Dass sie Files in einer Art kopieren welche selber auch keine Sperren setzen... selber aber gesperrte Files kopieren können.

Gruss
Programmierhans

27.10.2014 - 18:14 Uhr

Offtopic:

Den Spruch muss ich mir merken...

VB6 war lange vor Dotnet da und VB.NET hat nur ein bisschen Syntax mit VB6 gemein, und eben die Programmierer.

PS: Man kann auch mit VB.NET mit einem sauberen Stil gute Programme entwickeln... wie auch mit C# friemeln und schlechten Code schreiben... aber die Tendenz ist schon da ... (VB=Viele Bastler).

Gruss Programmierhans

27.10.2014 - 18:09 Uhr

Wirf mal Google an 😃

z.B: RawCopy (selber NICHT getestet) kann gesperrte Files kopieren...

23.10.2014 - 13:20 Uhr

Mach doch ein ActiveX-Control und lasse das in einem VB(6) Form hosten... dann hast Du schon alles rundherum.

Creating an ActiveX control in .Net using C#

Wichtig aus eigener Erfahrung: ein ActiveX-Control MUSS von UserControl ableiten (also nicht von Panel oder sonstwas)... sonst werden die Events deines UserControls versenkt.

23.10.2014 - 09:35 Uhr

@FZelle: Delete ExecuteNonQuery ist sicher die schnellere Variante... mein Post war nur eine Anmerkung auf diesen spezifischen Satz:

Natürlich könnte ich auch ein SQL-Befehl zum löschen der Datensätze an die DB absetzen, ich wollte aber mit den bereits geöffneten DataAdapter/DataTable machen.

Gruss
Programmierhans

22.10.2014 - 17:23 Uhr

Wenn Du die Daten mit dem Update auf der DB killen willst...

Falsch:

dt.Rows.Clear();

Richtig:
jeden Record auf dt.Rows mit Delete löschen...
dann nimmt der Update diese Delete-Anforderungen mit und löscht auf der DB.

22.10.2014 - 17:19 Uhr

Also blieb im Endeffekt der Socket offen (aber niemand hat mehr die Daten verarbeitet) ?

21.10.2014 - 16:56 Uhr

TCP verschluckt nichts !

Es gibt folgende Möglichkeiten:

  1. Du meinst nur dass Du was sendest 😃 (z.:B bleibt alles lokal im Puffer)
  2. Auf der Empfängerseite ist der Socket offen aber niemand interessierts

Ich wiederhole nochmal:

Wenn auf der Empfängerseite kein offener Socket mehr ist, dann kannst Du entweder gar nichts mehr senden und kriegst sofort eine Exception... oder Du kannst genau 1 mal senden und beim 2 ten senden kriegst du eine Exception

Dies ist davon abhängig ob ein Socket ordentlich geschlossen wurde... oder ob nur unterwegs irgendwo etwas abgeraucht ist...

Ich habe schon x grosse Server mit TCP geschrieben welche in hoher Frequenz mit verschiedenen Clients / SPS-Steuerungen Daten austauscht... ich habe also ein klein wenig Erfahrung in dem Gebiet.

Poste doch mal ein wenig Code von der Sende und Empfangsseite... ev. ist es ja ein offensichtlicher Fehler 😃

Gruss
Programmierhans

21.10.2014 - 13:39 Uhr

Ich schrieb auch nicht dass die Anwendung abstürzt... sondern dein Lese-Thread...

21.10.2014 - 11:12 Uhr

Wie liest Du die Daten Synchron in einem eigenen Thread oder Asynch ?

Ich vermute eher, dass Du beim AUSLESEN ein Problem hast (dein Thread abstürzt oder Du keinen neuen Asynch startest)... das hätte genau den Effekt... Socket bleibt offen (deshalb merkt der Client nichts)... Und Du erhälst zwar die Daten... merkst es aber nicht ...

Nachtrag:
Wenn der Socket auf der Empfängerseite zu wäre... dann könntest Du je nach Konstellation 1 oder gar kein Paket mehr senden ohne auf der Senderseite eine Exception zu erhalten

21.10.2014 - 09:26 Uhr

Bei TCP kannst Du nur genau einen Send versemmeln (der geht in's Nirvana wenn die Gengenstelle nicht mehr verfügbar ist)... wenn Du dann nochmal was sendest, dann kriegst Du einen Fehler.

Also muss das was Du beschrieben hast einen anderen Grund haben (deshalb auch meine Frage nach virtuellen Maschinen... so etwas habe ich bisher nur auf virtuellen Maschinen gesehen).

20.10.2014 - 16:26 Uhr

Läuft der Service auf einem echten PC oder in einer VirtualMachine ?

16.10.2014 - 17:07 Uhr

Oder Du liest das XML in ein DataSet ein... bindest Die Objekte an die Rows... dann kannst Du mit DataSet.HasChanges jederzeit den Status abfragen... oder dich in die Events des DataSets einklinken

13.10.2014 - 13:21 Uhr

ClipRectangle ist nicht das ganze ClientRectangle des Controls... sondern nur der Bereich des ClientRectangles welcher aufgrund der Ueberdeckung nicht mehr gültig ist (das ist nur dann interessant wenn Deine Zeichen-Methode weniger zu tun hätte wenn diese nur einen Teil neu zeichnen müsste).

07.10.2014 - 09:29 Uhr

Im Extremfall kannst Du einen Treeview sogar flach auf einer einzigen Tabelle in SQL speichern.

Rekursiver TreeView Save/Restore aufgrund des FullPaths

Oder mit Selfrelation (ID / ParentID / Text)... wobei Nodes ohne ParentID = Root-Nodes.