Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von LaTino
Thema: INI Datei - Erstellen, Auslesen und Anzeigen
Am im Forum: Rund um die Programmierung

Nimm's mir nicht übel, aber die Frage liest sich etwa so:

"Ich möchte mir gern Einstellungen speichern. Ich weiss, dass es dafür bessere Möglichkeiten gibt, würde mir aber trotzdem gern in den Fuß schießen. Also, wie schieße ich mir am besten in den Fuß?"

.ini ist tot. Und das nicht erst seit gestern, sondern seit gut 15 Jahren, das Konzept weigert sich nur hartnäckig, zu sterben. Tu' dir einen Gefallen und beschäftige dich damit, wenn du es wirklich musst. Lern stattdessen, wie .NET das Problem von persistenten Einstellungen löst (ja, mit XML, aber soweit abstrahiert, dass einen das eigentliche XML nicht interessieren muss).

Nachdem ich das losgeworden bin:

Reading and Writing Values from INI Files with C#

(aber nachher nicht heulen, wenn der Fuß weh tut!)

LaTino

Thema: Liste / Array mit Schlüssel und Wert [==> Dictionary<K,V>]
Am im Forum: Grundlagen von C#

Am Topic arbeiten wir aber noch, ja? Da wird ja kein Mensch schlau draus :D (ebenso irreführend übrigens der Hinweis darauf, dass es um irgendwelche Packets geht).

Ich schau mal, ob ich's richtig verstanden habe.

Beim Einlesen erstellst du eine Liste aus Tupeln (2er-Paare) von ObjId und UniqueId.

Frage eins: wenn die UniqueId auch wirklich unique ist, nimm doch bitte ein Dictionary, dessen Schlüssel die UniqueId, und deren Wert die ObjId sind. (Dictionary<uint,uint>). Das befreit dich von der Last, auch prüfen zu müssen, ob die UniqueID eines neuen Objekts wirklich eindeutig ist oder wegen eines Fehlers schonmal vorkommt (sowas erledigt das Dictionarty gleich mit).

Nun soll - ich weigere mich wegen der Verwechslungsgefahr zum Disposing, das ganze "zerstören" zu nennen - ein Objekt mit einer bestimmten UniqueId wieder aus unserem Dictionary entfernt werden.

Naja:


//if( wenn in der liste wo (a und b) stehen a = c ist ) {
if(myDictionary.ContainsKey(c)) myDictionary.Remove(c);

Das ist so einfach, dass ich befürchte, ich hab' dein Anliegen komplett falsch verstanden. Falls dem so ist, erklär' es bitte noch einmal so, dass auch deine Oma es verstehen würde.

LaTino

Thema: LogFile mit RegEx parsen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nicht nötig. Nur der überflüssige Quantifier ("?") in seiner regex hat ihm das Genick gebrochen.


var regex = new Regex(@"^(?<type>[A-Z]+)\s\((?<time>.*)\s+-\s+(?<source>.*)\)\s\[(?<message>.+)\]$");
var result = regex.Match(@"INFO (2017-06-02 10:12:22,625 - LOADER) [Forced listening port to [9083] in .config file]");

new [] { "type", "time", "source", "message" }.ToList().ForEach(p => Console.WriteLine(result.Groups[p]));

LaTino

Thema: LogFile mit RegEx parsen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


\[(.+)\]

(Getestet.)

LaTino

Thema: Nfo-Datei in WinForms darstellen
Am im Forum: GUI: Windows-Forms

Meine Güte. Hast du es wenigstens ausprobiert, was ich dir hier sage? Ich hab dir sogar den Code hingeschrieben, was brauchst du noch? Ja, ist ausprobiert, funktioniert hier bei mir lokal. Hätte mich auch gewundert, wenn nicht.

Nochmal zum mitmeißeln:

1. Encoding wählen, Codepage 437 (das ist die übliche nfo-Codepage)
2. beliebige - BELIEBIGE - Festbreitenschriftart einstellen, sehe screenshot oben

