SelText GTK/GTK2/Win

Rund um die LCL und andere Komponenten
Antworten
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

SelText GTK/GTK2/Win

Beitrag von monta »

Hallo,

ich hab nen kleines Problem mit Seltext innerhalb eines Memos.

Es soll eine Art Tag um den markierten Text gesetzt werden. Das ganze Funktioniert unter Windows problemlos.

Code: Alles auswählen

Memo.SelText := 'Tag' + Memo.SelText + 'Tag';
Damit wird der Text korrekt um die Markierung eingefügt bzw. Am Kurzer gesetzt, wenn nichts markiert ist.

Unter GTK läuft das ganze auch korrekt ab, nur da gibts ja erstmal keinen Cursor, also hätte ich wesentlich lieber GTK2. Soweit läuft damit auch alles, aber es gibt ein Problem, sobald der Text Umlaute enthält, werden die Eifügungen genau um die Anzhal der Umlaute falsch positioniert und schließen somit nichtmehr den markirten text ein, sonder befinden sich (je nach Textlänge und Umlautanzahl) irgendwo wieder.
Johannes

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ein weites Feld ;-)
Was hast du denn im System? UTF-8?
Da gibt's sonderbare Phänomene.
Hast du mal probiert, den Text mit UTF8Encode(..) einzufügen?

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

ich habs schon befürhtet, das ich da auf das leidige Thema Zeichenkodierung stoße...

UTF-Encoding ist nicht aktiviert, und als Sprachkennung steht RC_LANG auf de_DE@Euro.

Die Anzeige klappt auch einwandfrei, soweit, aber im Memo wird einfach die Texlänge bzw. Seltext falsch ermittelt. Und ein kopieren in die Zwischenablage macht alle Umlaute zu nichte...

Ich probier nochmal rum, vielleicht sollte man UTF auch aktivieren.

//Edit:
Mit aktiviertem UTF geht zumindest das korrekte kopieren in die zwischenablage, mehr aber auch nicht.

das Problem ist die Tatsache, das der markierte Text gänzlich falsch ausgegeben wird:

Code: Alles auswählen

ShowMessage(IntToStr(Memo_BBText.SelStart));
  ShowMessage(Memo_BBText.SelText);
mal zwei Beispiele:
Text: abcdäüjklm
ab[highlight=green]cd[/highlight]äüjklm >> Korrekte Ausgabe: 2 / cd
abcd[highlight=green]äüj[/highlight]klm >> Ausgabe 4 / ä
abcdäüjk[highlight=green]lm[/highlight] >> Ausgabe 8 / jk
Für jeden Umlaut scheint sich das ganze um einz zu verschieben, also ist ein Umlaut wohl mit zwei Byte kodiert (?) Aber die Erkenntnis bringt mich irgendwie gerade wenig weiter. Ich kann ja schlecht die davor liegenden Umlaute zählen.
Johannes

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Hallo,

Code: Alles auswählen

copy(UTF8Decode(Memo1.Text), succ(Memo1.SelStart), Memo1.SelLength)])
damit bekommst du den korrekten Auswahltext.

Könnte wohl auch eine Ungereimtheit im GTk2 sein.
Bei SynMemo bspw. bekommst du korrekte Werte.

Edit:
Hm, dann ist nur noch das Problem die Umlaute werden nur noch als ? dargestellt.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

stimmt, jetzt gibts Fragezeichen, aber die korrekte Stelle.

Ich proviers nach dem schlafen nochmal. Vielleicht kann man irgendwie das ganze auch Zusammenkopieren, ähnlich wie du es oben hast, also Text vor Selektion + Einfügung + Selektion + Textdanach usw... ist zwar um drei Ecken, könnte aber gehen.

//Edit, habs gerade probiert:

geht bestens, man muss nur noch wieder ein UTFEncode um das ganze machen und Umlaute werden ausgegeben. Dann werd ich es vorerst unter Linux so machen und zusammenkopieren, anstatt auf SelText direkt zu zugreifen.
Es sei denn, jemand weis, wie man Seltext überreden kann ;)

Auf jeden Fall Danke für den Hinweis :D

//Edit2, fürs Verständnis, was macht eigentlich succ ?
Johannes

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

monta hat geschrieben://Edit2, fürs Verständnis, was macht eigentlich succ ?
Inkrementiert Ordinalwerte. Hat damit nix zu tun.

Character := 'A';
Character := Succ(Character);

Character ist jetzt 'B';

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

also quasi inc als function.
Johannes

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

monta hat geschrieben:also quasi inc als function.
ja, das Gegenstück für dec() lautet pred()

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

und ich hab mich immer geärgert, das inc keine funktion ist.

Jetzt gibts aber ein neues Problem, das Einfügen funktioniert nun, da ich unter Linux nicht über Seltext gehe, sondern den kompletten Text aus dem alten zusammenkopiere und dem Memo wieder zuweise.

Aber dadurch wird ja die Scrollposition des Memos wieder auf 0 gesetzt.

Wenn ich die Posiiotn der VertScrollbar vorher speichere und wieder herstellen will, landet man wesentlich weiter oben, als korrekt wäre. Wie kommt man also wieder zur vorhergehenden Position im Memo?
Johannes

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

DiBo33 hat geschrieben:ja, das Gegenstück für dec() lautet pred()
Tatsächlich? Was ist dann eigentlich das Gegenstück zu inc?

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Euklid hat geschrieben:
DiBo33 hat geschrieben:ja, das Gegenstück für dec() lautet pred()
Tatsächlich? Was ist dann eigentlich das Gegenstück zu inc?
Ähm, succ() ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Euklid hat geschrieben:
DiBo33 hat geschrieben:ja, das Gegenstück für dec() lautet pred()
Tatsächlich? Was ist dann eigentlich das Gegenstück zu inc?
inc(-1);
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

xnalpf
Beiträge: 43
Registriert: Di 4. Sep 2007, 15:43

Beitrag von xnalpf »

af0815 hat geschrieben:
Euklid hat geschrieben:
DiBo33 hat geschrieben:ja, das Gegenstück für dec() lautet pred()
Tatsächlich? Was ist dann eigentlich das Gegenstück zu inc?
inc(-1);
Ihr habt dibo33 nicht richtig verstanden. Er meinte nicht das gegenteil von dec/inc ist pred/succ sondern er meinte das Gegenstück zu im Sinne von dec verhält sich zu pred wie inc zu succ. Also eigentlich einfach nur so wie es inc und dec zum inkrementieren und dekrementieren gibt, gibt es pred und succ um den Vorgänger oder Nachfolger zu bestimmen.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Danke xnalpf! Ich glaube, das war mein Verständnisproblem ;)

Antworten