Entwickler-Ecke
WinForms - C# Scintilla SelectedText
Csharp-programmierer - Mi 16.03.16 17:06
Titel: C# Scintilla SelectedText
Hallo,
bei der RTB ging das mit SelectedText ja viel einfacher. Wenn ich bei meinem Scintilla den SelectedText ändern möchte, geht des wegen einer Sicherheitsebene nicht, was mich ziemlich nervt.
Mit dem Code klappt es schon Teils, jedoch wird der SelectedText hinter dem Code nochmal eingefügt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| string text = v.SelectedText; v.SelectedText.Replace(text, ""; if (fontDialog1.Font.Underline == true) v.AddText("<u><font face=\"" + fontDialog1.Font.Name + "\">" + text + "</font></u>"); if (fontDialog1.Font.Bold == true) v.AddText("<strong><font face=\"" + fontDialog1.Font.Name + "\">" + text + "</font></strong>"); if (fontDialog1.Font.Italic == true) v.AddText("<i><font face=\"" + fontDialog1.Font.Name + "\">" + text + "</font></i>"); |
Geht es irgendwie, dass es so funktioniert, dass der Text nicht nochmal hinten angefügt wird? Ich habe im Internet schon danach gesucht, habe aber nichts passendes gefunden.
Mfg :)
Th69 - Mi 16.03.16 17:25
Hallo,
mit
C#-Quelltext
1:
| v.SelectedText.Replace(text, ""); |
änderst du doch schon den
SelectedText. :?:
Statt
AddText mußt du dann einfach den 2. Parameter entsprechend setzen.
PS: Deine Logik bzgl. der 3 Bedingungen ist aber wohl falsch. Überleg mal, was passiert, wenn ein Font z.B. sowohl 'bold' als auch 'underline' hat...
Csharp-programmierer - Mi 16.03.16 17:40
Zitat: |
Statt AddText mußt du dann einfach den 2. Parameter entsprechend setzen. |
Welchen Parameter? Statt AddText dann Replace oder wie?
Zitat: |
PS: Deine Logik bzgl. der 3 Bedingungen ist aber wohl falsch. Überleg mal, was passiert, wenn ein Font z.B. sowohl 'bold' als auch 'underline' hat... |
Ich überlege nochmal ;-)
Th69 - Mi 16.03.16 17:50
Den 2. Parameter von
Replace, also
C#-Quelltext
1: 2: 3:
| string newText = "blablabla";
v.SelectedText.Replace(text, newText); |
Und jetzt mußt du nur noch deine Logik so umschreiben, daß es für
newText den korrekten String erzeugt.
Csharp-programmierer - Mi 16.03.16 18:23
Also ich habe es probiert. Es müsste ja eigentlich klappen. Die Methoden werden auch ausgeführt aber der Text im Scintilla bleibt unverändert
C#-Quelltext
1: 2: 3:
| string text = v.SelectedText; string newText = "<font face=\"" + fontDialog1.Font.Name + "\">" + text + "</font>"; v.SelectedText.Replace(text, newText); |
Th69 - Mi 16.03.16 20:05
Hallo,
ich habe mal jetzt selbst in den Source von Scintialla.NET geschaut:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public unsafe void ReplaceSelection(string text) |
Ich war davon ausgegangen, daß dein verwendetes
Replace eine Methode von Scintialla.NET selbst ist (aber es ist nur die String-Methode und dessen Rückgabewert verwendest du nicht).
Csharp-programmierer - Mi 16.03.16 20:21
Und was bedeutet das jetzt? Also welche Methode muss ich verwenden?
Christian S. - Mi 16.03.16 20:24
Hast Du die Methode probiert, die Th69 zitiert hat?
Csharp-programmierer - Mi 16.03.16 20:37
Ich verstehe gerade nicht wirklich, um welchen Code es sich handelt. Um den public unsafe void ReplaceSelection(string Text); ?
Wenn ja, wo muss ich den einfügen?
Christian S. - Mi 16.03.16 21:27
Ich hätte jetzt mal vermutet, dass die Komponente, um die es hier die ganze Zeit geht, diese Methode hat und
Th69 sie deshalb zitiert hat. Habe Scintilla aber nicht im Einsatz und kann es deswegen nicht prüfen :nixweiss:
(Die Sache mit der Eigeninitiative hatten wir schon, gelle? :zwinker:)
Ralf Jansen - Mi 16.03.16 21:48
Zitat: |
Es müsste ja eigentlich klappen. |
Nein. Eine Weißheit von .Net ist ganz wichtig du du immer im Hinterkopf haben solltest "strings sind unveränderlich". Ich wiederhole weil so wichtig "strings sind unveränderlich". Stichwort wenn du das nachlesen willst und eine 3.te Wiederholung zum einprägen "strings sind immutable" ;)
Da die Erkenntnis nun eingesickert sein könnte. Schauen wir uns nun deinen Code an
Zitat: |
C#-Quelltext 1:
| v.SelectedText.Replace(text, newText); | |
SelectedText ist ein string und Replace ist eine Methode auf einem string. Und wie du gerade gelernt hast kannst du einen vorhanden string nicht ändern. Die Replace Methode liefert dir also einen neuen string (wie alle Methoden von string von denen man glauben könnte sie verändern den string). Und mit dem string der aus Replace zurückkommt machst du nix der geht sofort ins Nirvana. Du willst den neuen string der durch Replace entstanden ist wieder in SelectedText reinschreiben also mußt du den SelectedText auch wieder zuweisen.
C#-Quelltext
1:
| v.SelectedText = v.SelectedText.Replace(text, newText); |
Ich denke aber mal das du gar nicht willst was du da tust wenn es den funktioniert hätte. Es kämme zwar das raus was du willst aber eher zufällig. Replace ersetzt alle vorkommen von text in SelectedText durch newText. Es ist aber
text == SelectedText. Ein Aufruf von Replace also eher sinnfrei.
Du willst doch einfach nur SelectedText durch deinen newText ersetzen also einfach
C#-Quelltext
1: 2:
| string newText = "<font face=\"" + fontDialog1.Font.Name + "\">" + v.SelectedText+ "</font>"; v.SelectedText = newText; |
oder so wie TH69 schreibt per
C#-Quelltext
1:
| v.ReplaceSelection(newText); |
PS. und ja v ist ein Scheiß Name
PS. Gab es nicht mal eine Zensurpolicy für bestimmte Ausdrücke? Oder ist die Zensur dem "wie machen wir das Forum attraktiver" zum Opfer gefallen ;)
Th69 - Do 17.03.16 09:50
SelectedText bei der Scintilla.NET-Komponenten hat keinen Setter, daher ist ReplaceSelection zu benutzen (auch wenn ich hier Design-Optimierung sehe ;-)).
Csharp-programmierer - Do 17.03.16 14:12
Vielen Dank. Jetzt funktioniert es entlich :>)
Aber wo siehst du eine Optimierung im Design Th69?
Th69 - Do 17.03.16 15:22
Naja, so wie du es erst erwartest hast, also daß es auch einen Setter für SelectedText gibt, welcher das selbe macht wie ReplaceSelection.
Csharp-programmierer - So 20.03.16 12:50
Vielen Dank für eure Antworten. Es funktioniert nun :-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!