Wow - ja, genau das war's. Das hatte ich vor ein paar Wochen ausgeschaltet - das hatte ich schon völlig vergessen. Nur - danach funktionierte es noch 'ne Weile. Hm...
Was ich auch nicht verstehe: Ich erstelle eine völlig neue JumpList, in der werden keine "recent documents" angezeigt. Nochmals hm...
Dazu gleich noch 'ne Frage: Beim Programmstart wird eine JumpList angelegt. Wenn ich jetzt eine neue erstelle, wird die auch angezeigt. Ist die alte JumpList dann gelöscht oder müsste ich sie korrekt über dispose entfernen?
Nee, dispose geht nicht, hab's probiert, vor allem komme ich an die vorhandene gar nicht ran, um sie zu aktualisieren. Meine Frage war also blöde Frage?
Hallo,
in meinem Programm wird zu bestimmten Zeiten eine JumpList erstellt. Bisher ging das tadellos, seit neuestem erhalte ich eine Fehlermeldung:
Fehler
System.UnauthorizedAccessException
HResult=0x80070005
Nachricht = Custom categories cannot be added while recent documents tracking is turned off.
Quelle = Microsoft.WindowsAPICodePack.Shell
Stapelüberwachung:
bei Microsoft.WindowsAPICodePack.Taskbar.JumpList.AppendCustomCategories()
bei Microsoft.WindowsAPICodePack.Taskbar.JumpList.Refresh()
...
Ich weiß nicht, wie das "recent document tracking" aus- oder eingeschaltet wird. Ich habe bewusst da auch nichts geändert, deswegen vermute ich, dass der Grund für die Fehlermeldung ein anderer ist.
Hier etwas Code:
JumpList jlist = JumpList.CreateJumpList(); // JumpList erzeugen
//return; // zum Abschalten, dammit der Rest des Programms funktioniert
const string op = " öffnen", st = " starten"; // zur Vervollständigung
#region _Ordner_Öffnen_
JumpListCustomCategory pCategory = new JumpListCustomCategory("Verzeichnis" + op); // Kategorie Verzeichnis öffnen
jlist.AddCustomCategories(pCategory);
string[] a_lnk_db = // Pfad, Titel, Iconpfad
{
global.mtgpfad, // Pfad zu den Daten (H:\)
"Infos",
@"....ico",
global.mpfad, // Pfad zum Arbeitsverzeichnis
"... (Debug)",
@"....ico"
};
for (int i = 0; i < a_lnk_db.Length; i++) // in ... öffnen
{
pCategory.AddJumpListItems(
new JumpListLink(a_lnk_db[i], a_lnk_db[++i])
{ IconReference = new IconReference(a_lnk_db[++i], 0), }); // Exe: ..._db
}
#endregion
jlist.Refresh(); // Exception !!!
Infos über den Editor:
MS VS Community 2017, Version 15.9.50
Net Framework, Version 4.8.04.084
Danke für den Link, den hatte ich nicht gefunden.
1tsd. Euro - nun, bei bis zu 70 PDFs pro Jahr sind das knapp 15 Euro pro PDF - zu teuer, denn ich muss nur den Text auslesen.
PDFPig machte auf mich einen guten Eindruck. Ich werd's mal probieren - schrieb ich ja schon.
Hm. Danke für die Info. Ich habe schon versucht, den Preis herauszubekommen. Wozu die meinen Namen und alle anderen persönlichen Daten dazu brauchen ist mir unverständlich.
Also wäre z.B. PdfPig eine Alternative? Da habe ich Probleme mit der Codierung, habe nur sehr begrenzte Infos dazu gefunden. Na, mal sehen, ob ich's hinbekomme.
in meinem Programm muss ich PDF-Dateien auslesen. Bisher ging das mit iTextSharp auch ganz gut, aber seit die PDFs in der Version 1.7 (davor 1.4) vorliegen, funktioniert das nicht mehr. Also habe ich iText7 in der Version 7.23 installiert, da dabei nur wenig Code zu ändern ist. Beim Testlauf stellte ich dann fest, dass die Unterscheidung für Groß- oder Kleinbuchstaben für das Programm wohl nicht relevant ist.
Rufe ich die Datei über z.B. SumatraPDF auf, steht alles in Großbuchstaben da, iText7 gibt mir aber zurück:
"FüR DIE BunDESREPuBlIK DEuTScHlanD". Was soll das? Hat jemand 'ne Erklärung, gibt's eine Lösung dazu?
Die korrekte Groß/Kleinschreibung brauche ich unbedingt!
string inhalt;
using (PdfReader pdf = new PdfReader(daten)) // daten: MemoryStream
using (PdfDocument doc = new PdfDocument(pdf))
{
SimpleTextExtractionStrategy strategie = new SimpleTextExtractionStrategy();
inhalt = PdfTextExtractor.GetTextFromPage(doc.GetPage(i), strategie).Trim();
}
Mittlerweile habe ich ein BackUp gefunden, ist gar nicht so alt: Nov. '21. Als Orientierung hätte es gereicht. Ich hatte aber die Gelegenheit beim Schopf ergriffen und das Design beim Neuerstellen überarbeitet (was ich schon immer mal tun wollte ). Jetzt ist alles in sich konsistent, vor allem die Namensgebung und Anordnung der Controls.
Mit dem IL.Spy-Tool komme ich nicht so richtig klar. Verstehe ich das richtig, dass es eine Art AddOn für VS ist (Nuget)? Und dann gibt's ein weiteres Problem: Ich habe bei mir keine DLLs. Alles ist der Einfachheit halbe in der exe versammelt. Nicht günstig, besonders, wenn was verloren geht. Damals, beim Beginn mit dem Programm, kam ich mit der DLL-Erstellung nicht klar und habe mich nie wieder darum gekümmert. Das werd'ich wohl auch mal in Angrfiff nehmen müssen.
Es ist halt ein Programm nur für mich, für einen ganz speziellen Zweck - eine schwache Ausrede, auch das weiß ich.
Jetzt lege ich aber brav & artig Updates nach jeder Veränderung an. Manchmal lernen Menschen aus ihren Fehlern.
Viele Dank, gehabe dich wohl, bleibe gesund - ...lypô
Leider weiß ich nicht, warum der Fehler auftrat. Ich habe in der Form1.cs lediglich eine Methode löschen wollen. Diese wurde wg. eine sversehentlichen Doppelkilicks auf einen Button im Designer angelegt, dort hatte ich den Eintrag bereits entfernt, der wurde aber nicht gelöscht, also wollte ich es manuell tun. Dann wurde alles weiß, nach einiger Zeit schloss sich das Programm. beim Wieder-Öffnen sah ich dann das Melheur.
So what ... Fehler sind dazu da, dass mann daraus lernt...
@ T-Virus:
Nun, mit Repository hatte ich mich nur ganz am Anfang beschäftigt, daraufhin lief alles schief - vermutlich wegne eines Fehlers meinerseits - weswegen ich das dann gelassen habe. Ich war ja noch am Lernen.
@ Abt:
Das ist aktiviert, nur ist das Verzeichnis leer - warum auch immer. Leider ist es ein schmerzliche Erfahrung und wird es für ein Weilchen bleiben. ...schluchz!
@ beide
Okay, Danke euch beiden. Dann werde ich mich mal dran machen....
Bei mir ist ein ziemliches Malheur passiert. Im Designer ist ein ganzer Bereich gelöscht worden. Kann man den nicht wiederherstellen? Ich finde keinen Menüpunkt dazu.
Rückgängig ist keine Option, da das Programm abgestürzt war und ich den Fehler erst beim Neustart entdeckte.
Der gelöschte Bereich - und das macht das Ganze so dramatisch - enthielt die wesentlichen zweidrittel meines Programms; den manuelle wiederherzustellen dürfte 'ne kanppe Woche dauern. Legt VS nicht automatisch ein Backup an?
Danke für Hilfe!
PS.: Die exe-Datei funktioniert, nur benötige ich den Designer mit allen Einträgen.
Du möchtest den String für Regex escapen?
In dem Fall: Regex.Escape(String) (Docs)
Das escaped dir alles, was eine gesonderte Bedeutung haben könnte.
...
Leerzeichen durch \s+ ersetzen: Simples Replace. Bedenke aber, dass \s mehr erkennt, als nur Leerzeichen.
Die Zeilenumbrüche entfernen: Auch simples Replace, mach das aber am besten mit Environment.NewLine (Docs)
...
Für sowas ist Regex eigentlich ideal ^^ https://regex101.com/r/G7YqGz/1
Wie es genau aussehen muss und was Du damit machst, musst Du noch anpassen.
Und da siehst Du auch gleich ein wirklich gutes Regex-Tool.
Das sind doch mal zwei exzellente Tipps. Regex.Escape kannte ich noch gar nicht, muss also mein Wissen über Regex auf jeden Fall aktualisieren.
Bedankt!
Mittlerweile funktioniert's wie gewünscht, dein Tipp mit "\s" war ideal - eben weil das mehr als Leerzeichen erkennt.
Nun will ich die ganze Sache noch etwas ändern und erweitern, wobei mir das Regex.Escape durchaus helfen könnte.
Nochmals bedankt!
Zitat von jogibear9988
Was willst du denn genau machen? Vlt. wäre ja ein HTML (wie AngleSharp) parser besser geeignet
Das HTML ist nicht das Problem, der ganze Kram liegt nur in HTML vor, deswegen die vielen Tags darin. Die müssen allerdings auch erkennt werden, was gelungen ist. Dennoch oder trotzdem oder wie auch immer Danke für deine Antwort.
Meines Wissens kann die Zwischenablage Daten in mehrerem Variationen speichern. Vielleicht setzt du die falsche?
Guck dir doch den funktionierenden Inhalt mit GetData an, dann siehst du möglicherweise den entscheidenden Unterschied zu dem was du setzt.
Es geht nicht um das GetData(), sondern um das SetData(). Das GetData() oder wie auch immer macht dann der Firefox. Dort will ich die Daten aus der Zwischenablage in ein <textarea>-Eingabefeld einfügen.
Über Strg+C (WebBrowser) und Strg+V (Firefox) klappt das prima, es funktioniert nur nicht, wenn ich die Daten über SetData in die Zwischenablage bringe. SetData(DataFormats.Html) und SetData(DataFormats.Text) schreiben die Daten des WebBrowsers als Klartext (mit allen Html-Tags) in die Zwischenablage. In der <textarea> erscheint dann der Html-Text oder eben nur der Text, aber nicht der formatierte.
Alle anderen SetData(DataFormats...) sind nicht lesbar oder werden nicht gelesen.
Das ganze ist nicht von fundamentaler Bedeutung. Ich wollte es nur ausprobieren und dabei kam diese Frage auf.
Wie schon gesagt/geschrieben werde ich mich mal weiter informieren, ein paar Gedenkanstöße habe ich ja erhalten.
Nunja, erstmal Danke für deine Antwort, ich werd' mal weiter suchen, es geht ja auch so.
Wäre nur interessasnt zu wissen, was da alles passiert und wie.
jetzt sagt bitte nicht: "das kopiert", denn das ist nur die halbe Wahrheit.
Beispiel:
Ich erhalte eine Mail mit formatiertem Text, also mit bold und kursiv und sowas.
Den Text markiere ich, dann Strg+C und füge das Kopierte in ein Textfeld (<textarea>...</textarea>) im Browser FF ein. Funktioniert wunderbar, aber ich möchte es mit C#-Code realisieren.
Ich versuchte
dynamic doc = webbrowser.Document.DomDocument;
Clipboard.SetData("html", doc.selection.createRange().htmltext); // statt "html" habe ich auch 'DataFormats...' versucht
aber es gelingt nicht, die Zwischenablage ist über
Sind sie nicht. Ich ersetze ganz gezielt die Leerzeichen mit "\s+", denn genau dort befinden sich die Zeilenumbrüche (die ja dank deiner Tipps als Whitespace gelten). Und die ZU stören eben bei der Suche, das Programm findet dann den gesuchten Text nicht, da der eben keine ZU hat bzw. haben sollte (hat er leider manchmal doch, was merkwürdig ist).
Ich gebe dem Regex mit dem '\s+' die Anweisung, die ZU in den Wortzwischenräumen zuzulassen bzw. zu ignorieren.
Die Länge des Originaltexts darf ich nicht ändern, da sonst die Indices nicht mehr stimmen.
Und: den Regex an den Originaltext anzupassen fand ich einfacher als umgekehrt.
Scusi, die Antwort hat etwas gedauert, ich hatte heute reichlich anderes zu tun.
Zitat von Palladin007
Ich verstehe den Sinn von dem Code nicht ...
Zwei mal Replace? Warum?
Wenn Du auch Klammern ersetzen willst, dann mach: [\s()]+
Nein, die Klammern will ich nicht ersetzen, sondern maskieren. Der im WebBrowser selektierte Text dient ja als Regex-Muster und die Klammern würden dabei als Gruppe behandelt.
Ich habe die Regex jetzt einzeln aufgelistet:
string s_patt = Regex.Replace(tb_qts.Text.ToLower(), "([()])", "\\" + "$1"); // Escape-Zeichen für Klammern
s_patt = Regex.Replace(s_patt, " +", "\\s+"); // Ersetzen der LeerZ. mit \s+
s_patt = Regex.Replace(s_patt, "\r\n", "");
Zitat von Palladin007
Und das "äußere" Replace ist immer noch falsch herum. Nochmal: Zähle die Parameter der Methode, der zweite Parameter muss das Pattern sein. Du versuchst ein Leerzeichen durch '\s+' zu ersetzen.
Sind sie nicht. Ich ersetze ganz gezielt die Leerzeichen mit "\s+", denn genau dort befinden sich die Zeilenumbrüche (die ja dank deiner Tipps als Whitespace gelten). Und die ZU stören eben bei der Suche, das Programm findet dann den gesuchten Text nicht, da der eben keine ZU hat bzw. haben sollte (hat er leider manchmal doch, was merkwürdig ist).
Zitat von Palladin007
Und die Klammern *außerhalb* der eckigen Klammern sind eine Gruppe, die brauchst Du nur, wenn Du einen bestimmten Teil des Matches erreichen möchtest.
Ja, aus der Gruppe ("([()])") - ist ja nur die Nr.1 - lese ich die gefundene Klammer aus - '(' oder ')' -, die dann mit Maskierung ("\\" + "$1") versehen wird: '\(' oder eben '\)'. Rückbezug oder oder so ähnlich.
Zitat von Palladin007
Für mich sieht das ein bisschen so aus, als würdest Du hier durch try&error durch vor irren wollen.
Bei Regex wirst Du damit nicht glücklich, Du solltest dir dir Grundlagen anschauen. [Artikel] Regex-Tutorial
Ganz so schlimm ist es nicht, aber das RegexLab-Tool hilft nicht immer weiter, manches muss ich da probieren. Tatsächlich funktioniert es jetzt wie gewünscht bis auf eine kleine Kleinigkeit:
Absatzübergreifend findet er den Text auch jetzt nicht. Das dürfte an dem '\s+' liegen, denn in den Absatzumbrüchen stehen Sachen wie '<div> </div>' oder '<br>', eben keine WhiteSpace-Zeichen. Die könnte ich natürlich auch noch 'rausnehmen, aber das wird aufwendiger als nötig.
Regex-Tutorials habe ich einige, und auch gelesen, wenn auch nicht alles. Unter anderem habe ich die Funktionen von '\s' nicht gesehen - das wundert mich schon etwas. Ich weiß aber, dass ich über Regex noch längst nicht alles weiß. Denk' dran: Is'n altes Gehirn, dass sich nicht immer alles schnell merken kann. Ich brauche dazu Praxis, und die erarbeite ich mir gerade - unter anderem mit deiner Hilfe.
Also nochmals viele Dank, wenn ich mal Tipps für das 3-Schichten-Modell brauche, frage ich wieder, werde mich aber erstmal belesen.
einges habe ich jetzt schon ausgelagert, aber es gibt Methoden, die sehr intensiv an der GUI arbeiten, das ginge dann mit subclasses nur mit Invoke, was auf Dauer recht anstrengend ist.
Dennoch werde ich den Artikel gerne lesen.
Vielleicht ginge es ja mit zweimaligem Replace wie in deiner Version schneller ... naja, so sieht's schöner aus.
Das '\s+' hat mir noch Kummer bereitet, ich hatte es zuerst in Klammern und die vergessen 'rauszunehmen, da ging die Geschichte nur mit einem Zeilenumbruch.
Jetzt läuft's aber, der Tipp ist Spitze, werde meine anderen Regex auch überpürfen. Da sind z.T. richtige Ungetüme drin, da ich unterschiedliche Texte bekomme.
Und ich hab's in eine extra Klassse gesetzt ... ... ... und es funktioniert trotzdem! :-)) Auch wenn's nur 67 Zeilen sind.
So lernt mann, naja: ich, immernoch dazu.
Also sei Bedankt, gehasbe dich wohl, ich muss inne Heia, mich müdet mittlerweile.
Viele Grüße - MoaByter (kommt von Moabit, mein Berliner Bezirk)
Also erst den Klammer.Replace, dann das Regex. Meintest du das so? Funktioniert nämlich. Deswegen hat das Muster - nur das Muster - im RegexLab funktioniert, da ich mit dem normalen Replace die Klammern wieder verändere. Fiel mir erst jetzt beim Debugging auf.
Tja, und die Sache mit dem '\s' wusste ich nicht. Erstaunlich, dass trotzdem alle meine anderen Regex so gut funktionieren. Ich dachte, ich wäre darin einigermaßen bewandert - Duning-Kruger-Effekt?
Also herzlichen Dank für deine Hilfe! Ich hatte so sehr im Netz gesucht und nur Unpassendes oder Müll gefunden (im_coder.com).
??? hallo Palladin007,
was meinst du mit zweitem Parameter? Und mit '\s' findet der Regex doch nur die Leerzeichen. Die habe ich mir im Muster erspart, dadurchs wird's für mich leichter lesebar.
Was ich in meinem Text nicht gezeigt habe, ist die eigentliche Suche, aber dabei ist nix überraschendes:
Match m = Regex.Match(s_rtbtxt, s_patt, RegexOptions.Singleline);
Wie gesagt, im RegexLab funktioniert es genau so, wie ich's aufgebaut habe.
wie finde ich in einen Text mit Zeilenumbrüchen gemäß einer Vorlage ohne Zeilenumbrüch?
Beispiel:
...emil
und
luise...
möchte ich finden, habe als Suchmuster aber nur ...emil und luise... ohne Zeilenumbrüche.
Das heißt also, der Reguläre Ausdruck muss die Zeilenumbrüche zwischen den Wörtern akzeptieren. Im Regex klappt's. Ich habe das Suchmuster etwas kompliziert aufgebaut: Ich ersetze die Leerzeichem im Suchmuster durch @"([ \r\n]{1,5})" und vor Klammern im Text werden Backslashes eingefügt.
wie gesagt: Im RegexLab klappt's, in meinem Programm nicht. Programmzeile für das Regex-Muster:
Die Laufzeit ist allerdings nicht wirklich ein Problem - auch wenn ich mit daran denke.
Nun, den Code, den ich einsetze/schreibe, verstehe ich auch, was beim Delegaten zuerst wirklich ein Problem war. Aber Threading und Tasks sind doch recht einfach. Mir fehlt wohl eher der Überblick über die Möglichkeiten, denn oft genug gibt's mehrere Wege, eine Aufgabe zu lösen.
MVVM - ja, davon hab' ich schon gelesen. Da bin ich noch am Grübeln, wie ich das umsetze. Aktuell ist mein Programm vor allem schnell, was nach Möglichkeit so bleiben sollte. Da ist allein schon Invoke ein Hindernis: "dgv.Invoke..." - und das 50-150 mal - dauert.
Ich frag' doch, wenn ich nicht weiter weiß. Bin doch da! :-))
Vieles finde ich schon auch selbst im Web. Das hat den Vorteil, dass ich auch zu anderen Themen Ideen finde, die sind bei mir schon eingeflossen.
Die genannten Konzepte sind für mich durchaus ein Thema, meist hakt's an den Ideen und Entscheidungen für's Umsetzen.
Es ist schade, dass ich in meinem Bekanntenkreis keine Programmierer habe, zwei Admins zwar, aber die können's nicht (richtig).
Der Rest sind Lehrer und ein Elektromeister. Elektriker war mein Job bis vor etwa 15 Jehren.
An den Tasks bin ich schon 'ne ganze Weile, nach Deleagten/Invoke und Threads sind die jetzt dran, die sollen ja viel einfacher sein. Ist so schwer auch nicht - bis auf die Stolpersteine: SetApp... z.B., denn diese Fehlermeldung bekomme ich. Dazu werde ich 'nen neuen Thread aufmachen, muss nur schauen, wie ich den Code einbringe. Da heißt's zwar Thraeds, aber ist halt in eine(r/m) Task.
Ja, mehr oder weniger privat, als is' nur fürt mich.
Beispiel: RennInfo-Texte in 'ner word-Datei. Die öffne ich in meinem Programm, das speichert sie als *.html und ruft sie auf. Der Text wird dann passend umgewandelt, automatisch in Absätze unterteilt und "bereinigt". dann nur noch der Klick auf "Senden" und ich kann ander Dineg tun. Für sowas brauche ich 2 oder 3 Minuten mit allem drum und dran, bekomme aber 'ne halbe Stunde bezahlt. That's why! Und es gibt mehrere Bereiche, in denen ich arbeite. -> Anhang
Ich habe mir schon Gedanken gemacht, wie ich es aufbaue. Nur bin ich erst vor Kurzem auf das 3-Schichten-Modell gestoßen. Am Anfang war ich eher stolz, dass das Programm recht gut läuft, was es ja auch tut. Nur die Vielzahl der erweiterungen brachte mir dann die Probleme.
Alte Fehler - hihihi - naja, da hat's reichlich. Ich studiere mal wieder das Handbuch, dicke Schwarte von Galileo-Computing. Die Microsoft-Seiten sind nicht immer hilfreich, weil ich oft nur die Hälfte verstehe oder die Tipps nicht anpassen kann.
Das Programm ändern kann ich sowieso nicht. Ich muss es tatsächlich neu schreiben, denn es muss ja weiter funktionieren - is' mein Minijob. Da brauche ich es mehrmals täglich.
Ja, is' WinForms, kerin WPF. Mit dem kam ich nicht klar, müsste ich mal wieder versuchen.