Laden...

Forenbeiträge von Th69 Ingesamt 4.962 Beiträge

22.05.2024 - 08:51 Uhr

Du solltest dich mal mit der Syntax von C# genauer beschäftigen.

Bei deinem Code hast du bei der 1. und 3. Liste diese nicht mit Werten gefüllt, sondern, wegen dem Semikolon nach der Listenerzeugung, danach einen Block mit weiteren Zuweisungen an die einzelnen Variablen.

Richtig muß es also so aussehen:

List<string> lBiersorten = new List<string>() // <-- hier KEIN Semikolon am Ende
{
    //index 0
    "Helles Bier ", // <-- Listenwerte werden mit Komma voneinander getrennt

    //index 1
    "Pils ",
    
    // ...
}; // <-- hier nun ein Semikolon als Abschluß der gesamten Anweisung (engl. statement)

Bei deiner 2. Liste paßt aber die Syntax (dies hast du wohl irgendwo her kopiert).

Und nun lösche noch alle Einzelvariablen (sBiersorteNummer1, sBiersorteNummer2, ... sowie iAnzahlVerfügbarkeitNummer1, iAnzahlVerfügbarkeitNummer2, ...), damit du diese nicht noch weiter verwendest.

PS: Nach welchem Buch lernst du denn bzw. hast du denn keinen Tutor (Ausbilder)?

21.05.2024 - 21:57 Uhr

Du kannst auch bei meinem Spiel einzelne Würfel mit einem Doppelklick abwählen (nur dann nicht wieder aktivieren).

Du mußt nur dafür sorgen, daß bei jedem Aktivieren/Deaktivieren immer wieder die Berechnungsfunktion aufgerufen wird. In meinem Code habe ich für jeden Würfel ein extra Status Scored, welcher gesetzt wird (damit nur diese gewertet und zur Seite gelegt werden).

Wenn man in einer Runde alle Würfel ausspielt, dann soll man ja 6 neue bekommen.
Aber wenn ich den Button klicke, dann ist das Event schon wieder weg.
Ich glaube dafür benötigt man einen sogenannten dispatcher Timer.

Dafür zähle ich die Anzahl der gewerteten Würfel und initialisiere dann wieder alle Würfel neu (neuer Zufallswurf mit 6 Würfeln).

if (m_nScoredDice >= MaxDice)
    InitDice(false);

Einen Timer benötigt man nur, wenn UI-Aktionen ohne aktive Benutzeraktion wiederholt ausgeführt werden sollen (wie z.B. zeige jede Sekunde die aktuelle Zeit an oder speichere jede Minute den aktuellen Spielstand o.ä.).

21.05.2024 - 21:14 Uhr

Auch mit WPF (oder WinForms) ist dies umsetzbar (für WinForms habe ich extra ein Framework dafür entwickelt, s. Link in meiner Signatur).

Du solltest nur, wie ich schon geschrieben habe, UI und Logik voneinander trennen. Und eigentlich wäre es für WPF, wie auch schon in deinem anderen Thema geschrieben wurde, besser, dies mittels MVVM umzusetzen (dafür solltest du aber zuerst ein paar Tutorials und Beispielprojekte durcharbeiten).

Ich habe das Spiel so umgesetzt, daß es 2 Buttons "Würfeln" und "Werten" gibt, s. Anhang (einfach alles in einen Ordner entzippen und "Dice.exe" starten).

21.05.2024 - 19:13 Uhr

@dannoe: Ja, du hast recht.

Trotzdem ist der Code dann eigenartig, da die check-Abfrage in

if (wuerfelCheck[i] == 3 && check == true)

dann doppelt (und demnach überflüssig) ist - und deswegen war ich wohl irritiert.

Außerdem wird hiermit ja nur auf "genau drei" und nicht "mindestens drei" geprüft (bezogen auf das Spiel Farkle - bzw. ich kenne es unter dem Namen 10.000, d.h. Zehntausend, welches ich auch selber schon mit C++ umgesetzt habe).

21.05.2024 - 18:57 Uhr

Hast du die List<int> denn auch mit Werten gefüllt (List<T>.Add)?

Außerdem habe ich die Liste vorgeschlagen, so daß du kein switch-case mehr für die einzelnen Biersorten benötigst, sondern du nur noch einen Block (bzw. am besten als eigene Methode ausgelagert) benötigst, d.h. die ganzen Einzelvariablen (also die mit der Ziffer am Ende) entfernst, wie z.B.

