Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   seltext in trichedit imitieren (https://www.delphipraxis.net/160677-seltext-trichedit-imitieren.html)

DrUArn 25. Mai 2011 19:39

seltext in trichedit imitieren
 
Hallo,
eine Frage zur Methodik der Textmarkierung z.b. in Trichedit oder Tmemo:

Shift+Pos1 markiert zum Zeilenanfang - Shift+Ende zum Zeilenende.

Je nachdem, ob man vorher schon eine Markierung z.b. per Shift+-> oder Shift+<- erzeugt hat, wird seltext entweder in die gleiche Richtung verlängert oder "flippt" um einen Fixpunkt (im letzten Fall muß man vorher seltext in die entgegengesetzte Richtung verlängert haben).

Weiß jemand, woran Trichedit erkennt, in welche Richtung man vorher markiert hat - eine Eigenschaft, die die Tastenbewegungen mit protokoliert?

Ich würde dieses Verhalten gerne genauso simulieren, kann mir aber keinen Algorithums vorstellen, der diese Entscheidung alleine anhand von selstart und sellength bieten kann.

Bin gespannt
MfG
Uwe

Codewalker 25. Mai 2011 21:23

AW: seltext in trichedit imitieren
 
Ich vermute mal, dass das über die Eigenschaft SelStart vom RichEdit abbildbar ist. Wenn du weißt, wo der Anfang ist (SelStart) kann man leicht anhand der Cursor-Position die Markierung bestimmen

DrUArn 26. Mai 2011 13:35

AW: seltext in trichedit imitieren
 
Danke, Thomas,

aber das löst das Problem eben nicht!

Selstart liegt ja immer "links", eben am anfang der Markierung, egal, ob man mit z.b. shift+-> oder shift+<- die Markierung erzeugt. Benutzt man dann zusätzlich die Pos1- oder Ende-Taste, verhält sich die veränderte Markierung unterschiedlich - je nach dem, ob man vorher in die gleiche Richtung markiert hat, wird dies bis zum Zeilenanfang (Ende) verlängert oder "flippt" um den Fixpunkt.

MfG
Uwe

himitsu 26. Mai 2011 14:01

AW: seltext in trichedit imitieren
 
Das RichEdit geht nunmal aber von der Cursorposition aus ... daß SelStart leider nicht mit der Cursorposition übereinstimmt, ist bei deiner gewünschten Vorgehensweise ein großes Problem,
welches sich ohne Kenntnis der richtigen Cursorposition nur schwer nicht lösen läßt.

p80286 26. Mai 2011 16:53

AW: seltext in trichedit imitieren
 
Zitat:

Zitat von DrUArn (Beitrag 1103041)
....wird dies bis zum Zeilenanfang (Ende) verlängert oder "flippt" um den Fixpunkt.

Diese Interpretation ist nicht ganz richtig.
Es handelt sich um zwei voneinander unabhängige Selektionen, die den gleichen "Fixpunkt" haben.
Diesen Fixpunkt kann man bestimmen indem man Selstart in Relation zur Cursorbewegung (CursorTasten) setzt oder selstart permanent beobachtet. Wird Selstart kleiner und SelLength größer Wird zum Satzanfang hin selektiert. Fixpunkt ist also Selstart+Sellength.

Nur frage ich mich wofür das gut sein soll, denn letztlich wird die Selektion weiter verarbeitet. Egal ob von links oder rechts selektiert wurde.

Gruß
K-H

Lannes 26. Mai 2011 22:07

AW: seltext in trichedit imitieren
 
Hallo,

Der Ankerpunkt ist der Punkt am dem zuletzt SelLength 0 war.

Im Richedit läßt es sich einfach prüfen:
Delphi-Quellcode:
procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
begin
  if RichEdit1.SelLength = 0 then
    Caption := IntToStr(RichEdit1.SelStart) //Ankerpunkt
    else
      Label1.Caption := IntToStr(RichEdit1.SelStart);
end;
Ist Ankerpunkt > SelStart geht die Markierung in die "negative" Richtung.

DrUArn 31. Mai 2011 16:52

AW: seltext in trichedit imitieren
 
Danke erst mal allen für die Ideen!

Habe für mich selbst noch keine Lösung gefunden - muß wohl noch etwas brüten!

Eigentlich wollte ich ja nur das Verhalten von Trichedit bei shift+ende (Markierung von selstart bis Zeilenende incl. Zeilenumbruch) ändern, so daß der Zeilenumbruch nicht mitmarkiert wird (wie in tmemo)- die Berechnugen dazu sind einfach - aber die Beeinflussung der key-Routinen nicht so.

Auch eine Änderung von key in vk_left und shift in [ssshift,ssctrl] (im trichedit wird dann bis zum Zeilenende OHNE Zeilenumbruch markiert) hilft nicht - dann wird nur Zeichenweise markiert.

Delphi-Quellcode:
  procedure keyup(var Key: Word; Shift: TShiftState);override;

procedure TRichEditTab_ua.keydown(var Key: Word; Shift: TShiftState);
begin
 case key of
 VK_END: if (shift=[ssshift]) then begin shift:=ssshift,ssctrl];key:=VK_RIGHT;end;
 end;
 inherited;
