TEdit - pozycja kursora i usunięcie znaku

0

Potrzbuję napisać algorytm, który sprawdzi pozycję kursora w komponencie TEdit i usunie znak stojący po jego prawej stronie.

Zrobiłem swoje menu podręczne dla tej kontrolki, ale nie mogę za pierona znaleźć sposobu na zrobienie obsługi klawisza Delete, mienowicie w momencie, gdy SelText jest różny od pustego łańcucha lub SelLength jest większy od 0, usuwam tylko zaznaczony tekst przez przypisanie do niego pustego łańcucha (SelText := ''). Ale co, jeśli brak zaznaczonego tekstu? Potrzebuję usunąć znak po kursorze, ale nie wiem jak odczytać pozycję kursora;

Próbowałem zasymulować dla obydwu przypadków wciśnięcie klawisza Delete, ale funkcja keybd_event powodowała problemy...

W sieci znalazłem kilka przykładów jak obejść taką sytuację, ale głównie chodziło o prowadzenie indeksu kursora przez utworzenie zmiennej liczbowej, a później sprawdzanie wartości klawisza (w zdarzeniu OnKeyDown) i na jego podstawie modyfikowanie wartości tej zmiennej. Zbyt wiele kombinowania jak na tak banalną sprawę, a do tego wykluczona zostaje obsługa myszki...

Czy zna ktoś sposób na ręczne usuwanie znaku po prawej stronie kursora? Może wie ktoś w jaki sposób edytowana jest zawartość kontrolki w standardowym menu podręczym? Zasada jest taka sama dla wszystkich kontrolek tekstowych (jak TMemo, TEdit, TSpinEdit).

Kiedyś wiedziałem jak się to robi, ale zapomniałem i na dodatek nie mam źródła ze stosowanym wcześniej kodem. Bardzo proszę o jakieś wskazówki.

0

property SelStart

0

Ale kicha... Nie sprawdziłem, że faktycznie właściwość SelStart przyjmuje pozycję kursora...

Rozwiązałem problem w ten sposób:

{...}
var
  CaretIndex: Integer;
  FileName: String;
begin
  if edtFileName.SelLength > 0 then
    edtFileName.SelText := ''
  else
  begin
    CaretIndex := edtFileName.SelStart;
    FileName := edtFileName.Text;

    if CaretIndex < Length(FileName) then
    begin
      Delete(FileName, CaretIndex + 1, 1);
      edtFileName.Text := FileName;
      edtFIleName.SelStart := CaretIndex;
    end;
  end;
end;

i działa elegancko, ale mam pytanie - w jaki sposób można to zrobić szybciej / prościej?

0
//usunięcie znaku stojącego po prawej stronie kursora
  edtFileName.SelLength:=1;
  edtFileName.SelText:='';
0

w jaki sposób można to zrobić szybciej / prościej?

no to już chyba tylko tak:

asm
jmp $+1
mov eax,0xE0FFC031h
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1