Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 16.03.16 17:06 
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.

ausblenden 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 :)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 16.03.16 17:25 
Hallo,

mit
ausblenden 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...

Für diesen Beitrag haben gedankt: Csharp-programmierer
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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 ;-)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 16.03.16 17:50 
Den 2. Parameter von Replace, also
ausblenden C#-Quelltext
1:
2:
3:
string newText = "blablabla";

v.SelectedText.Replace(text, newText); // v ist aber kein guter Name!!!

Und jetzt mußt du nur noch deine Logik so umschreiben, daß es für newText den korrekten String erzeugt.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
2:
3:
string text = v.SelectedText;
string newText = "<font face=\"" + fontDialog1.Font.Name + "\">" + text + "</font>";
v.SelectedText.Replace(text, newText);

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 16.03.16 20:05 
Hallo,

ich habe mal jetzt selbst in den Source von Scintialla.NET geschaut:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
/// <summary>
/// Replaces the current selection with the specified text.
/// </summary>
/// <param name="text">The text that should replace the current selection.</param>
/// <remarks>
/// If there is not a current selection, the text will be inserted at the current caret position.
/// Following the operation the caret is placed at the end of the inserted text and scrolled into view.
/// </remarks>
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 16.03.16 20:21 
Und was bedeutet das jetzt? Also welche Methode muss ich verwenden?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 16.03.16 20:24 
Hast Du die Methode probiert, die Th69 zitiert hat?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Csharp-programmierer
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 user profile iconTh69 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:)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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:
ausblenden 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.

ausblenden 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

ausblenden C#-Quelltext
1:
2:
string newText = "<font face=\"" + fontDialog1.Font.Name + "\">" + v.SelectedText+ "</font>";
v.SelectedText = newText;


oder so wie TH69 schreibt per

ausblenden 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 ;)

Für diesen Beitrag haben gedankt: Csharp-programmierer
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 17.03.16 14:12 
Vielen Dank. Jetzt funktioniert es entlich :>)

Aber wo siehst du eine Optimierung im Design Th69?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: So 20.03.16 12:50 
Vielen Dank für eure Antworten. Es funktioniert nun :-)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein