Laden...

Forenbeiträge von Frokuss Ingesamt 158 Beiträge

28.07.2021 - 15:46 Uhr

[...]
HLS ist am meisten verbreitet und supported[...]

Habe mal eben drüber gelesen... Verstehe ich richtig, dass hier die Kommunikation komplett über den Server lauft? Oder ist das doch ein P2P?

Das Projekt gucke ich mir nun auch einmal an... Aber dafür werde ich wohl was länger brauchen ^^

Danke dir 🙂

28.07.2021 - 15:13 Uhr

Hallo zusammen,

ich habe mir vor ein paar Monaten ein neues Projekt erstellt. Dort erstellte ich mittels RazorPages nen Webserver (ist ja quasi per Vorlage bereits verfügbar). Auf der Webseite wollte ich die Geräte wie Kamera und Mikrofon ansprechen, was auch soweit geht. Später habe ich noch SignalR eingebunden und konnte neben Text-Nachrichten noch das Video übertragen. Audio war aber nicht möglich.
Vor ein paar Tagen habe ich wieder Lust bekommen und wollte mich dem Problem widmen. Und siehe da, WebRTC sah vielversprechend aus. Allerdings habe ich für mich keine geeignete Webseite gefunden, die mir zeigt/hilft, wie ich meinen eigenen P2P-Server erstelle. Alle verweisen irgendwie auf einen externen Server und die Geschichte ist irgendwie erledigt...

Hier mal meine Fragen, in der Hoffnung ihr könnt mir da irgendwie weiter helfen 🙂
1.) Was ist überhaupt eine sinnvolle Technik um einen Audio-Stream von Browser-Client zu Browser-Client zu machen?
2.) Habt ihr einen/mehrere gute Stichpunkte zum googlen und eventuell Tutorials, wie ich einen gescheiten Server dazu erstelle in C#?

Ich code auch eigentlich nur so immer wieder mal zum Spass, weshalb meine Fähigkeiten doch an einigen Stellen mal mehr und mal weniger beschränkt sind... Falls ich daher auf einen völligen Holzweg bin, sagt mir das bitte 🙂

Viele Grüß Frokuss

10.01.2020 - 17:09 Uhr

Guen Abend 😃

ich habe jetzt die Tage erst Interfaces verstanden (zumindestens glaube ich das 😄 )... und bin jetzt auf abstrakte Klassen gestoßen.
Ich kann ja eine Klasse von einer anderen Klasse erben lassen, als auch gleichzeitig von einem Interface.

Jetzt ist für mich eine abstrakte Klasse eigentlich so ein Mischding aus einer Klasse und einem Interface. Kann ich von einer "normalen" Klasse und einer abstrakten Klasse gleichzeitig erben?

Gruß Frokuss

PS: ich habe noch kein bischen mit abstrakten Klassen bisher gemacht...

10.12.2019 - 20:06 Uhr

Cool, danke euch beiden. Habe mir das mal soweit alles angeguckt. Habe es jetzt mit einem Label und dem Click event geregelt... einfach mit dem bool check 😃

@Th69: Genau nach sowas habe ich gesucht <3 😃

Danke euch beiden Frokuss 😃

Nachtrag: Mit dem Click konnte ich meinen Fall etwas besser lösen, da ich an betreffenden Stellen das/die Events nicht entladen musste

09.12.2019 - 20:58 Uhr

Hallo Forum 😃

ist es möglich bei der CheckBox den quadratischen Kasten samt Häckchen auszublenden? Ich brauche nämlich ein Control, was selectable ist, als auch ein, bei dem ich prüfen kann, ob der Anwender es ausgewählt hat. Daher brauche ich auch das CheckChanged-Event. Mit dem

Appearance = Appearance.Button

komme ich leider nicht ans Ziel... da verschwindet der Butten irgendwie unter dem Text... sieht total chaotisch aus 😦

Gibt es eventuell auch eine alternative zur Checkbox?

Bzw... gibt es irgendwo eine Liste von Controls? Habe sowas noch nicht gefunden...

Gruß Frokuss

09.12.2019 - 17:09 Uhr

Ohhh. Damit habe ich nicht gerechnet 😦 Im Kino (35mm) liefen die Projektoren damals mit 24 Bilder / Sekunde (~41ms/Bild)... Die 50 sind dann doch etwas zu viel...

Gibt es denn Möglichkeiten das irgendwie zu umgehen - oder eine alternative?

09.12.2019 - 15:31 Uhr

Hallo zusammen 😃

ich habe mir eine Klasse erstellt, bei der ich die Höhe eines Controlls ändern kann und diese dann in einem angegebenen Zeitintervall (150 ms) seine aktuelle Größe zur neuen Größe verändert. Allerdings finde ich, dass diese "Animation" nicht flüssig aussieht. Dabei wird alle 5ms die größe neu berechnet und geändert.

Anmerkung: Die "Animation" beeinflusst auch alle Geschwister (Top) und alle Eltern (Height)

Hat jemand eine Idee, was, wie und wo ich besser machen könnte? Ich poste einfach mal meinen kompletten Code (~70 Zeilen).

   class AnimationResizeHeight {
        double oldHeight, newHeight, interval;
        Control control;
        DateTime triggerTime = DateTime.Now;

        private static System.Timers.Timer myTimer;
        public AnimationResizeHeight(Control control, int interval) {
            this.control = control;
            this.interval = (double)interval;
        }

        public int NewHeight {
            get { return (int)newHeight; }
            set { newHeight = value; }
        }

        private void Start() {
            oldHeight = control.Height;

            myTimer = new System.Timers.Timer(___Einstellungen.sys_animation_tick);//5ms
            myTimer.Elapsed += Evt_TimeEvent;
            myTimer.AutoReset = true;
            myTimer.Enabled = true;
            triggerTime = DateTime.Now;
        }

        public void Start(int newHeight) {
            NewHeight = newHeight;
            Start();
        }

        private void Evt_TimeEvent(Object source, ElapsedEventArgs e) {
            TimeSpan ts = DateTime.Now - triggerTime;
            double val = ts.TotalMilliseconds;

            if(val >= interval) {
                val = interval;
                myTimer.Stop();
            }

            Resize(val);
        }

        private delegate void ResizeDelegate(double time);
        public void Resize(double time) {
            if(control.InvokeRequired) {
                var d = new ResizeDelegate(Resize);
                control.Invoke(d, new object[] { time });
            }
            else {
                //double test = time / interval;
                double h = ((time / interval) * (newHeight - oldHeight)) + oldHeight;

                control.Height = (int)h;
                control.Update();

                if(control.GetType().Equals(typeof(Liste.Liste))) {
                    Liste.Liste liste = (Liste.Liste)control;
                    liste.CallParent();
                }
                else if(control.GetType().Equals(typeof(Liste.ListenElementDetail))) {
                    Liste.Liste liste = (Liste.Liste)control.Parent;
                    liste.ResizeMe(true);
                }
            }
        }
    }

Und wie folgt rufe ich das ganze ab:

animation = new AnimationResizeHeight(this, ___Einstellungen.liste_animation_aufklappen);
animation.Start(newHeight);

Ich hoffe ihr könnt mir da weiter helfen 😃

Liebe Grüße Frokuss

03.12.2019 - 13:35 Uhr

Ja, du hast recht... Ich neige manchmal die einfachsten Sachen unnötig kompliziert zu machen. Aber ist ja fix geändert...

Also vom Gedanken her wollte ich auf jeden Fall eine Server-Anwendung erstellen, die den alleinigen Zugriff auf die Datenbank hat. Diese verarbeitet dann die Komandos der ganzen Clients...

Gruß Frokuss

02.12.2019 - 16:40 Uhr

@T-Virus:
Das mit dem private set ist mal ne super geile Idee 😄 Habe ich noch nie vorher drüber nachgedacht 😄

@Abt:
warum ist das ein Fehler in der Architektur? Ich wolle ja nur verhindern, dass die ID sich grundlos ändern lässt. Jetzt habe ich halt genau einen einzogen Fall, in dem ich ihn ändern muss, da mir die ID noch nicht zur Verfügung steht. Ich habe damit die Möglichkeit wie sie mir T-Virus gezeigt hat, oder die Möglichkeit über einen "temporären"-Controll, der mit weniger auskommt und dann ersetzt wird...

Die ID muss nicht zwingend eine Zahl sein. Allerdings kommen die Daten (irgendwann mal) aus der Datenbank. Dort haben die Daten dann eine ID, die sich mit dem in meinem Controll decken würde. Sprich ändere ich den Text in meinem Controll, muss der Text auch in der DB geändert werden (und irgendwann mal im Jahr 3000 auch auf anderen Geräten). Dafür brauche ich die ID.

Ich habe jetzt das mal draus gemacht. Ich weis, ist natürlich total bescheuert, dass in 2 Methoden zu machen - will aber erzwingen, dass die ID nur in ausnahmefällen geändert wird.

        public int ID {
            get { return id; }
            private set { id = value; }
        }

        public int ___ID {
            set { 
                if(id == 0)
                    ID = value;
            }
        }

Aber mal ne Frage... welchen Wert hat denn ein int, wenn ich ihm noch keinen Wert zugewiesen habe? Also null ist es nicht... (int a, b, c;)

Ich kann meinen Anwendungsfall zwar erläutern - dann wäre dies aber wohl eher in der Rubrik WinForms einzuordnen...

Gruß Frokuss

Nachtrag: Darüber habe ich mir noch keine gedanken gemacht XD aber ich hätte sie aus einer DB gezogen... Ja, es handelt sich um eine UI für den Endnutzer. Also alles rund um den Server habe ich noch gar nicht gemacht... nichts!

02.12.2019 - 15:50 Uhr

Wunderschönen 😃

Also, ich wollte mal fragen ob es eine Möglichkeit den readonly Modifizierer zu umgehen gibt? Der Hintergrund ist, dass ich einen eigenen Control erzeugt habe der als Attribut: readonly int id; hat. Jetzt möchte ich allerdings dynamisch einen solchen Control erzeugen, ohne dass mir die ID bereits bekannt ist... Die ID muss nämlich (theoretisch - habe noch keine DB-Anbindung) vom Server kommen.

Ich vermute dass es nicht geht... Aber die hoffnung stirbt ja bekanntlich zu letzt...

Gruß Frokuss

01.12.2019 - 15:48 Uhr

Danke dir 😃 Habe noch ein paar echt doofe Fehler gefunden... aber das mit dem MouseClick-Event hat mir weiter geholfen 😃

Frokuss

30.11.2019 - 22:36 Uhr

Vermutlich arbeite ich wie nen Bauer (bin recht unerfahren)...

Aber ich verwende immer die Events Resize und ControllAdded...

Resize wird gefeuert, wenn das Control in der größe Verändert wird (z.B. durch den Parent)
ControllAdded wird gefeuert, wenn dem Control ein Control (neues child) hinzugefügt wird.

sprich, wenn du dem Form ein Resize Event zuweist, kannst du in der Resize-Methode auf die verschiedenen Controls eingehen und ihre größe anpassen. Wenn diese Controls auch Resize-Events haben, würden diese dann auch feuern (wenn sich deren größe geändert hat).

Gruß Frokuss

30.11.2019 - 22:26 Uhr

Guten Abend,

ich habe ein ContextMenuStrip erzeugt. Dies weise ich einem Panel (eigene Klasse) zu, welches komplett mit Labels bedeckt ist. Wie kann ich beim rechtsklick auf das Label das ContextMS im Panel aufrufen? Mit den anderen Events geht das irgendwie ziehmlich einfach...:

public class ListenElementDetail : Panel(){
        public ListenElementDetail (){
            Label l = new Label();//erzeugt mehrere Label
            PipeEvents(l);
        }

        private void PipeEvents(Control ctl) {
            ctl.Click += new EventHandler(Evt_LabelClick);
            ctl.DoubleClick += new EventHandler(Evt_LabelDblClick);
            //weitere Events...

            //ctl.ContextMenuStrip = //hier habe ich die Probleme...
        }

        //Exemplarisches Event - was das Event an den Parent weiter reicht (sagt man da so?)
        private void Evt_LabelClick(object sender, EventArgs evt) {
            this.OnClick(evt);
        }
}

Vielleicht kann mi da ja jemand weiter helfen...

Danke 😃
Frokuss

15.11.2019 - 17:55 Uhr

Ja gut. Da hast du vermutlich recht. dachte nur, wenn ich super viele Events habe, könnte sich das irgendwann etwas deutlicher auswirken.

Gruß Frokuss

12.11.2019 - 15:56 Uhr

Also unabhängig davon, dass ich Action noch nice vorher gehört habe, macht es erstei einmal Sinn das ganze weiterhin mit Events zu lösen.
Aber spielt es eine Rolle, wenn ich alle Events vom Kind auf die Eltern umleite oder ob ich den Kindern direkt durch die Eltern das Event zuordne? Oder ist das im Grunde irrelevant, weil es kaum einen Performence-Unterscheid gäbe?

Gruß Frokuss

10.11.2019 - 14:16 Uhr

Naja, ich dachte da gäbe es wohl einen Unterscheid... Aber wenns quas keinen gibt, ist es ja gut 😃

Gruß Frokuss

06.11.2019 - 18:24 Uhr

Hallo Leute,
habe da mal eine Frage, was sinnvoller wäre um mit Events zu arbeiten...
Ich habe mir 2 Controls - Liste ( : Panel) und ListenElement ( : Label) - erstellt. Eine Liste kann dabei beliebig viele ListenElemente haben, solange die ID des ListenElementes nur einmal vorkommt. Sprich ich habe mehrere Listen, bei denen ich mittels Drag&Drop die ListenElemente in eine andere Liste kopieren(!) kann.

Dabei ist es nun so, dass die Liste zu 100% von ListenElementen bedeckt ist. Das bedeutet, dass wenn ich etwas Droppen will, dass ganze auf dem ListenElement (Label) geschieht. Und das ist jetzt der Punkt an dem ich nicht weis, was sinnvoller wäre:

1.) Wie ich es aktuell habe:
Da das ListenElement nur Informationen über sich selber hat (z.B: die eigene ID), kann ich das Event zum Droppen nicht im ListenElement erstellen sondern muss dies in der Liste erstellen, die alle Informationen über seine Kinder hat.
Das bedeutet, wenn ein ListenElement in die Liste hinzugefügt wird, weisen ich direkt in der Liste dem ListenElement das DropEvent zu und habe damit alle Informationen aus der Liste zur Verfügung.

2.) Ich bin gestern Abend bei Suche auf einen kleinen Thread hier im Forum gestoßen: Click- und Hover-Events von Label an Parent (Button) weiterleiten?!?
Dort wurde geschrieben, dass es die OnXyz-Methoden gibt. Ich weise jedem ListenElement direkt in seiner Klasse Events hinzu nach folgenden Format:

        private void Evt_DragDrop(object sender, DragEventArgs evt) {
            if(this.Parent != null)
                    this.Parent.OnDragDrop(evt);
        }

und habe dazu dann in meiner Liste nur ein Event, was das ganze dann handelt.

Zusammengefasst:

  • Entweder weise ich jedem ListenElement ein Event in der Liste hinzu, oder
  • ich leite alle Events vom ListenElement an die Liste weiter (wie in dem Code-Beispiel)

Mir gehts ejtzt also eigentlich darum, was sinnvoller wäre, bzw. was performanter wäre... Hoffe ihr könnt mir da weiterhelfen 😃

Gruß Frokuss

06.11.2019 - 17:47 Uhr

Also 😄 Ich glaube nicht, dass du sehr kompliziert denkst... Denn das tue ich in der Regel... ;-D

Eigentlich wollte ich von zwei Klassen gleichzeitig erben. Was ja nicht geht. Deswegen dachte ich, dass da Interfaces helfen. Da in einem Interface allerdings nur public-Sachen sein dürfen, hilft das ganze mir nicht wirklich weiter... in dem anliegen. Es hilft mir aber dahingegen weiter, dass ich bestimmt Attribute (über get und set) und Methoden erzwingen kann.

Die Frage ist nun eher, warum ich das ganze wollte...
Ich erstelle mir grade eine "Liste" (Panels) die beliebig viele "ListenElemente" (Labels) enthalten kann. Jetzt wollte ich aber die möglichen Childs durch einen weiteren Control (ListenElementDetails) erweitern. Da jetzt aber ListenElement und ListenElementDetails vom gleichen Typ sein müssen, dachte ich mir, dass zumindestens das durch das Interface geregelt werden kann...

Aber... und das klingt jetzt unglaublich:

public Collection<Control> MyControls { get; }

ist schon die Lösung... ListenElement und ListenElementDetails sind beiden Controls... Ich §$%&/(
Ich habe vorher das verwendet:

SortedList<int, ListenElement> objElemente = new SortedList<int, ListenElement>();

Die Can[...]-Methode verwende ich quasi auch... heißt nur nicht so ^^ Aber was die Events angeht, werde ich einen neuen Thread (unter WinFOrms) aufmachen, da dies hier ja nichts zu suchen hat und noch mal ein anderes Problem enthält...

Bedeutet, eigentlich brauche ich nicht mal ein Interface (werde es aber trotzdem verwenen, um bestimmte Sachen zu erzwingen).

Super vielen lieben Dank 😃
Frokuss

06.11.2019 - 14:49 Uhr

Cool danke 😃 Das sieht jetzt einfacher aus, als ich erwartet habe XD

Was das ganze mit meinen Events angeht... Ich versuche das einfach so handzuhaben, dass jedes Control nur die Events implementiert hat, die es aufgrund seiner eigenen Daten auch richtig verwalten kann. Sprich mein Label hat nur die Information, ob es gedragt werden darf oder nicht. Dies wird dann dort auch gehandhabt. Und zwar nur das.

        protected bool evt_mouseDown = false, evt_dragStarted = false;
        bool allowDrag = false;

        public ListenElement(int id, string typ) {
            this.id = id;
            this.typ = typ;
            this.TextAlign = ContentAlignment.MiddleLeft;
            this.Font = new Font(___Einstellungen.schriftart, ___Einstellungen.liste_textheight, ___Einstellungen.GetStyle());

            this.MouseDown += new MouseEventHandler(Evt_MouseDown);
            this.MouseUp += new MouseEventHandler(Evt_MouseUp);
            this.MouseMove += new MouseEventHandler(Evt_DragStart);
            this.DragEnter += new DragEventHandler(Evt_DragEnter);
        }

        public bool AllowDrag {
            get { return allowDrag; }
            set { allowDrag = value; }
        }

        private void Evt_MouseDown(object sender, MouseEventArgs evt) {
            if(allowDrag)
                evt_mouseDown = true;
        }

        protected virtual void Evt_DragStart(object sender, MouseEventArgs evt) {
            if(evt_mouseDown && !evt_dragStarted) {
//Anmerkung: Da ich verschiedene Daten habe, brauche ich "typ" um die Daten-Art zu erkennen und die ID um den Datensatz zu identifizieren
                string val = typ + Daten.Daten.StringTrennzeichen + id;
                this.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
                evt_dragStarted = true;
            }
        }
//...

Auch werden dort Events implementiert, die seine Form ändern. z.B. bei meiner Liste wird bei einem Klick (auf die Kopfleiste) die Liste Maxi- bzw. Minimiert.

Das ganze ist allerdings noch etwas komplizierter als hier, da ich innerhalb einer Liste noch weiteren Listen haben kann.

Aber wie gesagt: Wenn das Control mit seinen Daten das Event handhaben kann, dann ist es dort implementiert, ansonsten ist es in einem Parent-Node (oder im Parent des Parent des ... 😄 ) implementiert. Ganz oben steht dann ein Objekt, dass so gesehen auf alle Daten und Controls zugriff hat. Das ist bisher das einzige womit ich in meinem Projekt unzufrieden bin... Vermutlich weil es die Schnittstelle zwischen den Daten und der Oberfläche ist...

Aber auf jeden Fall: Danke 😃
Gruß Frokuss

EDIT:
kleinen Fehler in meinem Code gefunden... DoDragDrop läuft ja synchron ab...

        protected virtual void Evt_DragStart(object sender, MouseEventArgs evt) {
            if(evt_mouseDown) {
                string val = typ + Daten.Daten.StringTrennzeichen + id;
                this.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
                evt_mouseDown = false;//Hier ist DoDragDrop bereits abgeschlossen. Deswegen brauche ich die Variable zur Kontrolle gar nicht...
            }
        }
05.11.2019 - 17:30 Uhr

Wenn das bei dir nicht reicht, weil dein Panel aus irgendeinem Grund die Ids wissen muss, dann kann das Interface helfen. Aber wie gesagt: Das klingt sehr stark danach, dass Du Schichten vermischst, die getrennt gehören.

Ich arbeite da aktuell mit diversen Events (unter anderem Drand&Drop)... Das bedeutet, jedes Label (Kind) darf nur maximal einmal im Parent (Panel) enthalten sein. Wenn es nicht vorhanden ist, wird eine Kopie des Label (Kind) gemacht. Jetzt kann es aber sein, dass sich ein Label (kind) ändert. Und dann soll sich jedes andere gleiche/geclonte Kind ändern. Ich habe daher mehrere Panels...
Das Panel verwaltet daher direkt, ob ich ein Kind überhaupt Droppen darf, oder nicht. Kenne mich aber noch nicht so gut mit den 3 Schichten aus... Achja... und die Kinder werden alphabetisch sortiert ^^

Wenn Du deinen Controls nun ein Interface gibst, dann musst Du bedenken, dass die Objekte, nur weil sie das Interface implementieren, nicht automatische Controls sind.
Ich würde es daher anders herum machen, dass Du nur Controls erwartest, aber darauf prüfst, ob sie das Interface implementieren und dann damit umgehst, alle ohne das Interface bekommen ein Default-Verhalten. Kannst du mir sagen, wie ich das anstelle?

Grüße Frokuss

05.11.2019 - 16:25 Uhr

Okay, ich danke dir ersteinmal für deine Erläuterung 😃 Hat mir zumindestens etwas weitergeholfen.

Das bedeutet für meinen Anwendungsfall, dass ich sinnvoll sein kann. Denn ich möchte zwei verschiedene Controls erstellen, die theoretisch in beliebiger Reihenfolge parallel auf der gleichen Control-Ebene (daher Parent ist der gleiche Knoten) sein können. Da ich in meinem Fall diese am besten in einem gemeinsamen Dictionary aufnehmen möchte, wäre es also ratsam 😃

Danke dir 😃
Frokuss

PS: von Unit-Test bin ich noch super weit weg ^^

04.11.2019 - 22:30 Uhr

Wunderschönen guten Abend,

ich habe mich grade einmal versucht in Interfaces einzuarbeiten. Aber irgendwie fehlt mir hier das Verständis für... Hatte gedacht, dass mir das irgendwie weiterhelfen kann...

Hintergrund hierfür ist, dass ich eigentlich aus zwei Klassen erben will - was aber nicht geht. Ich habe zwei Klassen, die jeweils von anderen Control (Panel und Label) erben und beide teilweise identische Methoden und Attribute haben. Daher wollte ich das ganze nicht doppelt erzeugen...

Habe ich es also richtig verstanden, dass mit interfaces eigentlich nur für folgendes helfen:
1.) nicht vergessen vom implementieren von Attributen und Methoden
2.) zum iterativen durchlaufen einer solchen "Sammlung"

So sieht aktuell mein erster Versuch aus:
Interface:

    interface IListenElement {
        int ID { get; }
        string Typ { get; }
    }

eine Klasse:

    public class ListenElement : Label, IListenElement {
        readonly int id;        //eindeutige Kennung
        string typ;
        protected bool evt_mouseDown = false, evt_dragStarted = false;
        bool allowDrag = false;

        public ListenElement(int id, string typ) {
            this.id = id;
            this.typ = typ;
            this.TextAlign = ContentAlignment.MiddleLeft;
            this.Font = new Font(___Einstellungen.schriftart, ___Einstellungen.liste_textheight, ___Einstellungen.GetStyle());
        }

        public int ID {
            get { return id; }
        }

        public string Typ {
            get { return typ; }
        }
}

Sprich in meinem Fall bringt mir das eigentlich nur mehr arbeit 😄 Vielleicht kann ja jemand etwas Licht hinter die Sache bringen... Wäre super 😃

Gruß Frokuss

PS: zumindestens habe ich endlich mal herausgefunden wofür dieses große I im "Klassennamen" steht XD Dachte die ganze Zeit das steht für I = ich 😄

28.10.2019 - 18:09 Uhr

Cool danke 😃 Dann gucke ich mir das alles mal näher an 😃

28.10.2019 - 17:27 Uhr

Also... ich glaube ich drücke mich ein wenig sehr umständlich aus... Sorry dafür!

Für mich steht fest, dass das ganze nur klappen kann, wenn es eine Stelle gibt, die alle kennt. Das ist meiner Auffassung nach die Aufgabe vom Server. Dieser leitet dann alles an die entsprechenden Clients weiter.
Dem Server sind die Clients erst bekannt, wenn diese sich bei ihm melden/registrieren.

Wenn du das mit der Architektur meinst, dann sind wir uns einige.

Ich habe aber bis dato noch nie mit ASP.NET und so irgendetwas gemacht. Und genau dies ist mein großes Fragezeichen. Bedeutet, im Idealfall kann ich das ganze in genau einer Serveranwendung implementieren. Ansonsten muss ich gucken, wie diese beiden Server-Teile kommunizieren können.

Das ganze HTML/CSS/JS-Zeugs stellt im Grunde kein Problem dar (auch wenn ich mit jQuerry noch nie etwas gemacht habe).

Werde mir mal das Azure angucken. Danke 😃

Frokuss

EDIT: Achso ne, das scheidet aus. Wills ja selber machen/lernen ^^ Und wenn ich dafür 2 Jahre brauche ist es auch okay 😃
Ist nur nen Hobbie von mir. Also nichts mit beruflichen Kontext.

28.10.2019 - 16:21 Uhr

Also mein Grundgedanke war, dass ich jedem User einen Thread (Prozess hast du ja abgeraten) zuweise und dort sämtliche Verbindungen von ihm habe.

Was ist "dort" und was ist "sämtliche" ?
Es kommt ganz drauf an was Du vor hast.

Damit meinte ich, dass ich in einem Thread alle Verbindungen eines einzelnen Anwenders habe. Daher, es kann ein Anwender über mehrere gleichzeitig Geräte verbunden sein. Bekommt er also z.B. eine private Nachricht, wird diese an all seine Endgeräte geschickt. Eigentlich auch alle anderen Nachrichten XD Das ist zumindestens das Ziel.

Dir bringt der Einsatz einer Technologie gar nichts, wenn Du Dich für einen Weg entschieden hast, der konzeptionell in echten Umgebungen gar nicht funktionieren kann.

Da stimme ich dir vollkommen zu. Ich dachte allerdings, dass ich einfach eine Verbindung aufbaue, dann kommt eh ne Firewall -Meldung - unter Windows - für ne Ausnahme am Client-System und das ganze ist geregelt?

Wo ich vermutlich Probleme haben werde ist, wie ich es schaffe, dass jemand aus dem Browser mit einem aus meiner Desktop-App kommuniziert. Das ganze wird ja eh über den Server laufen - so viel steht ja eh fest; zumindestens für mich.
Wenn ich die Quelle von M.I. richtig verstanden habe, geht es dort um "Browser zu Browser". Hilft mir aber dahingehend, das ich zumindestens erst einmal herausfinden kann, was wie wo mit diesem Ansatz geht. Bin da allerdings noch dran.