Mr-Know-It-All, vielleicht beschäftigst du dich mal ein bisschen mit Zeichensätzen und Schriftarten?

LaTino

Thema: Nfo-Datei in WinForms darstellen
Am im Forum: GUI: Windows-Forms

Zitat von TigerCrow
Hier wird garnix illegal irgedwie kopiert oder sonstiges ... es geht nur um eine nfo datei einzulesen und sonst gar nix

und die Datei selber habe ich im netz gefunden .. also bitte nichts unterstellen !!!

Klar, und wir ziehen uns die Hosen mit der Kneifzange an. Macht man so, wenn der erste Kontakt mit Warez mehr als 25 Jahre her ist. Korrekte Codepage auswählen, beliebige Festbreitenschriftart verwenden. Steht so auch 1:1 in der Wikipedia, aber was wissen wir schon.

Leute gibt's...

Thema: Nfo-Datei in WinForms darstellen
Am im Forum: GUI: Windows-Forms

Zitat von TigerCrow
@LaTino
leider geht das net ... falscher Zeichencode

Zeichencode? Meinst du eventuell Encoding? Wieso stellst du das nicht einfach ein?


using(var reader = new StreamReader(@"example.nfo", Encoding.GetEncoding(0x1b5))
   richtextbox1.Text = reader.ReadToEnd().Replace("\r", string.Empty);

Davon abgesehen war das von meiner Seite die letzte Hilfestellung beim Versuch, illegale Filmkopien zu archivieren. Pfui.

LaTino

Thema: Nfo-Datei in WinForms darstellen
Am im Forum: GUI: Windows-Forms

In der RichTextBox einfach eine Festbreitenschriftart einstellen, war dir zu einfach?

LaTino

Thema: Für XML Attribut Gleichheit 1 Aktion
Am im Forum: Grundlagen von C#

Spätestens an der Stelle würde ich auch nicht mehr von Hand parsen, sondern mein XML in die Zwischenablage tun, als Klasse einfügen, etwas refaktorieren und dann per XmlSerializer arbeiten:


var serializer = new XmlSerializer(typeof(TextureCollection));
TextureCollection collection;

using(var file = File.OpenRead("example.xml"))
using (var reader = XmlReader.Create(file))
    collection = (TextureCollection)serializer.Deserialize(reader);

...und fertig.

LaTino
EDIT: grad mit Stoppuhr in der Hand ausprobiert, Aufwand waren 48 Sekunden inkl. Erstellen der Klassen ;)

Thema: Von berechneter Zeit Stunden subtrahieren und anzeigen
Am im Forum: Grundlagen von C#

TimeSpan.Subtract()


myShinyNewTextbox.Text = tagesarbeitszeit.Subtract(TimeSpan.FromHours(8.5)).ToString();

Außerdem, sobald du das Windows.Forms-Projekt als richtiges Programm und nicht nur zur Ausgabe deiner Tests nutzen möchtest:

Windows Forms Databinding

Schließlich und endlich sind für Anwendungsfälle, wie du einen hast (sprich: "ich probier ein bisschen code aus und brauche nur eine Ausgabe") die sogenannten Unit Tests (Komponententests) perfekt geeignet.

Einführung in die Komponententests

Viel Erfolg beim Lernen!

LaTino

Thema: Unterschied: Methodenaufruf im Parameter/ Variable im Parameter
Am im Forum: Grundlagen von C#

Zitat von Sir Rufo


public int Bar => _data.Value;
ist aber kurz und knapp und IMHO sehr gut lesbar und darum darf das dann bleiben.

Jupp. Ich würde behaupten wollen, der Hauptgedanke dahinter war tatsächlich, wrapping zu erleichtern. Zum Beispiel so ein Konstrukt hier, was in der Art hin und wieder mal vorkommen kann:


public class WrappingList<T> : IList<T> 
{
    private readonly List<T> _internalList;
    
    #region IList-Implementierung
     public IEnumerator<T> GetEnumerator() => _internalList.GetEnumerator();
     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
     
     //..usw usf.

    #endregion
}

Verringert den Tippaufwand einfach enorm und zeigt beim Lesen auch gleich an: "Achtung, nur ein Wrapper, bitte weitergehen, hier ist nichts interessantes!".

Ansonsten ist es eh' nur für Einzeiler geeignet. Wenn es da zu unübersichtlich wird, sollte man an seinem Stil arbeiten.

LaTino

Thema: Unterschied: Methodenaufruf im Parameter/ Variable im Parameter
Am im Forum: Grundlagen von C#

Was Sir Rufo sagt. Ich wollte nur das Coderauschen (alles, was nicht relevant fürs Beispiel ist) gering halten. Die Schreibweise ist ab C# 6.0 (Visual Studio 2015) im Sprachstandard.


public string FormatAsShortDate(DateTime example) => example.ToString("d");
//ist dasselbe wie:
public string FormatAsShortDate(DateTime example) 
{
    return example.ToString("d");
}

public int CalculatedBmi => Mass / (Height * Height);
//ist dasselbe wie:
public int CalculatedBmi
{
   get 
   {
        return Mass / (Height * Height);
    }
}

LaTino

Thema: Linq gruppierte Zeilen in Spalten splitten um CSV-Datei zu erzeugen
Am im Forum: Datentechnologien

Ich wollt's gestern nicht noch editieren, aber wie gesagt, für eine reine "Konvertierung" Textdatei -> Textdatei ist Linq nicht (unbedingt) der beste Weg, besonders, wenn man in den Operationen Zeichenketten verkettet oder andersweitig mehrfach enumeriert werden muss.

Das laesst sich auch in wenigen Zeilen so erschlagen, dass der Leser (im Zweifel dein 12 Monate älteres ich) sofort nachvollzieht, was los ist:


var outputLines = new Dictionary<string, StringBuilder>();
using (var file = new StreamReader("input.csv"))
{
    string line;
    while ((line = file.ReadLine()) != null)
    {
        var splits = line.Split(';');
        if(splits.Length != 3) continue;

        if (!outputLines.ContainsKey(splits[0])) outputLines.Add(splits[0], new StringBuilder(splits[0]));
        outputLines[splits[0]].Append($";{splits[1]} {splits[2]}");
    }
}

using (var file = new StreamWriter("output.csv"))
    outputLines.Select(p => p.Value).ToList().ForEach(p => file.WriteLine(p.ToString())); //sortieren, filtern, was auch immer: hier, nach dem Select/vor dem ForEach ist der Zeitpunkt für Linq.

LaTino

Thema: Unterschied: Methodenaufruf im Parameter/ Variable im Parameter
Am im Forum: Grundlagen von C#

@Abt, ich glaube, es geht bb1898 vielmehr darum:


private int GetInt() => 6;

DoThis(GetInt, 25);
DoThat(GetInt(), 25);

abstract void DoThis(Func<int> firstParameter, int secondParameter);
abstract void DoThat(int firstParameter, int secondParameter);

In dem Fall (ersterer) würde man aber von einem Delegaten sprechen. Insofern sehe ich da nicht die Verwechslungsgefahr, eher die Gefahr, den TE völlig unnötig zu verwirren.

LaTino

Thema: Rechtschreibung - oder die mangelnde Sorgfalt beim Erstellen eines Beitrags
Am im Forum: Wünsche und Kritik

Zitat von MrChangeLog
Zudem: schlechte Rechtschreibung aus fehlgeleiteter Tolleranz einfach zu ignorieren, hilft im endeffeckt niemandem. Darauf hunzuweisen jedoch schon.

Da hast du völlig Recht. Allerdings geht es nicht darum, jemanden auf Fehler hinzuweisen (da bin ich immer dabei!), sondern ihn gleich auszusperren, weil man sich von ihm respektlos behandelt fühlt. Und so sehr besonders und einmalig jeder von uns - besonders ich - hier ist, sollten unsere Gefühle beim Lesen eines scheinbar lieblos hingeschluderten Beitrags doch keine Rolle dabei spielen, wer hier mitreden darf, und wer nicht.

LaTino

Thema: Rechtschreibung - oder die mangelnde Sorgfalt beim Erstellen eines Beitrags
Am im Forum: Wünsche und Kritik

Zitat von MrChangeLog
Sich keine Mühe zu geben, einen ordentlichen Beitrag zu verfassen finde ich im Übrigen nicht nur schade, sondern respektlos!

Wir drehen uns im Kreis. Die "respektlos"-Argumentation wurde bereits diskutiert. Es ist nicht alles das, wonach es sich anfühlt, und die Moderatoren sehen sich (dankenswerterweise, möchte ich sagen) nicht bemüßigt, Beiträge danach zu moderieren, wie sie sich für einzelne Leser anfühlen könnten. Das sage ich als jemand, der in seinen Bekannten- und Kollegenkreisen als Rechtschreibnazi bekannt ist. Die Gründe für laxe Rechtschreibung sind vielfältig, und im Zweifel bin ich für den Angeklagten.

LaTino

Thema: Linq gruppierte Zeilen in Spalten splitten um CSV-Datei zu erzeugen
Am im Forum: Datentechnologien

Halte ich erstens nicht für einen besonders geeigneten Fall für Linq, und zweitens kannst du doch einfach den hier machen:


StringBuilder myStringBuilder = new StringBuilder();
erg.ToList().ForEach(element => 
{
    var idString = string.Join(";", element.ID_Menge);
    myStringBuilder.AppendLine($"{element.Gruppe};{idString}");
});

File.WriteAllText(outputFile, myStringBuilder.ToString());

In diesem speziellen Fall ist zeilenweises Einlesen, dabei "manuelles" Umgruppieren, und schließlich eine direkte Ausgabe vermutlich schneller und besser nachvollziehbar.

LaTino

Thema: [Erledigt] C#/VBA - Konvertierung von object[] in Variant möglich?
Am im Forum: Office-Technologien

Zitat von FZelle
Das zeigt wieder einmal das viele Leute nicht verstanden haben was das var statement ist.

Ohje, erst mit deinem Statement habe ich überhaupt verstanden, was die Vorposter dachten...das sind ja Abgründe.

@lukasS, das ist eher eine VBA-Frage: dein Ansatz, object[] zurückzugeben, ist mMn schon korrekt. Das Auspacken wird, wenn ich dich richtig verstehe, von deinem VBA-Schnippsel aus erledigt. Du müsstest also dort (und hier verlassen mich meine VBA-Kenntnisse - CTYpe oder so?) auf die wichtigsten Datentypen, die vorkommen können, testen, und entsprechend umwandeln.

LaTino

Thema: Boolsche Algebra: a~b~c + ~a~b = ~b~c + ~a~b Wir können Rechenweg nicht erklären
Am im Forum: Smalltalk

Bisschen umständlich, all das oO


(1) (!A & !B & C) | (A & !B & C) | (!A & !B & !C) =                    //!B ausklammern
(2) !B & (!A & C | A & C | !A & !C) =                                       //innen: C aus den ersten beiden ausklammern
(3) !B & (C & (!A | A) | !A & !C) =                                          //!A | A ist überflüssig
(4) !B & (C | !A & !C) =                                                        //aus"multiplizieren", i.e. erweitern
(5) !B & ((C | !A) & (C | !C))                                                 // C | !C ist überflüssig
(6) !B & (C | !A)                                                                  //und da ist schon die KNF

Schritt 4->5 wäre auch die Herleitung der Antwort auf deine Frage im ersten Post.

LaTino
(EDIT: falsche Ausgangformel. (mittlerer Term müsste !C sein, richtig?) Ändert aber nichts an den Schritten.)

Thema: Boolsche Algebra: a~b~c + ~a~b = ~b~c + ~a~b Wir können Rechenweg nicht erklären
Am im Forum: Smalltalk

Oder bring den Ausdruck in die KNF, dann sieht man's sofort.

LaTino