end;
Vielleicht darf man auf diese weise die Variablen nicht ändern - oder liegt's an shift - keine Variable?

MfG
Uwe

Lannes 31. Mai 2011 23:12

AW: seltext in trichedit imitieren
 
hmmmm, man muss ja nicht alles verstehen :spin2:
Zitat:

Zitat von DrUArn (Beitrag 1102916)
... Ich würde dieses Verhalten gerne genauso simulieren, kann mir aber keinen Algorithums vorstellen, ...

Zitat:

Zitat von DrUArn (Beitrag 1103944)
...Eigentlich wollte ich ja nur das Verhalten von Trichedit bei shift+ende (Markierung von selstart bis Zeilenende incl. Zeilenumbruch) ändern

was möchtest Du denn nun? nachbauen oder ändern?

So wird das letzte Zeichen wieder aus der Markierung herrausgenommen:
Delphi-Quellcode:
case key of
  VK_END: if ssShift in Shift then
            RichEdit.SelLength := RichEdit.SelLength -1;
  end;
(alternativ auf das erste #10 nach Selstart prüfen und entsprechend markieren)
... aber ob das dein Ziel ist :gruebel:

DrUArn 1. Jun 2011 11:03

AW: seltext in trichedit imitieren
 
Danke Lannes,

zu Deiner Anmerkung: nachbauen wäre mir lieber - das sind eben solche Probleme, die einem nicht aus dem Kopf gehen - man möchte wissen, wie's geht!

zu Deinem Beispiel der Verkürzung von sellength um 1: geht, wenn man's in keyup unterbringt
Delphi-Quellcode:
procedure TRichEditTab_ua.keyup(var Key: Word;Shift: TShiftState);
begin
  case key of
     VK_END: if (shift=[ssshift]) then begin sellength:=SelLength-1;{key:=0;}end;
  end;

 inherited;
end;
Sieht zwar etwas lustig aus - in keydown wird ja erst die Berechnung incl. Zeilenumbruch ausgeführt - und das sieht man - und danach nehme ich wieder eine Verkürzung um 1 vor. Aber so geht's.
Gerade probiert: In keyup muß man key:=0 auch nicht mehr einfügen.

MfG
Uwe

Lannes 1. Jun 2011 21:17

AW: seltext in trichedit imitieren
 
Zitat:

Zitat von DrUArn (Beitrag 1104065)
Sieht zwar etwas lustig aus - in keydown wird ja erst die Berechnung incl. Zeilenumbruch ausgeführt - und das sieht man - und danach nehme ich wieder eine Verkürzung um 1 vor.

deshalb der Alternativvorschlag:

(alternativ auf das erste #10 nach Selstart prüfen und entsprechend markieren)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf