Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текст слева от каретки. 
:(
    Опции темы
hitter
Дата 1.4.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Как получить слово начало которого текущее положение
каретки в поле ввода, а конец первый пробел.
Хендл уже известен.
PM MAIL   Вверх
Sunvas
Дата 2.4.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



А че ж тут трудного то??
Код

var i:word;
begin
for i:=edit1.SelStart to length(edit1.Text) do
if edit1.Text[i]=' ' then
begin
result:=copy(edit1.Text,edit1.SelStart+1,i-edit1.SelStart);
break;
end;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
hitter
Дата 2.4.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Цитата(Sunvas @ 2.4.2006, 04:44 Найти цитируемый пост)
var i:word;
begin
for i:=edit1.SelStart to length(edit1.Text) do
if edit1.Text[i]=' ' then
begin
result:=copy(edit1.Text,edit1.SelStart+1,i-edit1.SelStart);
break;
end;

Это в проге, а мне надо в другом окне!
PM MAIL   Вверх
Yanis
Дата 2.4.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(hitter @ 1.4.2006, 20:04 Найти цитируемый пост)
Хендл уже известен.

На основе этого получи текст окна, текст каретки и уже в своей программе используй этот код.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Yanis
Дата 2.4.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



К стати, тебе точно нужно именно слева от каретки?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
hitter
Дата 3.4.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Цитата(Yanis @ 3.4.2006, 01:41 Найти цитируемый пост)
К стати, тебе точно нужно именно слева от каретки?
Объясняю -
Код

вот текст который вводится|

Так надо получить слово "вводится", ну и так по принципу.

PM MAIL   Вверх
Romikgy
Дата 3.4.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

var vpt: TPoint;
    xy: TSize;
    sl: TStringList;
    sx: String;
    konec: boolean;
    i: longint;
begin
konec:=true;
Edit1.SetFocus;
  sl:=TStringList.Create;
  sl.Text:=StringReplace(Edit1.Text,' ',#13#10,[rfReplaceAll]);
  sx:=sl[0];
  i:=0;
  GetCaretPos(vpt);
  while ( konec) do
  begin
  GetTextExtentPoint32(GetDC(Edit1.Handle),pchar(sx),
  length(sx), xy);
  if (xy.cx>vpt.X) then konec:=false
  else begin
     inc(i);
     sx:=sx+' '+sl[i];
  end;
  end;
  Edit2.Text:=sl[i];
  
  sl.Free;
end;

Работает , но незнаю насколько точно , т.к. GetTextExtentPoint32 и GetCaretPos возвращают разные значения для одних и тех же строк,
корочей попробуй
в эдит1 строка с курсором
в эдит2 ответ слово левее курсора


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Yanis
Дата 3.4.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(hitter @ 3.4.2006, 11:00 Найти цитируемый пост)
Так надо получить слово "вводится", ну и так по принципу.

Просто ты определись. Сначала говоришь, что нужен текст слева от каретки, потом говоришь, что каретка стоит в начале слова и тебе нужно его получить smile

Это сообщение отредактировал(а) Yanis - 3.4.2006, 15:43


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
hitter
Дата 3.4.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Цитата(Yanis @ 3.4.2006, 19:41 Найти цитируемый пост)
Просто ты определись. Сначала говоришь, что нужен текст слева от каретки, потом говоришь, что каретка стоит в начале слова и тебе нужно его получить 

Извиняюсь просто сразу не прикинул, ну я думаю теперь понятно!
Добавлено @ 19:34
Romikgy, сейчас попробую, может работает?
PM MAIL   Вверх
hitter
Дата 4.4.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Цитата(Romikgy @ 3.4.2006, 18:00 Найти цитируемый пост)
Работает , но незнаю насколько точно , т.к. GetTextExtentPoint32 и GetCaretPos возвращают разные значения для одних и тех же строк,
корочей попробуй
в эдит1 строка с курсором
в эдит2 ответ слово левее курсора

Помоему работает, но нету обработки на ошибки, прикрутил несколько проверок!
Если в едит1 стереть весь текст вылетает ошиба, - исправлено.
Еще поработаю , и выложу что получилось!

PM MAIL   Вверх
hitter
Дата 4.4.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Проверил работает-ли с Memo, нет не работает!
Отображает текст только верхней строчки!
А как изменить чтобы получал даже в мемо?
PM MAIL   Вверх
Romikgy
Дата 4.4.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

function take_left_word(const h: HWND): string;
var t,len,ss,es: longint;
    tex: pchar;
    sx: string;
    chst: set of char;
    b: boolean;
begin
  len:=GetWindowTextLength(h);
  GetMem(tex,len+1);
  GetWindowText(h,tex,len);
  sx:=StrPas(tex);
  Freemem(tex);
  SendMessage(h,EM_GETSEL,Longint(@t), 0);
  chst:=['a'..'z','A'..'Z','0'..'9','_'];
  ss:=0; es:=0;
  dec(t);
  if sx[t] in chst then else
  while (not (sx[t] in chst)) and (t>0) do dec(t);
  while ((sx[t] in chst) and (t>0)) do
  dec(t);
  inc(t);
  ss:=t;

  while ((sx[t] in chst) and (t<=len)) do
  inc(t);
  es:=t;
  Result:=copy(sx,ss,es-ss);
end;

работает с любым наследником эдитов
Добавлено @ 14:22
в чар сет добавь русские буквы если надо


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
hitter
Дата 4.4.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.3.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Цитата(Romikgy @ 4.4.2006, 18:21 Найти цитируемый пост)
работает с любым наследником эдитов

Опять мы уходим не в ту сторону!
Как то надо сделать универсальный способ получения этого текста!
Не зацЫкленый на наследниках едита!
Есть идея и соответствующий вопрос - может создать Тред и прикрутить его ко всем процессам,
и с помощью его контролировать ввод и вывод?
Способ по теории должен работать в любом месте ввода текста, где есть каретка!
Есть идеи?
Может даже намёки? smile smile
smile
PM MAIL   Вверх
Yanis
Дата 5.4.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(hitter @ 4.4.2006, 20:32 Найти цитируемый пост)
Способ по теории должен работать в любом месте ввода текста, где есть каретка!

А если каретка нарисована, то работать уже небудет. Т.е. она и в стандартных Edit'ах нарисована, но есть функции для получения информации о каретке для работы с этими контролами. Если же я сам буду отрисовывать каретку, то у тебя ничего не выйдет smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 5.4.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



hitter, ты б определился где те надо брать курсор, а потом спрашивал бы, т.к.
Цитата(hitter @ 4.4.2006, 19:32 Найти цитируемый пост)
универсальный способ

имхо нет, если б был давно был бы в DRKB smile smile smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1155 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.