Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выбор мышкой компонента


Страницы:   1 2

Dy1 ©   (2007-05-27 11:18:00) 

динамически создаются панели. Как удалить ту панель, на которой кликнули?
var
 p: PClock;
begin
 New(p);
 p^.pan := NewPanel( Form1.Form, esRaised).PlaceDown;
 p^.pan.Tag := n;
 p^.pan.OnMouseDown := TOnMouse( MakeMethod( nil, @OnMDn)); // здесь не то?
 inc(n);
***
end;

Procedure OnMDn(Sender: PControl; var Mouse: TMouseEventData);
begin
 msgok(int2str(Sender^.Tag)); // число непонятно откуда


domo   (2007-07-12 09:45:00) [1]

Что ж, я все сделал. И откликается на двойной, и мой символ вставляет, и выделение снимает. Всем огромное спасибо (и персонально =BuckLr=, Дмитрий К, Vladimir Kladov). Вопросов про мышь пока нет.

P.S.Остались вопросы по веткам ListView и Не ставятся никакие пакеты...


=BuckLr=   (2007-07-11 22:45:00) [2]


> А если DoubleClick?

Да какая разница... Пусть использует, где нужно, это лишь пример.


Vladimir Kladov   (2007-07-11 21:59:00) [3]

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


Дмитрий К   (2007-07-11 15:51:00) [4]


> сможешь узнать, какой символ щёлкнули

А если DoubleClick?


=BuckLr=   (2007-07-11 15:42:00) [5]

И опять же... (разворошили пчелиный улей :)) Что SelLength, что SelStart - всё одно, подойдёт и для мемо, и для эдита. Ведь они оба одной крови, так сказать.

Даю подсказку :) Всё, что тебе нужно - это SelStart и SelLength. SelStart покажет начало выделения, т.е. ты сможешь узнать, какой символ щёлкнули. Например:
p
rocedure TForm1.EditBox1MouseUp(Sender: PControl; var Mouse: TMouseEventData);
begin
 showmessage(int2str(EditBox1.SelStart));
end;


А SelLength := 0 чтобы снять выделение. Всё что нужно, уже есть в КОЛ, зачем изобретать велосипед...


=BuckLr=   (2007-07-11 15:23:00) [6]


> EditBox1.SelLength:=0; выделения не снимет. Или может снимет
> в Мемо1, но не в EditBox1

Опять неверно! И опять "может". А попробовать совсем никак?


domo   (2007-07-10 12:56:00) [7]

Нет, нет, я без претензий, особенно к тебе, =BuckLr=, наоборот, я тебе благодарен. Просто у меня нет той квалификации, чтобы проверить все предлагаемые теории. Я их принимаю на веру и пытаюсь заставить работать, а они не работают. Но хотя я ошибся, написав в SelLength "1" вместо "0", это не меняет сути: EditBox1.SelLength:=0;выделения не снимет. Или может снимет в Мемо1, но не в EditBox1.


=BuckLr=   (2007-07-10 11:21:00) [8]


> При том, что по документации этот параметр (0) задает сколько
> символов нужно вставить и "0" должен не вставлять ничего.

Блин! А для кого я процитировал ту самую документацию?! Из неё следует, что для большинства случаев этот твой ноль приложению по барабану. Ты бы сначала проверил. Разве Memo1.Perform(WM_CHAR, ORD('!'), 0) не работает?! И читай справку по АПИ внимательней, желательно на английском, и полную. А то "родила свинья коня"...


> Народ, вы если мне советуете, то хоть как-то проверяйте
> свои советы тоже

Для начала сам проверяй, что тебе советуют


> В общем, SelLength выделение не снимает.

Кто сказал? А так Memo1.SelLength := 0?


> Так что _не_ пишите EditBox1.SelLength:=1

Естественно! SelLength означает по-англицки "длина выделения" и если она 1, то выделится ОДИН символ, а если 0, то выделения не будет.


> а _пишите_ Sender.Postmsg(EM_SETSEL,CharPos,CharPos)

Ну да, мы лёгких путей не ищем...

Хорош сваливать с больной головы на здоровую. А то помогаешь, помогаешь, и на тебе... Барабан был плох, барабанщик л*х...


domo   (2007-07-10 08:58:00) [9]

Народ, вы если мне советуете, то хоть как-то проверяйте свои советы тоже. Меня лучше не путать, я и сам путаюсь. В общем, SelLengthвыделение не снимает. Так что _не_ пишите EditBox1.SelLength:=1;, а _пишите_ Sender.Postmsg(EM_SETSEL,CharPos,CharPos);и говорите Дмитрию К спасибо.


domo   (2007-07-09 16:45:00) [10]

Огромное спасибо за помощь и Дмитрию К за ответы.

> Причём тут пустота?

При том, что по документации этот параметр (0) задает сколько символов нужно вставить и "0" должен не вставлять ничего.


Дмитрий К   (2007-07-09 11:59:00) [11]


> - После вставки слово остается выделенным, а это неудобно.
>  Как программно снять выделение?

Например добавить после WM_CHAR:

   Sender. Postmsg(EM_SETSEL,CharPos,CharPos);


=BuckLr=   (2007-07-09 11:25:00) [12]


