![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выбор мышкой компонента
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, чтобы потом вставить в эту позицию свой символ. Подскажите пожалуйста как это сделать (только мне желательно с примером).