Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2015, 14:47   #1
inkenvy
 
Регистрация: 15.03.2015
Сообщений: 3
По умолчанию Delphi - RichEdit. Удаление слова, строки, абзаца под курсором.

Собственно задание, пишем текстовый редактор, с помощью RichEdit. В дополнение ко всему функционалу, нужно 3 кнопки: удаление слова на котором стоит каретка, удаление абзаца, удаление строки.
Код:
uses 
 RichEdit; 
  
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; 
  X, Y: Integer); 
var 
  iCharIndex, iLineIndex, iCharOffset, i, j: Integer; 
  Pt: TPoint; 
  s: string; 
begin 
  with TRichEdit(Sender) do 
  begin 
    Pt := Point(X, Y); 
    // Get Character Index from word under the cursor 
    iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt)); 
    if iCharIndex < 0 then Exit; 
    // Get line Index 
    iLineIndex  := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex); 
    iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0); 
    if Lines.Count - 1 < iLineIndex then Exit; 
    // store the current line in a variable 
    s := Lines[iLineIndex]; 
    // Search the beginning of the word 
    i := iCharOffset + 1; 
    while (i > 0) and (s[i] <> ' ') do Dec(i); 
    // Search the end of the word 
    j := iCharOffset + 1; 
    while (j <= Length(s)) and (s[j] <> ' ') do Inc(j); 
    // Display Text under Cursor 
    Caption := Copy(s, i, j - i); 
  end; 
end;
Вот что есть, но этот алгоритм не учитывает того, что после слова может быть и точка и другие разделительные знаки. Относительно абзаца и строки всё труднее. Помогите составить алгоритм пожалуйста.

Последний раз редактировалось inkenvy; 15.03.2015 в 20:02.
inkenvy вне форума Ответить с цитированием
Старый 16.03.2015, 20:40   #2
inkenvy
 
Регистрация: 15.03.2015
Сообщений: 3
По умолчанию

Никто с RichEdit не работал?
inkenvy вне форума Ответить с цитированием
Старый 16.03.2015, 21:05   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А OnMouseMove при чем? В нем удалять собрался? SpeedButton и его OnClick как раз - фокус не забирает. В нем по позиции каретки анализируй текст в зависимости от того что хочешь удалить. Для удаления установи SelStart и SelLength по результатам анализа и в SelText присвой ''. С разделительными знаками уж сам как-то разбирайся
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.03.2015, 21:25   #4
inkenvy
 
Регистрация: 15.03.2015
Сообщений: 3
По умолчанию

Код:
function SelectWordUnderCaret(ARichEdit:TRichEdit):string;
var
   Line    : Integer;
   Column  : Integer;
   LineText: string;
   InitPos : Integer;
   EndPos  : Integer;
begin

   Line   := ARichEdit.Perform(EM_LINEFROMCHAR,ARichEdit.SelStart, 0) ;
   Column := ARichEdit.SelStart - ARichEdit.Perform(EM_LINEINDEX, Line, 0) ;

   if ARichEdit.Lines.Count-1 < Line then Exit;


   LineText := ARichEdit.Lines[Line];

   Inc(Column);
   InitPos := Column;

   while (InitPos > 0) and not (LineText[InitPos] in ['.', ' ', ',', #0]) do Dec(InitPos);
   Inc(Column);

   EndPos := Column;

   while (EndPos <= Length(LineText)) and not (LineText[EndPos] in ['.', ' ', ',', #0]) do Inc(EndPos);


   Result := Trim(Copy(LineText, InitPos, EndPos - InitPos), );

   ARichEdit.SelStart  := ARichEdit.Perform(EM_LINEINDEX, Line, 0)+InitPos;
   ARichEdit.SelLength := Length(Result);
end;
Вот что получилось наклепать, только работает не совсем корректно, иногда захватывает знаки препинания.Проверьте пожалуйста.
inkenvy вне форума Ответить с цитированием
Старый 16.03.2015, 22:51   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от inkenvy Посмотреть сообщение
Никто с RichEdit не работал?
это самый глючный компонент из стандартных.
тебе его использовать обязательно?
Изображения
Тип файла: jpg 11.jpg (80.0 Кб, 127 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.03.2015, 02:24   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
это самый глючный компонент из стандартных.
Обоснуй почему самый и почему глючный.
northener вне форума Ответить с цитированием
Старый 17.03.2015, 08:02   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
удаление слова на котором стоит каретка
Я бы делал так:
Код:
With RichEdit do begin
 i:=SelStart; j:=i;
 while (i>0)and(Lines.Text[i] in ['а'..'я']) do dec(i);
 while (j<Length(Lines.Text))and(Lines.Text[j] in ['а'..'я']) do inc(j);
 s:=Lines.Text; delete(s,i,j-i);Lines.Text:=s; 
end;
По крайней мере попробовал бы таким способом.
Или же воспользовавшись советом min@y™ посылал бы сообщение выделения и нажатия клавиши Del.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2015, 10:28   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Обоснуй почему самый и почему глючный.
убедился на собственном опыте и опыте коллег, лет 14 назад.
просто поверь на слово или не обращай внимание.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление строки под курсором!! daredevilok Общие вопросы C/C++ 1 11.11.2011 13:59
Удаление всех строк из RichEdit, начиная с определённой строки ondar Компоненты Delphi 5 07.06.2011 06:48
RichEdit. Слова из текста (Delphi) skat72 Помощь студентам 0 21.04.2010 19:14
удаление СЛОВА из строки LER44IKK Помощь студентам 5 20.11.2009 18:13
Получение слова под курсором. lazutov Win Api 4 15.08.2008 17:10