> используется 0, а не 1, ведь мне нужно вставлять 1 символ,
>  а не пустоту?

Причём тут пустота?

Because there is not necessarily a one-to-one correspondence between keys pressed and character messages generated, the information in the high-order word of the lKeyData parameter is generally not useful to applications.


> Как программно снять выделение?

SelLength


domo   (2007-07-09 10:12:00) [13]

Вставил в программу, проверил. Работает на ура. Спасибо, Дмитрий К, еще раз. Правда, у меня есть 2 вопросика, прошу ответьте пожалуйста:
- Почему в Sender.Perform(WM_CHAR,ord('!'),0); используется 0, а не 1, ведь мне нужно вставлять 1 символ, а не пустоту?
- После вставки слово остается выделенным, а это неудобно. Как программно снять выделение?


domo   (2007-07-06 18:31:00) [14]

Ну, понятно, пойду экспериментировать. Большое спасибо Дмитрию К. А я то пробовал:

longint(ClickedCharPosition):=EditBox2.Perform(EM_CHARFROMPOS, 0, EM_LINEINDEX);

а потом:

var i, ClickedCharPosition: LongInt;  p: pPoint;
begin
p.y:=SendMessage(EditBox2.Handle, EM_LINEINDEX, i, 0);
p.x:=SendMessage(EditBox2.Handle, EM_LINEFROMCHAR, EditBox2.SelStart, 0);
ClickedCharPosition:=SendMessage(EditBox2.Handle, EM_CHARFROMPOS, 0, LongInt(@p));
end;


а оно всё не работало и не работало (хотя должно и первое, и второе)

Кстати, в документации КОЛ я нашел, что если в окне нет выделения (но наверно, это не во всех типах окон, я еще не проверил), то позицию щелкнутого символа можно узнать просто опросив свойство SelStart:

ClickedCharPosition:=EditBox2.SelStart + 1;


domo   (2007-07-06 18:28:00) [15]

Ну, понятно, пойду экспериментировать. Большое спасибо Дмитрию К. А я то пробовал:

longint(ClickedCharPosition):=EditBox2.Perform(EM_CHARFROMPOS, 0, EM_LINEINDEX);

а потом:

var i, ClickedCharPosition: LongInt;  p: pPoint;
begin
p.y:=SendMessage(EditBox2.Handle, EM_LINEINDEX, i, 0);
p.x:=SendMessage(EditBox2.Handle, EM_LINEFROMCHAR, EditBox2.SelStart, 0);
ClickedCharPosition:=SendMessage(EditBox2.Handle, EM_CHARFROMPOS, 0, LongInt(@p));
end;


а оно всё не работало и не работало (хотя должно и первое, и второе)

Кстати, в документации КОЛ я нашел, что если в окне нет выделения (но наверно, это не во всех типах окон, я еще не проверил), то позицию щелкнутого символа можно узнать просто опросив свойство SelStart:

ClickedCharPosition:=EditBox2.SelStart + 1;


Дмитрий К   (2007-07-05 15:34:00) [16]


> но вставить это в программу пока не получилось.


program charfrompos;

uses
 windows, messages, KOL;

type
 PForm1 = ^TForm1;
 TForm1 = object(TObj)
   form, edt: PControl;
 public
   procedure DoDblClick(Sender: PControl; var Mouse: TMouseEventData);
 end;

var Form1: PForm1;
procedure NewForm1(var Result: PForm1; AParent: PControl);
begin
 New(Result, Create);
 with Result^ do
 begin
   form:=NewForm(AParent, 'CharFromPos').SetSize(400,300);
   applet:=form;
   edt:=NewEditbox(form, []).CenterOnParent;
   edt.Text:='Hello';
   edt.OnMouseDblClk:=DoDblClick;
 end;
end;

procedure TForm1.DoDblClick(Sender: PControl; var Mouse: TMouseEventData);
var CharPos: Integer;
begin
 CharPos:=Sender.Perform(EM_CHARFROMPOS,0,MakeLParam(Mouse.X,Mouse.Y));
 if CharPos <> -1 then
 begin
   Sender.Perform(EM_SETSEL,CharPos,CharPos);
   Sender.Perform(WM_CHAR,ord('a'),0);
 end;
end;

begin
 NewForm1(Form1, nil);
 run(applet);
end.


domo   (2007-07-05 14:41:00) [17]

Пока я нашел только

EditBox1.Perform(EM_CHARFROMPOS , 0 , MAKELPARAM(x, y) );

но вставить это в программу пока не получилось.


domo   (2007-07-04 18:08:00) [18]

Попробую, спасибо.


Vladimir Kladov   (2007-07-03 17:15:00) [19]

Пример вам. Совсем думать не хочется? Читайте про EM_CHARFROMPOS в справке по API или в MSDN. И методом TControl.Perform вызывайте.


domo   (2007-07-03 15:36:00) [20]

У меня тоже есть небольшой вопрос про мышь. Мне нужно определить на каком символе (или после какого символа) произошел двойной щелчок мышкой в поле компонента KOLEditBox, чтобы потом вставить в эту позицию свой символ. Подскажите пожалуйста как это сделать (только мне желательно с примером).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо