Du brauchst dann nur das UserControl (auf deutsch: Benutzersteuerelement) verstecken bzw. wieder anzeigen, es werden dann automatisch alle dadrin enthaltenen Elemente versteckt bzw. wieder angezeigt.
Als englischen Artikel habe ich Create User Control in C# Winforms Applications dazu gefunden.
meinst du das Arbeiten im visuellen Designer oder zur Laufzeit?
Ich verstehe jedoch nicht, was du mit dem MenuStrip meinst? Über ein Menü kannst du die verschiedenen Bereiche zur Auswahl stellen, so daß der Anwender zwischen diesen wechseln kann - das Anzeigen und Verstecken mußt du jedoch selber ausprogrammieren.
Ich würde vorschlagen, du erzeugst je Bereich ein eigenes UserControl (diese kannst du auch im Designer erstellen und bearbeiten). Und dann hältst du die einzelnen UserControls in einer Liste und merkst dir jeweils die gerade Aktive in einer Eigenschaft.
Das sind die Debug-Infos, welche beim Kompilieren mitgegeben werden.
Wenn du diese nicht benötigst, dann erstelle deine Applikation als Release und liefere keine ".pdb"-Dateien aus.
Wenn ich Dateien aus dem Internet herunterlade, möchte ich schon direkt den passenden (angezeigten) Dateinamen haben, anstatt jedesmal diesen wieder ändern zu müssen (denn wenn alle Dateien nachher nur "attachments-..." heißen, bringt mir das nicht viel). Vllt. hilft hier Change the name of your file with – HTML5 “Download” attribute?
Sollte der Forenbereich "FAQ" (und evtl. auch "Artikel") für normale Benutzer nicht besser schreibgeschützt sein (da gerade dort ein Thema fälschlicherweise eröffnet wurde)?
Außerdem ist mir noch eine andere Sache aufgefallen:
Beim Herunterladen von Anhängen wird nicht der angezeigte Dateiname genommen, sondern "attachment-...", so daß man selber den Dateinamen beim Abspeichern wieder ändern muß.
Bei einem GUI-Programm kann man Process.CloseMainWindow (sowie anschließend Process.Close) aufrufen. Das startende Programm muß sich also dessen Process-Instanz merken.
Möchtest du gleichzeitig die PDF-Datei lesen und beschreiben? Das wird wohl so nicht direkt funktionieren - gib mal als 2. Parameter für PdfStamper einen eigenen Output-FileStream an, s.a. C# (CSharp) iTextSharp.text.pdf PdfStamper Beispiele.
Dann sollte auch das File.Copy überflüssig sein.
In welcher Zeile genau erhältst du denn die Exception?
Durch die using-Anweisung in Zeile 20 sollte pdfStamper.Close() überflüssig sein (aber es sollte trotzdem keine Exception geworfen werden).
Analog solltest du beim Zugriff auf PdfReader pdfReader besser ebenfalls eine using-Anweisung benutzen.
dazu kannst du das "Windows API Code Pack" benutzen (gibt es in zwei Versionen, einmal für .NET Framework und einmal für .NET [Core]).
Eine abgespeckte Version, nur die Dialoge betreffend, gibt es unter ShellFileDialogs.
Du meinst .NET Framework 4.8? Ich wollte nur wissen, ob es nicht doch das neuere .NET 5 / 6 oder 7 ist.
Ich habe sowohl per Code, d.h. Paste als auch manuell über "Strg+V" das im Clipboard gespeicherte BMP-Bild in die RichTextBox einfügen können.
Kannst du es denn zur Laufzeit manuell über "Strg+V" bzw. das Kontextmenü "Einfügen" hinzufügen (oder ist es ausgegraut)?
Hast du es mal mit einer anderen BMP-Datei probiert (evtl. ist deine "NeoPixel.bmp" in einem nicht-kompatiblen Format)?
In einem Testprojekt mit .NET Framework 4 kann ich problemlos eine BMP-Datei in eine RichTextBox einfügen.
Dein Ansatz mit der PictureBox, wie du schon erkannt hast, kann so nicht funktionieren, da das RTF-Control so nichts über dieses Control weiß und somit den Text auch nicht herumfließen lassen kann.
Ich meinte, daß du ersteinmal unter Windows testest, ob der Code funktioniert. Und wenn das klappt, dann baust du den Code nach und nach um, so daß es dann bei deiner anderen Umgebung kompiliert und funktioniert.
Benutzt du das neueste VS? Seit der letzten C#-Version 11 gibt es Raw string literal, d.h. du kannst den gesamten Aufruf direkt in deinen Code einbauen (ohne explizit Zeichen 'escapen' zu müssen).
Auf welcher Hardware dein eigentlicher Code läuft spielt ja für den Aufruf ersteinmal keine Rolle.
Du mußt schauen, daß du ersteinmal einen funktionierenden Aufruf mit CURL hinbekommst (egal, ob von Windows, Linux oder einem anderen System).
jetzt wollte ich es doch mal genauer wissen und habe im Source-Code nachgeschaut. Das eigentliche Parsen des Formats findet in der Methode DateTimeParse.ParseByFormat statt, für "z" in Zeile 4122 ff.
Dort wird erst mittels GetRepeatCount() die maximale Anzahl des gleichen Formatspezifizierers (hier also z) ermittelt und dann die Methode ParseTimeZoneOffset aufgerufen.
Und dort ist das Entscheidende der switch über die Anzahl: bei Werten ungleich von 1 und 2 wird dann der default Code ausgeführt und dort ist dann der entscheidende Hinweis als Kommentar
// ':' is optional.
if (str.Match(":"))
// ...
Zusammengefaßt also:
- "z" und "zz" werden getrennt geparst
- "zzz" sowie alle weiteren Wiederholungen von z werden gleich behandelt. Was in der Doku fehlt, ist der Hinweis auf das optionale: Zeichen bei dem Zeitzonenoffset!
Ich habe jetzt auch mal den Code selber kompiliert und ausgeführt (nur mit "zzz" und -1230 als Zeitzonenoffset):
string date = "Sun Dec 13 03:52:21 -1230 2009";
string format = "ddd MMM dd hh:mm:ss zzz yyyy";
CultureInfo provider = new CultureInfo("en-US");
CultureInfo provider2 = new CultureInfo("de-DE");
if(DateTime.TryParseExact(date, format, provider, DateTimeStyles.None, out DateTime dt))
{
Console.WriteLine(dt.ToString("o"));
Console.WriteLine(dt.ToString("G", provider2));
}
Dein letzter Code sieht schon ganz gut aus, jedoch sehe ich keine Millisekunden (daher solltest du fff löschen).
Und +0000 ist wohl der Zeitzonenoffset, jedoch erwartet zzz diesen im Format +00:00 (s.a. Formatspezifizierer „z“ für das Offset) - das müßtest du also mal näher evaluieren.
Desweiteren solltest du daher auch DateTimeOffset verwenden.
@Abt: Als Nachfrage zu deinem Code: Woher hast du den vierstelligen zzzz als Format? Dies ist, soweit ich gelesen habe, nirgendwo dokumentiert.
Sorry, aber dein C++-Code ist fehlerhaft:
Zum einen kopierst du in SetStr das Nullendezeichen ('\0') nicht mit und zum anderen erzeugt GetStrCA undefiniertes Verhalten (UB), da myData nur einen Leerstring als String-Literal darstellt und kein beschreibbares String-Array.
Wie schon geschrieben, benutze zum Kopieren eines C-Strings strcpy (bzw. strncpy mit Angabe der max. Länge).
Und hast du bei STRLENGTH auch dieses Nullendezeichen beachtet, d.h. dieser Wert sollte mindestens 5 sein?
Warum benötigst du denn noch das Array strArrMC (und wenn, dann sollte es nicht im Shared Memory Bereich liegen!)?
Hier mein (aus dem Texteditor) geschriebener Code dazu:
Each process gets its own address space. It is very important that pointers are never stored in a variable contained in a shared data segment. A pointer might be perfectly valid in one application but not in another.
Du müsstest also so etwas wie
char strArr[MAXSYSTEM][MAXLENGTH]
verwenden (also ein fixes 2D-Array). Und dann von C++ aus mittels str(n)cpy o.ä. die Texte reinkopieren.
Das ist ja schon mal ein kleiner Fortschritt. Und jetzt gibt es wohl auch keinen Speicherzugriffsfehler mehr?
Das was mich jedoch wundert, ist, daß du für 1 einen Leerstring ("") und nicht null zurückerhältst - denn
const char* strArr[MAXSYSTEM] = { "" };
initialisiert ja nur den ersten Wert (Index 0) mit dem Leerstring, alle weiteren Werten werden auf NULL (bzw. nullptr) gesetzt.
Hat die C++ Anwendung auch nur einen Leerstring geschrieben? Und mit welcher Speicheranforderungsfunktion wird denn der String (const char*) erzeugt?
Was passiert denn, wenn du testweise mal das Array so initialisierst: