Laden...
D
Benutzerbeschreibung
Auf eigenen Wunsch gesperrt.

Forenbeiträge von Deaktiviertes Profil Ingesamt 985 Beiträge

20.12.2017 - 18:16 Uhr

Ok, man kann ein Fenster auch als „Overlay“ anzeigen (semi-transparent und durchklickbar).

Nach einer Zeit von ca. 200ms so ein Fenster anzeigen lassen bis die Aktion abgeschlossen wurde. Dadurch wird bei schnell durchlaufenden Aktionen nichts angezeigt und bei den langsamen kommt eben der Hinweis, der aber die Arbeit nicht stört (je nachdem wie transparent du das machst)

20.12.2017 - 18:00 Uhr

Der Anwender hat ja eine bestimmte Erwartungshaltung. Wenn er etwas auslöst, dann sollte instant eine Reaktion erfolgen.

Wie zeigst du denn das Resultat an? In einem Fenster?

Dann wäre es doch möglich, dieses Fenster schon zu öffnen und dort den Kreisel anzuzeigen.

20.12.2017 - 17:48 Uhr

@Arno

Dieser Meinung war man wohl bei Yahoo, Equifax etc. wohl auch, bis ...

20.12.2017 - 11:26 Uhr

Der Aufbau sollte immer wie folgt aussehen


  +-----+
 +-----+|      +-----+      +-----+
+-----+|+ <==> | API | <==> | DBS |
| App |+       +-----+      +-----+
+-----+

Dabei ist es unerheblich, ob es sich bei App um eine Desktop- oder Web- oder Mobile-Anwendung handelt. Alle gehen über die API.

Bei kleineren Projekten, wo es ausschließlich nur eine Web-Anwendung(s-Instanz) gibt, dann kann man das auch so aufbauen


+--------+      +-----+
| WebApp | <==> | DBS |
+--------+      +-----+

empfehlen würde ich aber auch hier den folgenden Aufbau


+--------+...+-----+      +-----+
| WebApp |<=>| API | <==> | DBS |
+--------+...+-----+      +-----+

wo der Zugriff über eine interne API geht.

Neben der Sicherheit (die so eine API-Schicht bieten kann bei richtiger Umsetzung) ist für mich das absolute Killer-Feature, dass ich mir bei den unterschiedlichen Devices keinen Kopf mehr um irgendwelche Datenbank-Treiber machen muss. Die API spricht bevorzugt HTTP/HTTPS mit JSON (wer mag auch XML) und mehr benötigt es nicht mehr.

20.12.2017 - 10:37 Uhr

Das passiert halt bei GroupBox.AutoSize = true 😁

19.12.2017 - 11:45 Uhr

Was ist denn daran komisch?

Wenn der Designer einen Eigenschaftswert bekommt, der gleich dem Default-Wert der Eigenschaft ist, dann wird dieser Wert im generierten Code nicht aufgenommen.

Möchte man nun einen anderen Default-Wert haben, dann muss man das auch mitteilen.

19.12.2017 - 10:38 Uhr

So


public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    [DefaultValue(BorderStyle.FixedSingle)]
    public new BorderStyle BorderStyle
    {
        get => base.BorderStyle;
        set => base.BorderStyle = value;
    }
}

Damit das auch wirkt: Solution entladen, Solution laden und schon geht es

18.12.2017 - 18:03 Uhr

Da der TE es nicht schafft einen ScreenShot von der Anzeige zu posten, poste ich mal einen ScreenShot von mir.

Da kann man sehen, dass die Auswahl weiterhin angezeigt wird. (Da wo der rote Pfeil drauf zeigt).

18.12.2017 - 16:05 Uhr

@Paschulke

Da ihr ja an dem aktuellen System festhalten wollt:

Eigentlich könnt ihr euch den ganzen Aufwand mit dem Update-Vor-Delete doch sparen, wenn ihr einen Delete-Trigger auf den Tabellen erstellt.

Der protokolliert dann auch sauber mit, wenn jemand „per Hand“ den Datensatz aus der Tabelle löscht.

Oder habe ich gerade einen Denkfehler?

18.12.2017 - 15:58 Uhr

@T-Virus

Mit Partitions (eine für die aktiven, die andere für die gelöschten) auf den Tabellen fällt das nicht wirklich ins Gewicht.

18.12.2017 - 14:56 Uhr

Hmmm, den Source kann man hier wunderbar als Text posten (Code-Tags verwenden). Ein ScreenShot ist nur von der Anzeige notwendig.

Warum hast du denn immer noch dieses LostFocus-Gedöns da drin? Nimm das raus und schau es dir dann an.

18.12.2017 - 12:31 Uhr

Es gibt natürlich noch die Möglichkeit statt dem Löschen den Datensatz per Flag als gelöscht zu markieren (also eben nicht wirklich löschen).

Wenn ihr eine ordentliche Trennung der Schichten habt, dann ist es auch kein Problem diese „gelöschten“ Daten aus den normalen Abfragen herauszuhalten und es sich trotzdem so anfühlt als ob die tatsächlich gelöscht sind.

18.12.2017 - 11:12 Uhr

Und warum gibt die Start-Methode das Klassenobjekt zurück (Stop tut es ja auch nicht)?

Weil der TE das wohl so verwendet


_blinker = new LableBlinking( label1 ).Start();

und er keinen Bedarf für


_blinker = new LableBlinking( label1 ).Stop();

sieht 😁

18.12.2017 - 11:07 Uhr

Und wenn du dem Admin das erste Mal auf die Finger gehauen hast, dann weiß er beim nächsten Mal, was er wieder löschen muss und du schaust dumm aus der Wäsche.

Und dann?

Ich habe solche Diskussionen schon mehrfach geführt, auch mit Leuten, mit denen ich privat gut befreundet bin. Trotzdem lasse ich die nur per API in das System schreiben, denn nur dafür übernehme ich die Garantie - für sonst nix.

Ein bestehender SQL-Server ist ja schön und gut, aber jeder muss sich darüber im Klaren sein, dass man hier keine 100% Garantie übernehmen kann, weil man nicht 100% Kontrolle hat. Das ist aber eher ein organisatorisches und kein technisches Problem.

18.12.2017 - 10:14 Uhr

Eine Datenbank sollte man nicht zur Betriebsh*re machen, wo jeder mal so daran herumfingern kann wie er lustig ist.

Aus diesem (guten) Grund werden Datenbanken mit einem Service gekapselt (vor eben diesen Fingern geschützt). Die Admin-Zugangsdaten zu dem Server (Service/Datenbank) selber kommen in einen versiegelten Umschlag und wenn das Siegel gebrochen ist, dann ist auch die Garantie flöten.

Ab jetzt gehen nur noch Zugriffe von der Anwendung (oder von wem auch immer) nur noch kontrolliert über den Service und der kann dann protokollieren.

Wenn es jetzt noch für irgendwelche Benutzer Bedarf an einem direkten Zugriff auf die Datenbank gibt, dann ausschließlich ReadOnly.

18.12.2017 - 09:25 Uhr

Das kann man halten wie ein Dachdecker.

Ich persönlich würde allerdings über die Eigenschaft/en gehen und ohne Parameter arbeiten.

17.12.2017 - 21:53 Uhr

Kann ich so nicht nachvollziehen. Ich habe es selber ausprobiert und die Selektion wird weiterhin angezeigt auch wenn der Fokus auf einem anderen Fenster liegt.

Eventuell beschreibst du mal (mit Source und ScreenShot) was denn nun nicht funktioniert.

17.12.2017 - 18:48 Uhr

Du hast die Doku gelesen? Komplett?

Auch, ab welcher .net Version diese Eigenschaft vorhanden ist?

14.12.2017 - 15:25 Uhr

Und trotzdem ist das doch ein neues Thema und dann sagen die Forenregeln: Mache einen neuen Thread auf.

13.12.2017 - 16:51 Uhr

Kennst du schon
>
?

Bei einer WinForms-Anwendung wäre das der richtige Hinweis, aber bei WPF heißt die Eigenschaft eben anders 🙂

13.12.2017 - 16:30 Uhr

Das könntest du im Quelltext der TextBox bzw. wohl eher TextBoxBase nachlesen.

Vom Prinzip her, weiß das Control selber ob es den Focus hat oder eben nicht, und ob das Anzeige-Fenster den Focus hat. Nur wenn beide Punkte erfüllt sind, dann wird die Selection angezeigt.

Allerdings könntest du ja mal die Eigenschaft TextBoxBase.IsInactiveSelectionHighlightEnabled anschauen, die riecht irgendwie danach, als ob die dir behilflich sein könnte. 😉

13.12.2017 - 16:10 Uhr

Nun ja, wenn du auf den Button drückst, dann hat der Button den Focus 😁

13.12.2017 - 15:45 Uhr

Nun du öffnest ja ein neues Fenster und dadurch verliert das Fenster mit der TextBox den Focus und deswegen wird die Selection nicht mehr angezeigt.

13.12.2017 - 15:37 Uhr

Das ist doch auch logisch, dass bei einer Menü-Auswahl der Focus nicht verloren geht, oder wie würde es sonst möglich sein den Menüpunkt Bearbeiten/Kopieren (und seine Kollegen) erfolgreich auszuführen?

13.12.2017 - 15:11 Uhr

Wenn das Feld aber den Focus nicht hat, dann wird das aber nicht funktionieren obwohl der Benutzer es erwarten würde (weil es ja so aussieht als ob es gehen müsste).

Dazu müsste der Benutzer den Focus wieder auf die TextBox setzen und dabei kann auch die Selection wieder zurückgesetzt werden.

13.12.2017 - 11:43 Uhr

Das geht mit einem JOIN (dazu gibt es genug Material im Web).

Aber so als Nachfrage:

Möchtest du damit den Auftrag ausgeben?

Das ist aber nicht sehr geschickt. Denn wenn sich die Daten des Kunden ändern (Umzug, etc.) dann wäre es doch schlecht, wenn sich diese Informationen auch auf alte Aufträge auswirken würde.

Darum werden solche Informationen (scheinbar redundant) zu jedem Auftrag gespeichert.

12.12.2017 - 21:16 Uhr

Das was du da vorhast mit der Selection-Fuktionalität umzusetzen ist wie mit einem Hammer die Haare kämmen.

Entweder es tut zu doll weh oder die Haare liegen nicht richtig.

Und warum?

Die Hauptintention des Hammers ist nun mal nicht Haare kämmen sondern Nägel in die Wand kloppen.

Die Hauptintention der Selection ist die Signalisierung für den Anwender, was beim nächsten Tastendruck ersetzt wird, bzw. was bei Strg-C in die Zwischenablage geht. Das mit dem LostFocusEvent wird eher darauf hinauslaufen den Anwender zu verwirren.

12.12.2017 - 18:39 Uhr

@Kuklinski

Wenn ihr hier aneinander vorbeiredet, dann liegt das an dir und nicht an den Anderen.

Wir sprechen hier ausschließlich über die Methode aus deinem ersten Post. Da ist kein switch Statement zu sehen, warum sollen wir uns also mit irgendeinem switch Statement auseinandersetzen, das wir nicht kennen.

Somit sprichst du also über Code, der nur dir bekannt ist und du versucht die Code-Beispiele (die sich auf die Methode aus dem ersten Post beziehen) in irgendeiner anderen Methode auszuführen.

Zeig also die relevanten Code-Teile denn sonst kann man dir gar nicht helfen, selbst wenn man jetzt (nach dieser Ansage) noch helfen möchte.

12.12.2017 - 16:04 Uhr

Und dieser Fehler soll uns jetzt was sagen?

Es wäre sehr hilfreich, wenn du die entsprechende Code-Stelle zeigen würdest, die diesen Fehler produziert, dann kann man auch etwas dazu sagen.

Bislang bleibt nur: „Oh, du hast da eine Exception beim Serialisieren!“

PS Ich habe zwar eine Vermutung, aber das wäre nur ein Schuss in die Nebelwand

12.12.2017 - 15:49 Uhr

Manchmal hat der Autor das selber nicht begriffen oder einfach einen Bug in dem Buch oder du hast es nicht genau durchgelesen und verstanden.

Such dir eine der Möglichkeiten aus.

12.12.2017 - 15:34 Uhr

Es scheint ja so, als ob dieses Event nur denjenigen interessiert, der die Methode aufruft.

In dem Fall ist es sinnvoller der Methode einen Callback mitzugeben und den Event zu entsorgen.

12.12.2017 - 11:28 Uhr

ja wie ich eine Text-Datei bearbeite ist mir klar. Aber eine .bat ist doch was anderes oder nicht?

Wie/Womit hast du denn diese Batch-Datei erstellt?

Etwa mit einem Text-Editor wie Notepad oder ähnliches?

12.12.2017 - 11:15 Uhr

Ja, scheinbar ...

allerdings auch nur für die Eigenschaft (Binding), die man gerade verändert. Bei komplexeren Modellen kann aber durch die Veränderung an Eigenschaft A die Eigenschaft B ungültig werden.

Ohne die Signalisierung des Events wird das dann aber nicht angezeigt.

12.12.2017 - 09:58 Uhr

Das ist wie bei allen INotify... Interfaces (INotifyPropertyChanged, INotifyCollectionChanged, usw.).

Das Binding von WPF funktioniert, weil die View auf diese Interfaces prüft, sich an den Event hängt und bei Signalisierung entsprechend handelt.

11.12.2017 - 23:30 Uhr

Bist du dir mit Eingabe muss aus Zahlen bestehen sicher?

Die Eingabe erfolgt als string und so ein string kann aus unterschiedliche Zeichen bestehen. Einige dieser Zeichen sind z.B. Ziffern.

+ oder - wären keine Ziffern. Deine aktuelle Prüfung würde diese aber als zulässig durchwinken.


-9
...
-1
+1
...
+9
-99999
...
-10000

Zudem werden auch führende Nullen akzeptiert.

Da solltest du einmal schauen, ob das wirklich gewünscht ist und dir über eine erweiterte Prüflogik Gedanken machen.

PS
Wenn du die Eingabe später als Zahl (int) verwenden möchtest, dann wäre es geschickt, wenn die Methode auch eine Zahl zurückgeben würde. Doppelt parsen ist da eher ungeschickt.

Eine geeignete Methode würde von der Definition z.B. so aussehen


bool FrageNachZahl( out int zahl )
{
    ...
}

Ist der Rückgabewert true dann hat man in dem Parmeter zahl die Eingabe. Bei false wurde die Eingabe abgebrochen (leere Eingabe).

10.12.2017 - 12:03 Uhr
  1. Es werden statische Funktionen und Klassen genutzt für jeden und alles
    ...
  2. Jede Änderung an einem Objekt führt dazu, dass das Objekt mit den neuen Eigenschaften neu erstellt wird und zurückgeliefert wird.

Die beiden Punkte widersprechen sich aber. Wenn es nur statische Klassen gibt, wie kann man dann Instanzen (Objekte) haben?

09.12.2017 - 12:32 Uhr

Die Zwischenschicht schützt nicht nur die Zugangsdaten, sondern auch den Zugriff insgesamt.

Die Datenbank lässt man exklusiv mit der Zwischenschicht kommunizieren, damit wirklich keiner dazwischenpfuschen kann.

Und schon ist nur noch das möglich, was die Zwischenschicht erlaubt.

Ein weiteres Schmankerl: Ich brauche mir keine Gedanken mehr über irgendwelche Datenbank-Treiber auf dem Client machen (ist der Treiber installiert, passt die Version, ...)

07.12.2017 - 20:18 Uhr

Wer Zugang zum Rechner hat (root Rechte) der kommt immer an alles dran, wo auch der Rechner selber dran kann, sonst käme auch der Rechner nicht dran.

Klingt logisch, ist aber anscheinend nicht immer offensichtlich.

So etwas lässt sich organisatorisch wesentlich sinnvoller und effektiver lösen als eine tolle Pseudoverschlüsselung.

07.12.2017 - 17:00 Uhr

Obwohl ich https://jsonutils.com noch lieber mag, denn dort kann man sich auch gleich die JsonProperty Attribute dranklatschen lassen. 😁

07.12.2017 - 12:05 Uhr

Du erzeugst die für jede Abfrage eine neue Command-Instanz. Das Command-Statement muss jetzt von der Datenbank interpretiert, compiliert, durch den Query-Optimizer geschoben usw. werden.

Dieses kannst du verhindern, wenn du Parameter verwendest. Die Command-Instanz wird einmal erzeugt, du setzt die Werte für die Parameter und führst das Statement aus.

Hier würde ich sogar DbCommand.ExecuteScalar empfehlen, weil du nur einen Wert haben möchtest.

PS Eine weitere Möglichkeit der Performancesteigerung kann die Verwendung von DbCommand.Prepare() sein (geht nur innerhalb einer Transaktion)

07.12.2017 - 11:50 Uhr

Wenn man sich nicht sicher ist, ob Pferd A oder Pferd B schneller ist, dann lässt man beide Pferde in einem (bzw. mehreren) Rennen gegeneinander antreten. Dann steht der Gewinner fest.

In .net ist z.B. string.IsNullOrEmpty derart umgesetzt, dass die Länge auf 0 geprüft wird.
Aus dem Bauch heraus würde ich auch sagen, dass das die schnellere Variante ist.

PS Bei einem Equals Vergleich von string wird auch erst die Länge der beiden verglichen und nur wenn die Länge gleich ist, wird überhaupt erst der echte Vergleich gestartet.

06.12.2017 - 18:47 Uhr

Was will du denn haben?

Soll "foo" und "bar" zu "foo and bar" werden, oder "fooandbar" oder wie?

06.12.2017 - 18:32 Uhr

@Gimmick

Die Antwort war doch sehr freundlich.

Ich hätte ja auch ganz lapidar mit [Hinweis] Bitte schau in die SDK-/MSDN-Doku antworten können (2. Eintrag in den FAQs) oder sogar mit [Hinweis] Wie poste ich richtig? Punkt 1.1 (1. Eintrag in den FAQs).

06.12.2017 - 11:34 Uhr

Es gibt auch noch so einen Schweinkram, dass man Partitionen in einem Ordner bereitstellen kann.

Dadurch kann man C:\Users physikalisch auf eine andere Partition (auch einer anderen Platte) legen, bleibt aber logisch C:\Users.

Das funktioniert auch recht gut, bis auf evtl. Probleme bei den Windows-Updates.

06.12.2017 - 11:25 Uhr

Der einfachste Weg wäre deinen Benutzerordner nach D: zu verlagern

06.12.2017 - 10:47 Uhr

Indem du dir mal die Dokumentation zu Type.GetProperties anschaust?

(vor allem die überladene Methode mit dem Argument)

05.12.2017 - 15:02 Uhr

stellt diesen zur Verfügung

Malt das PHP-Script den auf eine Tafel?

Das C# Script fragt ständig nach diesem Querystring

Indem es laut ruft oder wie?

Der Begriff Querystring ist in diesem Zusammenhang mehr als irreführend, denn dieser macht nur im direkten Zusammenhang mit einer Abfrage - ist Teil der Abfrage selber - Sinn. Auf eine Abfrage gibt es einen Response aber nix mehr mit Querystring.

Eine korrekte Benennung ist wichtig, weil ansonsten keiner versteht was los ist. Das ist so wie mit dem 710 Deckel beim Auto. Das ist der Deckel für den Öleinfüllstutzen (OIL auf dem Kopf gestellt sieht halt wie 710 aus).

PS Das hier ist ein Forum und kein Chat. Du kannst deine Beträge bearbeiten und noch weitere Informationen anfügen.

05.12.2017 - 14:44 Uhr

Stop.

Schau dir bitte meine Zusammenfassung an. Wenn das nicht den Tatsachen entspricht, dann erläutere bitte welches System wann, wie und warum an die Information xy kommt.

Dieser Prozess ist nicht eindeutig beschrieben.

05.12.2017 - 14:37 Uhr

Ich versuche mal zusammenzufassen, was ich bislang verstanden habe:

  • Da sind x Kameras (50-70)
  • die bei einem Ereignis eine URL aufrufen http://localhost:1234/whatever?KameraId=1&Alarmart=RED&...
  • Der Webserver, der diesen Aufruf entgegennimmt werkelt mit PHP

Wo soll jetzt dein C# da ins Spiel kommen?

05.12.2017 - 12:19 Uhr

Du blockierst mit Thread.Sleep den GUI-Thread (der wo eigentlich zeichnen würde wenn man ihn lässt).

So geht es ohne Blockieren


private async void MnuFileSrcFolder_Click(object sender, EventArgs e)
        {
                Form fw = new Form() { Width = 50, Height = 300 };
                System.Windows.Forms.Label l = new System.Windows.Forms.Label();
                l.Text = "Hallo Welt";
                fw.Controls.Add(l);
                fw.Show();
                await Task.Delay( 3000 );
                fw.Close();
         }