Gruß Frokuss

28.10.2019 - 13:22 Uhr

Ehm... Momentmal... worüber genau sprechen wir grade? Über "Webseite" zum Server, oder über (Desktop)-App zum Server? Oder laufen beide über HTTP? O.o

Ich habe mal vor 1,5 Jahre das mit ner Stream-Variante gemacht (glaube Networkstream) und konnte zumindestens innerhalb des Netzwerkes mit einem anderen Gerät eine Verbindung aufbauen und Nachrichten austauschen...

Also mein Grundgedanke war, dass ich jedem User einen Thread (Prozess hast du ja abgeraten) zuweise und dort sämtliche Verbindungen von ihm habe. Damit könnte er mit mehreren Geräten eingelogt sein. Das ganze dann über einen Dictionary geregelt, so dass ich anhand der User-ID auf den entsprechenden Thread zugreifen kann und dort dann die Nachricht senden kann. Das hat zumindestens im super kleinen (4 Geräte) geklappt XD

Gruß Frokuss

27.10.2019 - 15:39 Uhr

Ja... zum Server werde ich auch noch einige Fragen haben ^^ Hatt vor ca. 1,5 Jahren mal was gemacht, bei dem jede Verbindung in einen eigenen Thread war... Denke da nun in Richtung Prozess... Aber das muss ich mal gucken... kenne ich mich noch nicht mit aus und werde mich wohl bei Zeiten an euch wenden.

Bevor ich aber mit der Infrastruktur anfange, muss ich erst einmal gucken, wie das geht... Hatte schon genug Probleme ersteinmal mich hier zurecht zu finden, wo welche files liegen...

Gruß Frokuss

24.10.2019 - 12:44 Uhr

Was heißt denn "gesperrt"?
Ich würde eher sagen: man wurde nicht eingeloggt. Naja, aber bei mir ist auf jeden Fall nach dem login die Seite gekommen, bei der auch der Link angezeigt wurde, wenn die automatische Weiterleitung nicht funktioniert... Ich war auch für sehr sehr sehr kurze Zeit eingelogt. Konnte auf "meinem Profil" sehen, was ich aktuell betrachte.

Aber wie gesagt, löschen der Cookies hat hier weitergeholfen.
Frokuss

24.10.2019 - 12:39 Uhr

@M.I.: genau, quasi nen Chat. Danke dir 😃
@Abt: Ja, mit Client meinte ich Desktop, später vielleicht auch mal fürs Mobile-Endgerät. Sorry keiner vom Fach..

Einfach mal in die Microsoft Docs schauen.
Die sind gut, aktiv und aktuell - dafür sind sie da.

Durfte mir aber bereits häufiger anhören, dass ich auf veralteter Technik was mache... Und wollte es dann einfach mal anders angehen XD

Den Artikel habe ich ersteinmal überflogen und scheint in die RIchtung zu gehen, die ich dachte. Danke <3

Vielen Dnake euch beiden
Frokuss

24.10.2019 - 12:29 Uhr

Also, das löschen der Cookies hat bei mir zur Lösung verholfen. Ich wurde allerdings unmittelbar NACH dem login gesperrt und konnte weder einen neuen Post noch eine PM absetzen. Konnte also wirklich nichts machen...
Das ganze war mit dem FF 69.0.3 (64-Bit).

Gruß Frokuss

23.10.2019 - 21:18 Uhr

Hallo Leute,

ich habe bisher noch kaum Erfahrung mit "Netzwerk"... Ich möchte allerdings eine Server-Client-Anwendung erstellen, bei der es auch eine Browser-Schnittstelle gibt.
Dafür brauche ich glaube ich allerdings ASP(X)? Kann mir jemand sagen, was ich berücksichtigen muss, wenn ich möchte dass jemand aus dem Browser mit einem aus dem Client kommunizieren kann?
Habe auch noch nie etwas mit ASP gemacht 😄
Bin eigentlich für Literatur Tipps dankbar...

Gruß Frokuss

23.10.2019 - 21:10 Uhr

Hallo Leute,
wollte mal nachfragen, ob auch andere aktuell Probleme haben, mit dem Login? Ich kannte bereits vor ein paar Tagen mich hier nicht anmelden (dachte die Seite wird gewartet...)
Gefühlt war es so, als wäre ich gesperrt gewesen, bzw. als würde ich mich kurz nach der Registrierung befinden... Konnte mich also anmelden, aber keinen Beitrag schreiben...

Bin jetzt mit dem IE drinnen...

Gruß Frokuss

11.10.2019 - 17:11 Uhr

Danke, das war es... hatte einfach nur eine normale Bibliothek ausgewählt... Und dazu noch einen weiteren Fehler, dass meine classen teilweise nicht public waren... Jetzt geht es. Danke euch allen 😃

11.10.2019 - 13:14 Uhr

Danke für den Link... ist jetzt aber schon mal nen großer Brocken.

Ich dachte allerdings, es sei ein Vorteil, wenn ich bestimmte Teile in verschiedenen Projekten auslagere und dann dort mit den Namespaces arbeite. Wäre ja nur sinnvoll bestimmte Elemente auch für andere Projekte verwenden zu können... Dachte ich! Aber bei dem Aufwand, den ich aktuell betreiben muss, um dort einfach ganz normale Windows Label und Panels einzubinden, ist es mir das echt nicht wert 😦
Werde denke ich nun das ganze Projekt verschieben und dann dort als seperaten Namespace eingleidern. Man kanns auch so ausdrücken... Ich bin zu blöd dafür!

Gruß Frokuss

11.10.2019 - 11:43 Uhr

So bin ich vorgegangen...
1.) Rechtsklick auf Abhängigkeit
2.) Verweis hinzufügen
3.) Assemblys auswählen --> da wird keins angezeigt... weder bei Framework noch bei Erweiterungen
4.) Durchsuchen auswählen...

Aber kann dann mein Problem sein, dass er mir anzeigt, dass ich NETStandard 2.0 verwendet? Installiert ist ja NETFramework\v4.7.2 ...

Gruß Frokuss

EDIT: Bei der Klassenbibliothek kann ich höchstens Version 2.1 auswählen... Bei der WIndows-Anwendung kann ich hingegen quasi alles von 2.0 bis 4.8 auswählen...

09.10.2019 - 18:14 Uhr

Alles klar, danke euch beiden 😃

Nen bischen Trickreich war es, die Bibliothek auf dem System zu finden ^^ Bei mir lag sie in: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2

Die Durchsuchung des Systems hat mir aber mehrere Orte angezeigt...

Besser ist es vielleicht über ein Windows-Projekt zu gehen, dort den Objektkathalog auswählen, die System.Windows.Forms raussuchen (auswählen) und dort wird dann der absolute Pfad angezeigt.

Gruß Frokuss

09.10.2019 - 17:36 Uhr

Hallo Leute,

ich bin nicht wirklich mit Visual-Studio vertraut... Aktuell möchte ich eine Sammlung von verschiedenen Forms (angepasste Label, Panels, etc.) machen, bei denen ich aber keine exe haben möchte. Aber egal was ich auswähle, entweder kann ich keine using auf System.Windows.Forms machen, oder er erstellt mir eine exe.

Kann mir einer sagen, was ich dafür auswählen muss?

Gruß Frokuss

PS: oder gehört das eher zur Basis-Technologien?

01.10.2019 - 22:21 Uhr

An die Namespaces habe ich gar nicht dran gedacht XD

Danke 😄
Frokuss

30.09.2019 - 20:30 Uhr

Danke Lars. Werde mir mal das Addon angucken.

@FZelle: Unabhängig davon, dass ich das nicht mal für deinen Fall verwende... Ich habe z.B. eine Klasse Anwender und eine Klasse Kontakt. Zweiteres erbt vom ersten. Muss ich dann wirklich jede einzelne Klasse bei mir aufgelistet haben? Oder reicht es eventuell auch aus, wenn mir einfach nur Kontakt angezeigt wird?

oder: ich habe mir eine eigene Tab-Leiste erzeugt (jaja, ich weis, gibt alles schon fertig). Dort habe ich einmal das komplette konstrukt drinnen, dann die einmal die Tableiste, den Contentbereich und die einzelnen Tabs. Ich will jetzt nicht alle 4 Klassen angezeigt haben. reicht mir, wenn ich eine Klasse sehe... Hast du mehrere solcher Konstrukte, hast du nun mal viele Klassen... Und mit Partial-Klassen arbeite ich eher selten... Das mache ich nur, wenn ich so ~150 Zeilen Code gut in eine seperate Datei auslagern kann... z.B. die ganzen Events. Aber wie gesagt... kommt fast nie vor...

Gruß Frokuss

30.09.2019 - 17:41 Uhr

Hallo Leute,
habe bis vor kurzen noch mit SharpDevelop gebastelt... Bin nun auf VisualStudio umgestiegen und habe dort mein altes Projekt reingeladen. Funktioniert auch super. Aber, was ich in VS einfach nicht schaffe ist, dass ich im Projektmappen-Explorer eine CS-Datei auf eine andere schieben kann und diese dann eine Ebene tiefer angezeigt wird. Die alten importierten Dateien werden zwar eine Ebene (oder sogar mehrere) tiefer angezeigt, die in VS erstellten allerdings sind immer direkt unterhalb eines Ordner angeordnet.

Das ganze plustert meiner Meinung nach einfach nur alles auf und hilft ungemein die Übersicht zu verliren 😦 Kann mir einer sagen, wie ich also im PM-Explorer die Dateien Gruppieren kann?

Danke Frokuss

16.08.2019 - 15:58 Uhr

Ne, gab eigentlich keinen Grund dafür. Lade mir dann mal fix VS Community runter... hoffe das ist das richtige ^^

Vielen Danke 😃
Frokuss

16.08.2019 - 15:07 Uhr

Hallo Leute,

ich hoffe mir kann da jemand weiterhelfen... hatte das Problem bereits vor Monaten und bin damals auch nicht weiter gekommen.

Nachdem ich die ResourceFiles einbinde, kann ich mein Projekt nicht mehr kompilieren. Es kommt immer die Fehlermeldung:> Fehlermeldung:

Die Aufgabe konnte "AL.exe" mit dem SdkToolsPath-Wert "" oder dem Registrierungsschlüssel "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools-x86" nicht finden. Stellen Sie sicher, dass SdkToolsPath festgelegt, das Tool am korrekten prozessorspezifischen Speicherort unter SdkToolsPath vorhanden und das Microsoft Windows SDK installiert ist. (MSB3086)

Ich habe auch den Pfad in der Registry geprüft. da ist nichts, nicht mal eine andere Versionsnummer. Allerdings befindet sich eine AL.exe in folgenden Verzeichnisen:

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

Die Frage ist, wie kann ich dem Sharpdevelop mitteilen, wo die AL.exe liegt?

Hoffe ihr könnt mir dabei helfen. VG
Frokuss

13.08.2019 - 15:36 Uhr

Danke. Habe es jetzt hinbekommen. Habe den ganzen Code neugeschrieben... Muss wohl bei mir irgendwo ein logikfehler drin gewesen sein..

Grüße Frokuss

05.08.2019 - 15:24 Uhr

Hallo Leute,

habe ein weiteres Problem mit den Drag-Events... Und zwar habe ich mich gestern mit folgen Sachverhalt auseinander gesetzt:

Ich möchte, wenn der Anwender bei meinem Label das DragEnter-Event triggert, dass nach 500ms die Klick-Routine aufgerufen wird. Verlässt der Anwender allerdings innerhalb der 500ms wieder das Label - es wird daher DragLeave getriggert, soll die Klick-Routine nicht ausgeführt werden.

Parziel funktioniert dies auch. Allerdings kann ich die Routine nur einmal abbrechen - danach ist der ganze Sachverhalt blockiert.
Soll heißen, ich fahre mit der Maus drüber und verlasse das Feld innerhalb der 500ms, so kann ich danach nicht mehr das Drag&Drop beenden.

Dies ist mein Code:

object _dragIn ;

//Das DragEnter-Event:
		private void Evt_DragEnter(object sender, DragEventArgs evt){
			_dragIn = sender;
			
			Helper_AsyncDragEnter(sender, evt);
		}

//Meine Hilfsfunktion:
		private async void Helper_AsyncDragEnter(object sender, DragEventArgs evt){
			await Task.Delay(500);
			
			if(_dragIn.Equals(sender) && _dragIn != null){
				Evt_ClickFocus(sender, (EventArgs)evt);
			}
		}

//Das DragLeave-Event
		private void Evt_DragLeave(object sender, EventArgs ect){
			_dragIn = null;
		}

Im Grund gehts mir hier um die Machbarkeit. Daher, ist dies Prinzipiel machbar, oder ist mein Gedanke hier mehr oder minder mit gewalt mittels des Kopfes durch die Wand zu kommen?

Eine alternatove Möglichkeit die mir einfallen würde, wäre eventuell über das Move-Event... Aber ob dies sinnvoller oder Performanter ist, kann ich nicht beurteilen. Im Grunde würde ich bei dem Move-Event (bzw. in dem Fall das DragEnter-Event) dann mir einen Timestamp setzen und in der Move-Routine die Differenz abfragen...

Aber vielleicht kann mir ja jemand sagen, welche der beiden alternativen sinnvoller wäre - und wenn es die erste Variante ist, was ich dafür brauche.

Liebe Grüße Frokuss

05.08.2019 - 15:03 Uhr

Sorry, werde ich in Zukunft versuchen zu beachten.

Gruß Frokuss

30.07.2019 - 10:43 Uhr

Sobald DoDragDrop aufgerufen wird, passiert meines Wissens alles innerhalb dieser Routine, bis die Maus losgelassen wird. Ich vermute du hast da noch ein Problem mit den vielen Hilfsvariablen. So kompliziert muss das eventuell gar nicht sein. Die habe ich erst nachträglich eingearbeitet, weil es nicht so funktionierte wie erwartet..

Ich würde zuerst die Methoden so benennen dass man sieht was sie tun. Evt_DragStarten ist nicht "drag starten" sondern "Mouse move". Selbes mit dem Event QueryContinueDrag, da steckt eine Methode namens Evt_DragAbbrechen drin. Wenn der Name einem etwas anderes vorgaukelt als dahinter steckt, kannst du nur verlieren. Ja, du hast da nicht ganz unrecht.

Es könnten durch aus Fehler enthalten sein, da ich vieles direkt im Browserfenster geschrieben habe...
Das heißt der Code wurde so gar nicht ausgeführt? Es wäre schon hilfreich über Auswirkungen zu reden die zum gezeigten Code passen. Ich habe genau einen einzigen Satz fett hervorgehoben. Darunter folgt der kopierte Code.

Allerdings war das Thema für mich bereits abgeschlossen und sollte nur dazu dienen, falls jemand mal auf ähnliche Probleme stößt.
Gruß

28.07.2019 - 13:37 Uhr

Sooo Leute, habe mal etwas Zeit gehabt und mich etwas intensiver damit beschäfftigt. Allerdings ist mir das noch nicht zu 100% klar warum wieso und weshalb das alles so zueinander wirkt. Im Folgenden bitte nur berücksichtigen, dass ich keine IT-Ausbildung habe... Auf gehts:

Zunächst brauchen wir einmal 2 Controls, z.B. Labels die irgendwie dem Form zugeführt werden

Label starter = new Label();
Label ziel = new Label();

nach dem Microsoft Gedanken, können wir wiefolgt unseren Drag-Prozess starten (ist jetzt nicht von der Webseite kopiert):

starter.Click += new EventHandler(Evt_DragEventStarten);
public void Evt_DragEventStarten(object sender, EventArgs evt){
  Label l = (Label)sender;
  l.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
}

Das Problem hierbei ist, dass diese Arbeitsweise allerdings das Click-Event abwürgt. Daher die Events haben folgende Reihenfolger beim Triggern:

  • MouseDown-Event
  • Click-Event
  • MouseUp-Event
    Daher, das Click und das MouseUp-Event werden "abgewürgt".

Aus dem Grund habe ich nach einer Alternative gesucht. Das bedeutet, dass das Drag-Event erst später starten darf um zu differenzieren, ob ich nun Clicken oder Draggen möchte...

Aus dem Grund habe ich Folgendes gemacht:


bool isMouseDown = false;

starter.MouseDown += new MouseEventHandler(Evt_MouseDown);
starter.MouseUp += new MouseEventHandler(Evt_MouseUp);
starter.MouseMove += new MouseVentHandler(Evt_DragStarten);

private void Evt_MouseDown(object sender, MouseEventArgs evt){
  isMouseDown = true;
}

private void Evt_MouseUp(object sender, MouseEventArgs evt){
  isMouseDown = false;
}

//Startet DoDragDrop wenn die Maustaste gedrückt gehalten ist und dann die Maus bewegt wird
private void Evt_DragStarten(object sender, MouseEventArgs evt){
  if(isMouseDown){
    Label l = (Label)sender;
    string val = "Dies sind meine Beispieldaten, die ich übertragen möchte";
    l.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
  }
}

Zwischen dem MouseDown-Event und dem MouseMove-Event gibt es nun Wechselwirkungen. Wenn der Anwender einen Klick durchführt, wird in der Regel die Mouse im Klick-Prozess nicht bewegt. Wird sie allerdings im Klick-Prozess bewegt, treffe ich hier die Annahme, dass der Anwender das Element draggen will. Daher wird bei gedrückter Maustaste das Drag-Event gestartet.

Hieraus ergibt sich allerdings wieder ein neues Problem, Da hier ein MouseMove-Event verwendet wurd, wird dies im übertragenen Sinne unaufhaltsam getriggert. Also braucht das Event Evt_DragStarten auch eine Hilfsvariable um dieses Verhalten zu begrenzen (Anmerkgung: Ich habe mehrere Elemente die gedragget werden können die auch zugleich ein Drop-Ziel sein können:

bool isDragStarted = false;

private void Evt_DragStarten(object sender, MouseEventArgs evt){
  if(isMouseDown && !isDragStarted){//geändert
    Label l = (Label)sender;
    string val = "Dies sind meine Beispieldaten, die ich übertragen möchte";
    l.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);

    isDragStarted = true;//hinzugefügt
  }//ab hier hinzugefügt
  else if(!isMouseDown && isDragStarted){
    isDragStarted = false;
  }
}

Und genau an dieser Stelle habe ich etwas eigenartiges festgestellt: So wie ich Evt_DragStarten aufgebaut habe, wird dieses genau 2 mal ausgeführt... An sich nicht eigenartig. Allerdings veränderte sich der Mauszeiger mit der Mausbewegung, meine Hilfs-MessageBoxen wurden hingegen erst nach dem Ausführen des Drop-Events angezeigt... Keine Ahnung warum.

Theoretisch würde das ganze jetzt an dieser Stelle ganz gut funktionieren - sofern die Drop-Methode implementiert wäre; Allerdings möchte der Anwender eventuell auch den Drop-Vorgang abbrechen... Dafür brauchen wir mal wieder eine weitere Hilfsvariable... Eventuell gehts auch mit nur 2 Variablen aber das war mir jetzt etwas zu viel Fummelarbeit...

//Die Namen können minimal abweichen, da ich nun aus meinem Code kopiere!

bool isMouseDown = false;
bool isDragStarted = false;
bool isDragCancle = false;

starter.MouseDown += new MouseEventHandler(Evt_MouseDown);
starter.MouseMove += new MouseEventHandler(Evt_DragStart);
starter.MouseUp += new MouseEventHandler(Evt_MouseUp);
starter.DragDrop += new DragEventHandler(Evt_DragDrop);
starter.DragEnter += new DragEventHandler(Evt_DragEnter);
starter.QueryContinueDrag += new QueryContinueDragEventHandler(Evt_DragAbbrechen);
starter.DragLeave += new EventHandler(Evt_DragLeave);//relevant, wenn man in DragEnter den Style des Objektes verändert...

		private void Evt_MouseDown(object sender, MouseEventArgs evt){
			//Eventuelle Prüfung der Maustaste (Primärtaste [idR die rechte])
			isMouseDown = true;
			isDragCancle = false;
		}

		private void Evt_MouseUp(object sender, MouseEventArgs evt){
			//Eventuelle Prüfung der Maustaste (Primärtaste [idR die rechte]) siehe Evt_MouseDown
			isMouseDown = false;
		}

		private void Evt_DragStart(object sender, MouseEventArgs evt){
			if(isMouseDown && !isDragStarted && !isDragCancle){
				Control c = (Control)sender;
				string val =  c.Text;
				
				c.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
				isDragStarted = true;
			}
			else if(!isMouseDown && isDragStarted){
				isDragStarted = false;
			}
		}

public void Evt_DragEnter(object sender, DragEventArgs evt){
//irgendwelche Styles... oder z.B:
//evt.Effect = DragDropEffects.None;
//evt.Effect = DragDropEffects.Copy;
}

		public void Evt_DragDrop(object sender, DragEventArgs evt){
			isMouseDown = false;
			
			if(!isDragCancle){
				MessageBox.Show(evt.Data.GetData(DataFormats.Text, true).ToString());
			}
		}

		private void Evt_DragLeave(object sender, EventArgs evt){
//Styles "Rückgängig machen
		}
		
		private void Evt_DragAbbrechen(object sender, QueryContinueDragEventArgs evt){
			if(evt.EscapePressed){
				evt.Action = DragAction.Cancel;
				isDragCancle = true;
			}
		}

Das ist jetzt mein Code stark reduziert. Vielleicht noch hilfreich zu erwähnen wäre, dass bei einem Abbrechen (über ESC-Taste) das MouseDown-Event auf jeden Fall getriggert wird. Das Click-Event wird hingegen nur getriggert, wenn die Maus sich auf dem gleichen Objekt befindet, auf dem das MouseDown-Event getriggert wurde...

Ich hoffe es wird irgendwann mal jemanden helfen sich in diesem Wald zurecht zu finden. Und wenn einer sich frei fühlt ein Tutorial draus zu machen, gerne, kopiert so viel ihr wollt 😄

Grüße Frokuss

PS: Es könnten durch aus Fehler enthalten sein, da ich vieles direkt im Browserfenster geschrieben habe...

EDIT: In meiner Version habe ich mit einem Objekt gearbeitet, welches vom Label erbt und bereits dort ein Klick-Event zugewiesen wurde. Aus dem Grund taucht hier nirgendswo das Click-Event auf.

19.07.2019 - 23:05 Uhr

Hallo Leute,

ich setze mich jetzt aktuell seit ein paar Stunden mit dem Drag and Drop auseinander (mal wieder). Ich habe jetzt mal ein wenig experimentiert und bin dabei an meine Grenzen gestoßen...

Dabei bin ich auf mehrere Probleme gestoßen:
1.) beim drücken von ESC sollte das Drag-Event eigentlich abbrechen... Das QueryContinueDrag -Event wird auch gefeuert... Allerdings wird das DragDrop-Event trotz losgelassener Maustaste (nach dem ESC) beim MouseEnter ausgeführt... Keine Ahnung warum...

2.) Wenn ich den Drop-Auserhalb meines Fensters mache (z.B: Desktop-Oberfläche), muss ich über den Taskmanager nen kill machen...

Folgende Events habe ich erstellt / und mehreren Elementen zugewiesen:

//foreach(KeyValuePair<int, Control>kl in myDic){
//Event ist notwendig um Click und Drag zu differenzieren
kl.Value.liste.objChildsHeadline.MouseDown += new MouseEventHandler(Evt_MouseDown);

//Beim MouseMove wird das Drag-Event gestartet
kl.Value.liste.objChildsHeadline.MouseMove += new MouseEventHandler(Evt_DragStart);

//Event ist notwendig um Click und Drag zu differenzieren
kl.Value.liste.objChildsHeadline.MouseUp += new MouseEventHandler(Evt_MouseUp);

//Wenn der Drag losgelassen wird
kl.Value.liste.objChildsHeadline.DragDrop += new DragEventHandler(Evt_DragDrop);

//"Drag-MouseEnter"
kl.Value.liste.objChildsHeadline.DragEnter += new DragEventHandler(Evt_DragEnter);

//Das Event feuert, aber macht nichts...
kl.Value.liste.objChildsHeadline.QueryContinueDrag += new QueryContinueDragEventHandler(Evt_DragAbbrechen);
//}

Und dazu einmal die Methoden (reduziert und ohne ClickEvent):


		private void Evt_MouseDown(object sender, MouseEventArgs evt){
			isMouseDown = true;
		}
		
		private void Evt_MouseUp(object sender, MouseEventArgs evt){
			isMouseDown = false;
		}

		private void Evt_DragStart(object sender, MouseEventArgs evt){
			if(isMouseDown){
				Control c = (Control)sender;
				string val;
				
				val = c.Text;
				c.DoDragDrop(val, DragDropEffects.Copy | DragDropEffects.Move);
			}
		}

		public void Evt_DragEnter(object sender, DragEventArgs evt){
			if(evt.Data.GetDataPresent(DataFormats.Text)){
				string[] values = Daten.GetStringValues(evt.Data.GetData(DataFormats.Text, true).ToString());
				evt.Effect = DragDropEffects.Copy;
			}
			else  
				evt.Effect = DragDropEffects.None;
		}

//Dieses Event wird trotz des ESC drücken ausgeführt
		public void Evt_DragDrop(object sender, DragEventArgs evt){
			isMouseDown = false;
//mache was mit dem Drop....
		}

//Dieses Event scheint nicht das Drag-Event abzugrechen beim "ESC" drücken...
		private void Evt_DragAbbrechen(object sender, QueryContinueDragEventArgs evt){
			if(evt.EscapePressed){
				evt.Action = DragAction.Cancel;
//Hier war mal eine Testausgabe - die angezeigt wurde...
			}
		}

Meine Fragen sind daher:
1.) Was muss ich beachten, damit das Drag-Event beim ESC drücken auch wirklich abgebrochen wird?
2.) a.) Wie kann ich verhindern, das beim droppen auserhalb des Fensters meine Anwendung nicht abstürzt?
2.) b.) Und wie kann ich es trotzdem ermöglichen, dass ich in einem anderen Fenster (auch aus meiner Anwendung) etwas droppen kann? Soweit bin ich allerdings noch nicht, dass ich dies irgendwie testen könnte...

Ich hoffe ihr könnt mir da irgendwie weiterhelfen...
Liebe Grüße Frokuss

18.07.2019 - 14:20 Uhr

Allerdings würde folgendes aus dem artikel das wohl von dir nur bestätigen...

Bei der Enumeration wird jedes Element im Wörterbuch als behandelt eine KeyValuePair<TKey,TValue> Struktur, die einen Wert und ihrem Schlüssel darstellt. Die Reihenfolge, in der die Elemente zurückgegeben werden, ist nicht definiert.

18.07.2019 - 14:16 Uhr

Cool, vielen Dank euch beiden. Die Lösung von Th69 war in der Tat das was ich brauchte. Denke dieses OrderBy ist ähnlich zu SQL? Allerdings habe ich bisher noch nie in C# mit Linq gearbeitet (bis heute) ^^

Also. Vielen Dank euch beiden 😃
Frokuss

PS: Habe auch noch nie mit diesem ? statemants gemacht...

@david.m: Zumindestens kommt bei mir eine anschauliche Lösung raus. Ich denke der Dictionary wird der Reihenfolge nach abgearbeitet - daher das als erstes eingefügte Element wird auch als erstes in ner forech durchlaufen - allerdings habe ich ungefähr Null-Ahnung hiervon ^^