// statt:  if (iAnzahlVerfügbarkeitNummer1 <= 0)
if (lAnzahlverfügbarkeitnummern[iBiersortenwahl] <= 0)

Ebenso müßtest du für die dPreisNummerX auch eine List<double>anlegen.

Bzw. Wenn du lerntechnisch schon soweit bist, sogar am besten eine eigene Klasse Biersorte(mit den Eigenschaften für Anzahl, Preis, etc.) erzeugen und dann eine List<Biersorte>erstellen, die du dann benutzt.

21.05.2024 - 16:04 Uhr

Deine letzte Schleife überprüft aber nur, ob die Zahl 3 dreimal vorkommt, denn wuerfelCheck.Contains(3)ermittelt, ob die Zahl 3 im Array enthalten ist und die Abfrage wuerfelCheck[i] == 3 && check == true kann also dann nur erfüllt werden, wenn i den Wert 3 hat.

Und somit ist auch die letzte Abfrage nicht das, was du dann ausgibst (sondern eben nur ob die Zahl 3 nicht im Array vorkommt).

PS: Außerdem läßt sich auch das Füllen des Arrays wuerfelCheck vereinfachen:

for (int i = 0; i < wuerfel.Length; i++)
{
    wuerfelCheck[wuerfel[i] - 1] += 1; // bzw. nur ++
}

bzw.

foreach (int w in wuerfel)
{
    wuerfelCheck[w - 1] += 1; // bzw. nur ++
}
20.05.2024 - 09:01 Uhr

So wie schon geschrieben, mit einem Dictionary oder aber als Lerneffekt für dich, erzeuge eine Methode, welche für jede Zahl (1-6) zählt, wieviele davon in dem Array vorkommen und wenn es mindestens 3 sind, dann gebe true zurück (Tipp: verschachtelte Schleifen).

Und für die aufeinanderfolgende Zahlen kannst du ähnlich vorgehen und schauen, ob jede Zahl mindestens 1x vorkommt (einmal für 1-5 und einmal für 2-6).

PS:

Bezogen auf dein anderes Thema solltest du UI (WPF) und Logik trennen, d.h. die Spiellogik (+ Spieldaten) in eine eigene Klasse packen.

17.05.2024 - 12:27 Uhr

Ähnlich wie du es schon so in deinem Code benutzt:

sGewählteBiere[iArrayZähler] = sBiersorteNummer1 ;

Wenn du also anstatt iAnzahlVerfügbarkeitNummer1--;(welches nur eine Vereinfachung von iAnzahlVerfügbarkeitNummer1 = iAnzahlVerfügbarkeitNummer1 - 1darstellt), hierfür eine List<int>benutzt:

iAnzahlVerfügbarkeitNummern[index]--;

wobei index dann die Variable ist, welche du für den switch über die Biersorte bisher benutzt hast (beachte außerdem, daß der index 0-basiert ist, während du bisher bei 1 beginnst, d.h. index = biersorte - 1).

PS: Die sog. Ungarische Notation  (genauer "Systems Hungarian"), d.h. die Benennung der Variablen anhand des Typen (i, d, s, ...), verwendet man in modernem Code nicht mehr.

Für .NET gibt es die Frameworkentwurfsrichtlinien.

17.05.2024 - 10:11 Uhr

Zitat von pollito

Bei mir lokal kommt diese Meldung nicht.

Verwendest du einen der Microsoft Antivirenprogramme oder hast du die Warnung komplett deaktiviert (in Outlook)? Evtl. mal kurzzeitig das AV deaktivieren und dann testen, ob die Meldung dann auch bei dir erscheint (quasi als Gegentest).

Zitat von pollito

Daher die Idee, das Programm digital zu signieren und das Zertifikat in den Zertifikatspeicher "Vertrauenswürdige Herausgeber" kopieren.

Ich denke nicht, daß dies hier beim Zugriff auf Outlook beachtet wird. Aber kannst es ja mal lokal bei dir testen (wenn du herausgefunden hast, wie du auch bei dir die Warnung erscheinen lassen kannst).

17.05.2024 - 09:06 Uhr

Es scheint sich wohl um folgende Hilfeseite zu handeln: Es werden Warnungen zu einem Programm angezeigt, das auf E-Mail-Adressinformationen zugreift oder in meinem Auftrag E-Mails sendet

Ist auf dem PC denn ein Antivirusprogramm installiert und aktiv?

Und schau mal, ob du dort dein Programm zur Liste der "Vertrauenswürdige Add-Ins" hinzufügen kannst?

17.05.2024 - 08:54 Uhr

Zitat von Elmini08

Findest du das ist "Spaghetticode"?

Dort verwendest du zwar kein goto, aber verbesserungswürdig ist der Code allemal (insb. wenn deine anderen case-Blöcke ähnlich aufgebaut sind).

Ich weiß, daß für einen Anfänger ersteinmal wichtig ist, daß der Code überhaupt funktioniert. Wenn man jedoch professionell Software entwickelt, dann sollte man sich immer selbst hinterfragen, ob der Code lesbar und wartbar ist.

Hier ein paar generelle Tipps:

  • Verwendung von Container-Datentypen (wie z.B. Array (T[]), List<T>, Directory<K, V>, s.a. [Übersicht] Collections (Auflistungen) ab .NET Framework 2.0) anstatt Einzelvariablen (wie bei dir sBiersorteNummer1- wie oben schon geschrieben, nehme ich an, du hast für die anderen case-Blöcke dann ähnlichen Code, nur eben bei den Variablen mit anderer Zahl am Ende?!)
  • längere Codezeilen sollten in einzelne (sinnvoll benannte) Methoden ausgelagert werden (ca. 10-20 Zeilen)
  • keine Vermischung von UI (Eingabe/Ausgabe) mit Logik (Berechnungen), d.h. Auslagerung in verschiedene Klassen (und Methoden)

Bei größeren Projekten sind dann weitergehende Themen zu beachten, wie z.B. in den Forenthemen FAQ bzw. Artikel beschrieben, insb. [Artikel] Drei-Schichten-Architektur.

17.05.2024 - 08:14 Uhr

Hast du denn mal in die Hilfe geschaut ("... zum Unterdrücken dieser Warnung.")?

16.05.2024 - 16:56 Uhr

Stimmt, sonst kompiliert es nicht, da dies ein out-Parameter ist.

16.05.2024 - 15:27 Uhr

Anstatt dich auf die Reihenfolge und Vollständigkeit der Daten zu verlassen, solltest du besser die Daten vernünftig parsen.

Wenn du nur die von dir erwähnten 3 Einträge benötigst, reicht aber auch

string summary, start, end;
foreach (string line in lines)
{
  string s;
  if (TryReadLine(line, "SUMMARY:", out s))
    summary = s;
  if (TryReadLine(line, "DTSTART:", out s))
    start = s;
  if (TryReadLine(line, "DTEND:", out s))
    end = s;    
}

mit der Hilfsmethode

bool TryReadLine(string line, string keyword, out string value)
{
  if (line.StartsWith(keyword))
  {
    value = line.Substr(keyword.Length);
    return true;
  }
  
  value = String.Empty; // edited
  return false;
}

Da ich das ICS-Format bisher nicht kannte, habe ich mich an ICalendar orientiert.

PS: Noch schöner könnte man den ersten Code mit einem Array (bzw. List) machen.

15.05.2024 - 12:53 Uhr

Hallo und willkommen,

dafür kannst du Console.KeyAvailable sowie Console.ReadKey verwenden. Schau dir auch die Beispiele dort an.

Du mußt dann nur eine Schleife verwenden, welche basierend auf der Zeit (mittels DateTime.Now) die vergangenen Sekunden abwartet, bevor der restliche Code ausgeführt wird (alternativ kannst du auch die Klasse Stopwatch benutzen).

08.05.2024 - 14:40 Uhr

Falsche Metadaten bei den einzelnen Seiten (bzw. FAQ und Artikeln).
Es steht dort überall

<meta property="og:title" content="&#xDC;bersicht der Themen ohne Antwort" />
...
<meta name="twitter:title" content="&#xDC;bersicht der Themen ohne Antwort" />
...
<meta name="twitter:image:alt" content="&#xDC;bersicht der Themen ohne Antwort" />

anstatt der aktuelle Thementitel. Dies ist mir aufgefallen beim Verlinken in Discord (s. Anhang).

07.05.2024 - 09:27 Uhr

Zitat von MDepenMB205

@Th69 Ich habe in der Main Test klasse die Information_Cls als Basisklasse hinzugefügt. Hier ist eine Instanz UP als UserPage drin.

Wenn du dort mit UP = new UserPage()eine Instanz erstellt hast, so ist diese aber eine andere als die bereits sichtbare. Du müßtest schon die Referenz auf die aktuelle UserPage verwenden.

Jedoch solltest du bei WPF nur mit MVVM arbeiten, d.h. mit getrennten ViewModels. Dabei sollte jede View zwar ihr eigenes ViewModel haben, aber du kannst dann Daten zwischen verschiedenen ViewModels (per Referenz) weiterdelegieren.

Die eigentlichen Daten (wie z.B. bei dir die anzuzeigenden Informationen) sind jedoch Teil des Models und können von allen ViewModels benutzt werden. Schau dir dazu auch mal die Beiträge in MVVM - Woher bekommt ein ViewModel übergreifende Daten? Von parallelen ViewModellen oder von darunterliegenden Modellen? sowie WPF & MVVM - Einbindung mehrere ViewModelle in einer View an.

06.05.2024 - 17:34 Uhr

Hallo MDepenMB205,

UP.LabTime = "Test";

Was ist denn UP und wie hast du es initialisiert?


PS:

Dies habe ich schon oft bei Programmieranfängern gelesen:

Diese hat aktuell nur ein Void

Du meinst eine "Methode", denn void ist hier nur der Rückgabetyp dieser Methode (bzw. es bedeutet, daß diese keinen eigentlichen Rückgabewert hat - void bedeutet soviel wie "Leere", "leer" oder "nichtig").

02.05.2024 - 17:26 Uhr

Als alternative Möglichkeiten kannst du dir auch mal folgende Artikel anschauen:
- Dynamic CSS Values In Blazor
- How to set up your Blazor component Layout

23.04.2024 - 16:17 Uhr

M.E. hast du eine zu tiefe hierarchische Binding-Struktur: BindingSource → BindingSource → DataSet.

Du mußt schon auf eine DataTable oder ein anderes konkrete Datenobjekt binden. Oder ist "Tage"der Name einer DataTable aus dem DataSet Data.DataSet?

Am besten, du testest es umgekehrt, indem du ersteinmal direkt an an eine DataTable bindest und wenn das einwandfrei funktioniert, dann schaltest du die BindingSource(s) dazwischen.

23.04.2024 - 09:19 Uhr

Auf welche Datenquelle (BindingSource.DataSource) hast du denn gebunden, d.h. welches Objekt (bzw. Liste von Objekten), das die von dir verwendeten Eigenschaften Beginn, Ende und Art enthält?

Außerdem solltest du bei BindingSource.AddNew das Ereignis BindingSource.AddingNew verwenden, um das Datenobjekt hinzuzufügen, s.a. Vorgehensweise: Anpassen der Hinzufügung von Elementen mithilfe der BindingSource in Windows Forms.

Wenn du jedoch nur ein einzelnes Objekt als Datenquelle hast (und keine Liste), dann kannst du auch direkt dieses Objekt beim Binding angeben, anstatt eine BindingSource zu verwenden.

Als Tutorial (wenn auch in englisch) habe ich schon öfters A Detailed Data Binding Tutorial empfohlen.


PS: Du solltest statt dem Eigenschaften-String besser nameof(...) verwenden, so daß der Compiler Tippfehler erkennt (ist leider in den meisten Tutorials nicht so, da diese oft noch direkt auf .NET + C# 2.0 beruhen).

21.04.2024 - 11:17 Uhr

Hallo,

Also auch wenn nichts ausgewählt wird sollten Werte der Tabelle stehen.

Darauf sollte man sich beim Programmieren nicht verlassen, sondern möglichst solche Fälle abfangen.

Setze einen Haltepunkt auf die Zeile preisProTag = ... in  PreisBerechnen() und schau dir im Debugger die Variablen tabelle sowie fNummerComboBox.SelectedValue an. Wenn du noch nicht (intensiv) mit dem Debugger gearbeitet hast, dann s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?

18.04.2024 - 10:22 Uhr

Hallo und willkommen,

zum Austesten von LINQ-Anweisungen (als auch direkt per SQL) kann ich dir Linqpad empfehlen.

So wie Abt schreibt, die Grundlagen von LINQ solltest du dir aber ersteinmal aneignen.

15.04.2024 - 14:02 Uhr

Hallo und willkommen,

du kennst dann sicher vom C++ Builder die Tastenkürzelkomponente (THotKey). Diese gibt es nicht direkt bei Windows Forms, aber da es nur ein WinAPI-Wrapper ist (s. Informationen zu Hot Key-Steuerelementen), kann man diese auch von .NET aus aufrufen (leider habe ich, auf die Schnelle, bei der Internet-Suche kein direktes Pendant gefunden, aber eine selbst erstellte Komponente: A simple hotkey selection control for .NET).

Um im Programm darauf zu reagieren, gibt es verschiedene Möglichkeiten - erklärt z.B. in diesen beiden (wenn auch englischen) Artikeln:

12.04.2024 - 13:54 Uhr

Der Fehler bezieht sich auf { EADatei_Name = x.DateiName, x.WI, x.OBJ.Value }, da du die beiden letzten Werte nicht passenden Eigenschaften zuweist, also z.B. { EADatei_Name = x.DateiName, WI = x.WI, Value = x.OBJ.Value }.

10.04.2024 - 09:48 Uhr

Hallo,

ich selber habe bisher noch kein F# benutzt, aber evtl. hilft dir dieses Projekt: FsWpf (scheint mit .NetStandard 2.0 erstellt zu sein).

07.04.2024 - 10:45 Uhr

Hallo und willkommen,

in C# gibt es diese Art der (automatischen) Direktinitialisierung nicht, sondern es muß für die Klasse ein passender Konstruktor definiert sein (und dieser dann auch dafür aufgerufen werden):

List<RegisterEigenschaften> DFlist = new List<RegisterEigenschaften>()
{
  new RegisterEigenschaften(0, 0, "Status", DXLOCK),
  // ...
}

Da dies jedoch mehr Schreibarbeit (durch die Wiederholung des Klassennamens je Eintrag) ist, kann man seit C#-Version 9 es auch kürzer schreiben (s. C# 9.0: Target-typed New Expressions – Make Your Initialization Code Less Verbose):

List<RegisterEigenschaften> DFlist = new()
{
  new(0, 0, "Status", DXLOCK),
  // ...
}

Es gibt aber auch noch weitere Möglichkeiten, s. Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch).

Und um nicht explizit den Konstruktor für die Klasse schreiben zu müssen, gibt es das ebenfalls neuere Schlüsselwort record(auf deutsch Datensätze genannt):

record RegisterEigenschaften
(
    byte val,
    byte iFlag,
    string nameStr,
    byte regNr // Hier solltest du besser ein enum benutzen
);

Beachte die runden Klammern, anstatt der geschweiften sowie die Kommata - dies entspricht der direkten Angabe wie bei einer Konstruktordefinition.

PS: Du hast dich selbst zitiert - wolltest du deinen Eingangsbeitrag editieren?

04.04.2024 - 16:36 Uhr

So wie ich das verstehe, mußt du das Paket Microsoft.WinForms.Designer.SDK einbinden, s.a. Windows Forms Designer Extensibility Documents & Samples (ebenfalls von Klaus Loeffelmann).

04.04.2024 - 13:18 Uhr

Du könntest noch das Original Extended WPF Toolkit benutzen, aus dem Dirkster.AvalonDock geforkt wurde.

Dieses läuft noch mit .NET Framework 4.x. Aktuelle Version vom Januar: Extended WPF Toolkit - v4.6.0


Edit:

Das aktuelle Release Dirkster99/AvalonDock Version 4.72.1 unterstützt doch noch .NET Framework 4 (Ordner "net40")?!

30.03.2024 - 04:41 Uhr

Das steht doch alles unter "How to use" auf der Hauptseite DataGridFilter: WPF Filterable DataGrid, multi language.

Du kannst dir auch das zugehörige Demo-Projekt DemoApp.Net7.0 kompilieren bzw. anschauen.

28.03.2024 - 09:11 Uhr

Hallo,

ich nehme mal an, du verwendest bisher Office-Interop?

Eine einzelne Zelle selbst besitzt keine AutoFilter-Eigenschaft, sondern du mußt stattdessen einen Range verwenden, s. Autofilter sowie Range.AutoFilter(Object, Object, XlAutoFilterOperator, Object, Object).

(Edit: In der Antwort von AutoFilter in Excel einfügen gibt es ein C#-Beispiel dafür)

Um ohne installiertes Office (Excel) eine Arbeitsmappe zu bearbeiten, gibt es Office Open XML sowie ClosedXML.


PS:

@Abt: Hier geht es wohl nicht um ein Add-In, sondern um eine eigenständige .NET-Anwendung.

27.03.2024 - 11:18 Uhr

Hallo Steven85,

ich habe mal versucht, genau so eine Konsolenapplikation für .NET 7 für macOS (osx-x64) mit VS2022 17.9.5 (d.h. die aktuellste Version) zu erstellen und zu veröffentlichen. Auch dort erhalte ich bei "publish" nur einen leeren Ordner.

Wenn ich jedoch den "publish"-Ordner auf einen absoluten Pfad ("C:\Temp\publish") ändere, so kommt sogar eine Fehlermeldung:

The expression "[MSBuild]::MakeRelative(E:\Projects\C#\ConsoleApp, C:\Temp\publish\E:\Projects\C#\ConsoleApp\bin\Release\net7.0-macos13.1\osx-x64\ConsoleApp.app\\Contents\MonoBundle\\runtimeconfig.bin)" cannot be evaluated. The given path's format is not supported.

Da scheint mir ein Fehler im Build-Skript zu sein bzgl. der Pfade.


Du kannst aber mal versuchen den kompletten "bin/Release/net7.0-macos12.3/osx-x64"-Ordner auf den Mac zu kopieren und dort dann

dotnet Wohltat.Office.FileManager.dll

aufzurufen.

26.03.2024 - 13:00 Uhr

Schau mal in [Artikel] MVVM und DataBinding.

Jedoch verstehe ich nicht, warum du bisher in deinem Code je Device eine eigene Task gestartet hast?

Außerdem hast du bisher eine 100% Prozessor-/Kernlast-Endlosschleife.


PS: Bei

List<string> devices = new List<string>();
devices = KAutoHelper.ADBHelper.GetDevices();

ist die Initialisierung in der ersten Zeile unnötig, da sie sowieso sofort wieder neu zugewiesen wird, also folgendes reicht:

List<string> devices = KAutoHelper.ADBHelper.GetDevices();
19.03.2024 - 08:59 Uhr

Das liest sich eher so, als ob es an dem verwendeten ZIP-Dateiformat: Packalgorithmen liegt. Der Standard ist Deflate, aber vllt. sind .padfx-Dateien anders komprimiert? Schau mal in How to determine compression method of a ZIP/RAR file, wie man die Kompressionsmethode auslesen kann.

Edit:

Daran scheint es nicht zu liegen, da auch die beiliegende "Sample.padfx"-Datei mittels Deflate komprimiert wurde.

Aber hast du beim Wieder-Komprimieren auch den leeren Ordner "a_picts" hinzugefügt (mittels des Windows Explorers wird dieser nicht hinzugefügt, aber mit z.B. 7-Zip habe ich dies erreichen können)?

18.03.2024 - 11:33 Uhr

Schau dir mal Workflow Core an, besonders das Parallel sample.

16.03.2024 - 12:35 Uhr

Du hast anscheinend nur den Verzeichnisnamen angegeben, es fehlt aber der Ressourcename, d.h.

var rm = new ResourceManager("CalendarApp.i18n.resources", typeof(CalendarForm).Assembly);

Du kannst dir auch mal das Beispielprojekt .NET 5 Windows Forms localized app anschauen.

Aber warum hast du die Ressourcendateien (sowie den Resource-Manager) nicht von VS erstellen lassen? → Exemplarische Vorgehensweise: Lokalisieren von Windows Forms

PS: i18nals Verzeichnisname, sowie insbesondere als Namensbereich, halte ich persönlich für nicht so gut.

15.03.2024 - 10:51 Uhr

Schau mal in die Antworten von How to receive ICMP response "Port unreachable" to UDP message in C#. Evtl. brauchst du einen eigenen Socket für das Icmp-Protokoll?

12.03.2024 - 22:24 Uhr

Wenn ich dich richtig verstehe, dann möchtest du den gerenderten HTML-Code der angezeigten Formeln als externe Datei (DOCX oder PDF) speichern?

Dies sollte direkt aus JavaScript mit der Bibliothek jsPDF (mittels doc.html()) möglich sein, s.a. die Antworten bzgl. jsPDF in  Generate pdf from HTML in div using Javascript. Du müßtest aber mal einen Test machen, ob auch MathJax damit unterstützt wird.

Für DOC/DOCX habe ich den Artikel Export HTML to MS Word Document using JavaScript  gefunden. Auf dieser Webseite gibt es auch einen Artikel zur Benutzung von jsPDF: Convert HTML to PDF using JavaScript (Edit: Im Beispiel ist nur ein kleiner Schreibfehler bzgl. content <->contnet)

10.03.2024 - 14:30 Uhr

Mathematisch erscheint mir deine Formel aber fehlerhaft, denn ein Abstand sollte ja eine Addition sein, keine Multiplikation. Außerdem mußt du je x und y sowohl sin als auch cos verwenden.

Richtige Rotationsformel s. Drehmatrix der Ebene ℝ² und Transformationen in 2D mit Matrizen.

Und eine Rotation berechnet sich üblicherweise aus: -Translation → Rotation → +Translation (wobei Translation zum Rotationsmittelpunkt gemeint ist).

Auf englisch habe ich dazu auch Revised Right End Point of rotated rectangle in C# gefunden (beachte besonders die Berechnung des Radius in der 1. Lösung, d.h. den Abstand des Eckpunktes zum Mittelpunkt).

10.03.2024 - 08:05 Uhr

Hallo und willkommen,

zuersteinmal ein paar Fragen zu deinem Code:

Warum willst du überhaupt nachträglich eine Linie zeichnen anstatt schon beim Platzieren des Rechtecks? Und ist dieses per XAML oder per Code gesetzt, d.h. warum übergibst du den Namen anstatt eine Objektreferenz?

Und mathematisch: welches ist der Rotationspunkt, um den das Rechteck gedreht ist (z.B. Links oben oder Mittelpunkt)?


PS: Bzgl. "NaN" s. WPF Canvas.GetLeft() always receive NaN value.

02.03.2024 - 10:40 Uhr

Die Assembly ist aber wohl eingebunden (wie man im Bild beim Projektmappen-Explorer sieht).

Außerdem ist es eigenartig, daß nur diese Methode nicht gefunden wird, aber z.B. kein Fehler bei der Open-Methode eine Zeile vorher.

@chilli1981: Bewege mal die Maus über Runspace und wähle dann per Kontextmenü "Gehe zu Deklaration" und schau dir dort dann mal die Klasse an, ob die Methode CreatePipeline dort aufgelistet ist. Evtl. verwendest du eine ältere Version - auch wenn das aus der Doku nicht hervorgeht, daß es Versionsunterschiede bei den Methoden gibt).

Verwendest du denn .NET 5 (oder höher) oder noch .NET Framework 4.x?

PS: Evtl. kannst du dir auch mal RoboSharp anschauen.

02.03.2024 - 10:27 Uhr

Das kann aber so nicht funktionieren, denn IUserRepository muß ja in beiden Schichten bekannt sein (denn in der Datenschicht muß es ja eine konkrete Klasse geben, welche dieses Interface implementiert), also darf es nicht in der Logikschicht definiert sein, sondern zwingend im DAL.

Das Interface sollte ja relativ stabil (über die Zeit) sein, aber wenn sich etwas ändert (z.B. neue Methoden oder Parameter ändern sich), dann müssen beide Schichten angepaßt und neu kompiliert werden.

Sicherlich kann man noch ein extra Projekt nur für die Schnittstellen machen, dies lohnt sich aber erst bei größerem Projekten (vor allem wenn man mit Fremdbibliotheken bzw. eigenen Teams arbeitet, die eine komplette Schicht umsetzen bzw. es alternative Implementierungen gibt, welche in verschiedenen Anwendungen genutzt werden z.B. für Kunden mit verschiedenen Datenbanksystemen).

28.02.2024 - 10:42 Uhr

Evtl. fehlt noch range.Select() sowie die Verwendung von End - 1, s.a. How to paste table to the end of a Ms-Word document using C#.

28.02.2024 - 09:46 Uhr

Hallo und willkommen,

mit Content.Paste() wird das gesamte Dokument ersetzt. Ähnlich wie beim Öffnen mußt du einen Range definieren, in den dann die Daten eingefügt werden, s.a. Programmgesteuertes Definieren und Auswählen von Bereichen in Dokumenten sowie Programmgesteuertes Suchen und Ersetzen von Text in Dokumenten.

Probiere mal

Range range = ZielDokument.Range(ZielDokument.Content.End, ZielDokument.Content.End);
range.Paste();

PS: Du solltest das Zieldokument auch noch abspeichern.

21.02.2024 - 11:00 Uhr

OK, also als eigenes Control (z.B. Panel) könntest du dies auch umsetzen. Dazu dann bei jedem AfterCollapse/AfterExpand-Ereignis ein Neuzeichnen, z.B. per Invalidate(), anstoßen.

Und dann (abhängig von der Scrollbar) bei TopNode beginnen und durch die Knoten des TreeViewiterieren (entsprechend IsExpanded ), und mit gleichem Font die Zeilennummern zeichnen, damit die Höhe paßt - s.a. [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox).

Du kannst dies auch als ein UserControl umsetzen, das beide Controls beinhaltet (und z.B. bei Größenveränderung korrekt reagiert).

Insgesamt ist dies etwas langsamer als direkt im TreeView zu zeichnen, da 2x iteriert wird, aber dafür muß man nicht selber das Zeichnen des TreeViews übernehmen (bzw. anstoßen).

Edit: Es gibt kein OnScroll-Ereignis beim TreeView, daher müßtest du mit einem Timer überprüfen, ob sich TopNode geändert hat (und dann ebenfalls ein Neuzeichnen veranlassen).

Edit2: Wenn man von TreeView ableitet, kann man auf das Scrollen reagieren: [RESOLVED] Trapping TreeView's Scroll Events?

So mußt du jetzt selber entscheiden, welcher Ansatz für dich einfacher umzusetzen ist.

20.02.2024 - 17:58 Uhr

Eine andere Möglichkeit, anstatt große Liste mit Scrollbar, wäre Paging (also nur eine begrenzte Anzahl anzeigen, dann aber "vor" und "zurück"-Buttons).

(Deutsche) Bücher kenne ich keine, welche detailierter die WinForms-Interna beschreiben.

20.02.2024 - 09:58 Uhr

Das hatte ich bei deinem Code auch noch gesehen, aber vergessen zu schreiben.
Du darfst das Graphics-Objekt nicht 'disposen', da es ja intern von Windows Forms verwaltet wird und über die PaintEventArgs zur Verfügung gestellt wird.

Und ich denke auch, daß bei dir dann bei mehr als 1000 Picture-Controls dann die Anzahl der verfügbaren Handles überschritten wurde (du hast ja pro Bild mehrere Labels, die auch jeweils ein Handle benötigen). Ich hatte auch nicht gedacht, daß du so viele Bilder gleichzeitig anzeigen möchtest (darum hatte ich ja Caching erwähnt).

PS: So sieht dein Projekt schon viel besser aus.

18.02.2024 - 11:55 Uhr

Ich meinte das gesamte Testprojekt als ZIP-Datei, aber auch aus deinem bisherigen Code kann ich schon einiges lesen.

Bist du in der Zeit stehengeblieben, denn die Klassen ArrayList und Hashtable sind aus .NET 1 (also mehr als 20 Jahre alt) und benutzt man schon seit .NET 2 (2005) nicht mehr? Und du brauchst dann auch keine eigene Collection-Klasse zu entwickeln. Benutze einfach List<T> und HashSet<T>.

Und für das Scrollen brauchst du auch keine eigene Scrollbar, denn die Panel-Klasse (welche von ScrollableControl abgeleitet ist), unterstützt dies schon automatisch, einfach die Eigenschaft AutoScrollMinSize passend setzen (also die Größe, ab der Scrollbars angezeigt werden sollen) - dies geht auch dynamisch z.B. in OnPaint.

Und um dort dann passend zur Scrollposition zu zeichnen, einfach

e.Graphics.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);

vor dem eigentlichen Zeichnen der eigenen Objekte aufrufen.

PS: Meinst du "Dimensions" (anstatt "Dimentions")?

16.02.2024 - 11:00 Uhr

Hallo,

so ganz verstehe ich nicht, wo du genau die Leiste haben möchtest. Meinst du vertikal und vor jedem Eintrag dann die Zeilennummer dort angezeigt?

Zum Zeichnen schau dir die Ereignisse Paint und DrawNode an.

PS: Es heißt TreeView (nicht TreeViwe).