Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Caret Position im Richedit beim Tastendrücken PageUP/Down


ardely - Do 28.02.13 11:18
Titel: Caret Position im Richedit beim Tastendrücken PageUP/Down
Guten Tag
Wenn ich der vertikaler scrollbar eines Richedit bewegen, nach unten oder nach oben, das Caret Position bleibt im Text, also der Text bewegt sich mit dem Caret.
Aber wenn ich die Taste Page (up/down) drücke das Caret bleibt immer sichtlich, bewegt sich nicht mit dem Text.

Gibt es eine Möglichkeit dass der Caret am Text Position bleibt beim Tastendrücken Page-Up / Page-Down !

Danke für Ihren Vorschlag


bummi - Do 28.02.13 11:59

Ich hoffe ich habe die Anforderung richtig verstanden...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key in [VK_PRIOR,VK_Next] then
    begin
      if key=VK_PRIOR then PostMessage(Richedit1.Handle,WM_VScroll,SB_PAGEUP,0)
      else if key=VK_Next then PostMessage(Richedit1.Handle,WM_VScroll,SB_PAGEDOWN,0);

      key := 0;
    end;

end;


ardely - Do 28.02.13 12:31

Super, Danke für dein gutes Beispiel es klappt tadellos.


WasWeißDennIch - Do 28.02.13 12:58

*Hüstel* in auf Word anzuwenden ist gewagt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case key of 
    VK_PRIOR:
      PostMessage(Richedit1.Handle,WM_VScroll,SB_PAGEUP,0);
    VK_Next:
      PostMessage(Richedit1.Handle,WM_VScroll,SB_PAGEDOWN,0);
    else
      Exit;
  end;
  key := 0;
end;

Wen das Exit stört, der kann auch das Nullen in einen begin-end-Block für die beiden Fälle schreiben,


bummi - Do 28.02.13 13:17

@WasWeißDennIch , so problematisch wie Du sehe ich es nicht...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
 i:Word;
begin
   for I := 0 to High(Word) do
     if i in [VK_PRIOR,VK_Next] then memo1.lines.add(IntToStr(i))

end;


WasWeißDennIch - Do 28.02.13 13:55


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  i, j: word;
begin
  i := 300;
  j := 300;
  if i in [100200, j] then
    ShowMessage('Gefunden');
end;

Wer da die Bereichsprüfung nicht aktiviert hat, sucht sich den Wolf.


bummi - Do 28.02.13 14:19

Ist schon klar, aber mein Set war ja gültig ...


WasWeißDennIch - Do 28.02.13 14:23

Auch klar, sonst hätte der Compiler das bereits bemängelt, da er es bei Konstanten bereits zur Compiletime bemerken kann. Trotzdem würde ich so etwas nach Möglichkeit vermeiden, da man sonst Gefahr läuft, Fehler wie in meinem Beispiel zu machen. Ganz abgesehen davon muss ich bei der case-Abfrage nur einmal vergleichen, aber das ist eher nebensächlich.


Narses - Do 28.02.13 18:27

Moin!

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Ganz abgesehen davon muss ich bei der case-Abfrage nur einmal vergleichen, aber das ist eher nebensächlich.
Und falsch. ;) Wird erst richtig, wenn du ein "minimal" vor dem "einmal" einfügst. Wenn du einen Case suchst, der nicht in der Liste ist, musst du für alle Cases einen Vergleich "ausgeben". :idea:

cu
Narses


WasWeißDennIch - Do 28.02.13 18:48

Meine Güte, lasst uns ein paar Erbsen zählen und anschließend ein paar Haare spalten. Was ich meinte, war:

Delphi-Quelltext
1:
2:
if Key in [Menge] then //1. Vergleich
  if Key = SomeKey then //2. Vergleich

im Gegensatz zum case.