Autor |
Beitrag |
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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.
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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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...
Für diesen Beitrag haben gedankt: Csharp-programmierer
|
|
Csharp-programmierer 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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); |
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
(Die Sache mit der Eigeninitiative hatten wir schon, gelle?  )
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
Für diesen Beitrag haben gedankt: Csharp-programmierer
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
|
|