Thema: Boolsche Algebra: a~b~c + ~a~b = ~b~c + ~a~b Wir können Rechenweg nicht erklären
Am im Forum: Smalltalk

Ich hab zwar Mathe studiert, aber diese Sytax war mir komplett neu (und ziemlich gewöhnungsbedürftig).

(¬a && ¬b) || (a && ¬b && ¬c)

True, wenn nicht b und nicht a. (erster Term)
Außerdem:
True, wenn nicht b und a und nicht c. (zweiter Term)

Um insgesamt true zu werden, muss also auf jeden fall b false sein.
Wenn zusätzlich a false ist, ist das Gesamtergebnis true, egal, wie Term 2 ist.
Wenn a true ist, muss c false sein. Das bedeutet, im zweiten Term ist a irrelevant. Der wird eh nur ausgewertet, wenn a true ist.

LaTino

Thema: Gleichzeitig versch. DataTables als DataSources für DataGridView und DataGridViewComboBoxColumns
Am im Forum: GUI: Windows-Forms

Ach, f...adammt^^ Kann ich nicht mit Sicherheit sagen, weil ich DataTables scheue wie der Teufel das Weihwasser und mir schlicht die Erfahrung damit fehlt. Es sollte mich aber wundern, wenn es 1:1 so ginge, und nicht einen Kniff braucht. Müsste man mal probieren.

LaTino

Thema: Gleichzeitig versch. DataTables als DataSources für DataGridView und DataGridViewComboBoxColumns
Am im Forum: GUI: Windows-Forms

Es gibt auch die Attribute [Browsable] und [DisplayName]. Die beiden beeinflussen die bei AutoGenerateColumn = true erzeugten Spalten.


class DataExample
{
    [Browsable(false)]
     public string A { get; set; } //spalte wird nicht erzeugt
    [DisplayName("Spalte B")]
    public DateTime B { get; set; } //spaltenheader ist "Spalte B"
    public int C { get; } //normale erzeugung
}

Macht das Leben leichter (kein händisches Hinzufügen von Spalten, wie p!lle das macht (nein, das ist deshalb nicht falsch, nur umständlich)) und erlaubt die Verwendung von AutoGenerateColumns in mehr Fällen, so dass man es wirklich nur noch in Spezialfällen ausschalten muss.

LaTino

Thema: Fragen und Antworten je nach Auswahl in eine Form geben => MVC Pattern verwenden
Am im Forum: GUI: Windows-Forms

Zitat von Palin
Bei neuen Projekten, sollte man vieleicht direkt auf WPF setzen oder das MVVM Pattern für Windows Forms in betracht ziehen.
entwickler.de: MVVM und WinForms

Sehr geil, wie er in dem Tutorial MVVM sagt und MVP umsetzt xD Tut aber nix zur Sache, daher OT.

LaTino

Thema: Variable aus einer anderen Form abfragen
Am im Forum: GUI: WPF und XAML

[FAQ] Kommunikation von 2 Forms

LaTino

Thema: Rechtschreibung - oder die mangelnde Sorgfalt beim Erstellen eines Beitrags
Am im Forum: Wünsche und Kritik

Stimme ich dir zu. Ich weiß zwar nicht, ob ich das machen würde, aber ich hab Verständnis, wenn solche Beiträge den Moderatoren gemeldet werden.

LaTino

Thema: Fragen und Antworten je nach Auswahl in eine Form geben => MVC Pattern verwenden
Am im Forum: GUI: Windows-Forms

Für eine Herangehensweise, die zu Code führt, den du noch überblickst, der leicht erweiterbar ist und den du auch nach Jahren noch pflegen kannst, braucht es eine gewisse Struktur - sowohl in deiner Vorgehensweise, wie auch vom Code selbst. Zum Glück bist du nicht der erste, der vor dem Problem steht, eine geeignete Herangehensweise zu finden. Für die Strukturierung von (Oberflächen-)Code gibt es mehrere solche Muster, neudeutsch Pattern. Bei Windows Forms hat sich das sog. MVC-Pattern bewährt - langer Rede kurzer Sinn: schau dir MVC an, versteh es, und wende es auf dein Projekt an. Viele deiner Fragen erübrigen sich dann schon.

MVC explained
Implementing MVC in Windows Forms
EDIT: MVP: Model-View-Presenter (ein Subtyp von MVC, der für WinForms gut geeignet ist)

(Google bringt auch noch etliche Treffer, auch hier im Forum)

LaTino

Thema: Rechtschreibung - oder die mangelnde Sorgfalt beim Erstellen eines Beitrags
Am im Forum: Wünsche und Kritik

Du kannst einzelne Beiträge gern melden, wenn du der Meinung bist, dass sie gegen Forenregeln verstoßen.

Ich persönlich halte Rechtschreibung angesichts von möglicher Legasthenie, sehr jungen Beitragserstellern, ausländischen Beitragserstellern etc. pp. für kein Thema, bei dem eine Diskussion eine Aussicht darauf hat, zu einem Kompromiss zu führen. Einzelfälle melden und gut. Das Forum ist so zivilisiert, dass die Moderatoren nicht Gefahr laufen, in Arbeit zu ersticken (hoffe ich).


LaTino

Thema: Funktion (KeyDown) wird doppelt ausgeführt
Am im Forum: GUI: Windows-Forms

Ich hatte es selbst auch erst so verstanden, bzw nur halb verstanden. Das Verhalten ist (bei uns zumindest) bekannt, es existiert im svn sogar ein workaround, d.h. irgendwer hatte den Erkenntnismoment schon einmal. Daher war ich sicher, dass es am TabControl liegt, nur nicht genau, wo dort.

LaTino

Thema: Funktion (KeyDown) wird doppelt ausgeführt
Am im Forum: GUI: Windows-Forms

p!lle, watt? :D

Also, Versuchsaufbau. Leeres WinForms. Panel reinhauen. Dort ein TapControl mit zwei Pages reinhauen, auf die erste TabPage eine TextBox.

Im CodeBehind den hier:


public SimpleBoundForm()
{
    InitializeComponent();

    textBox1.KeyDown += OnKeyDown;
    panel1.KeyDown += OnKeyDown;
    tabControl1.KeyDown += OnKeyDown;
    tabPage1.KeyDown += OnKeyDown;
    tabPage2.KeyDown += OnKeyDown;
    KeyDown += OnKeyDown;
}

private void OnKeyDown(object sender, KeyEventArgs keyEventArgs)
{
    Debug.WriteLine($"{((Control)sender).Name}, keydown.");
}

Starten, Textbox fokussieren, Taste drücken: tabControl1 und textBox1 melden sich.
Offensichtlich, feuert das TabControl mit Hilfe des von Control geerbten OnKeyDown() das KeyDown-Ereignis für sich (also tabControl1.KeyDown) ab. Das bedeutet, dass offenbar vom TabControl irgendwo _IM UNTERSCHIED ZU CONTROL_ die Methode aufgerufen wird, die OnKeyDown() wiederum aufruft, und damit das Event auslöst. Soweit klar?

Jetzt schaut a) in die Methode rein, die OnKeyDown() in Control.cs aufruft (ProcessKeyEventArgs)
Jetzt schaut b) nach TabControl.cs, ob es dort einen Aufruf von ProcessKeyEventArgs gibt, den es in Control() nicht gibt. Tipp: der Aufruf existiert, und er erklärt sogar, wieso das TabControl IMMER das event zuerst kriegt.

Aber das ist eigentlich unnötig. Wichtig ist, zu verstehen, dass TabControl dieses Verhalten hat, und zwar, damit es auf KeyDown-Ereignisse von Controls reagieren kann, die sich nicht standardmäßig unterhalb seiner Containerstruktur befinden, und zwar, BEVOR diese Controls reagieren können.

Aus meiner Sicht hat man das TabControl etwas verkackt und dann auf diese Weise repariert, aber was weiß ich schon.

LaTino