Форум: "KOL";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Внизвыбор мышкой компонента Найти похожие ветки
← →
Dy1 © (2007-05-27 11:18) [0]динамически создаются панели. Как удалить ту панель, на которой кликнули?
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)); // число непонятно откуда
← →
Galkov © (2007-05-27 11:23) [1]Через таймер :)))
← →
Galkov © (2007-05-27 11:27) [2]Если не обращать внимания на грамматику, конечно...
← →
homm © (2007-05-27 11:36) [3]MakeMethod ни разу не пользовался, но ежели так попробовать?
var
p: PClock;
begin
New(p);
p^.pan := NewPanel( Form1.Form, esRaised).PlaceDown;
p^.pan.Tag := n;
p^.pan.OnMouseDown := TOnMouse( MakeMethod( p^.pan, @OnMDn)); // здесь не то?
inc(n);
***
end;
← →
Vladimir Kladov (2007-05-27 16:42) [4]Ну опять. Первого параметра нет. OnMDn - это НЕ МЕТОД, а процедура.
← →
Dy1 © (2007-05-27 20:24) [5]> [4]
1) В уроках с www.kolnmck.ru (вроде урок 4-ый) написано именно так
2) ну, да. Я "чайник" :/
3) самое интересное, что в некоторых прогах пишу без пустышки и работает отлично, а с ней - глюки =8-o
← →
Galkov © (2007-05-27 20:53) [6]Чего вы все про грамматику-то :)
Dy1, скажи лучше: сумел сам себя уничтожить, или нет ???
> динамически создаются панели. Как удалить ту панель, на которой кликнули?
Разве не это главный вопрос топика ???
← →
homm © (2007-05-27 21:10) [7]> Разве не это главный вопрос топика ???
Нет. Все уничтожаеться. Просто Free. Просто до обработки пользовательских сообщений где-то предусмотретельно поставлен AddRef, а после Free.
← →
Galkov © (2007-05-27 22:05) [8]Ага, нашел - в EnumDynHandlers надо полагать...
Более точно: предусмотретельно поставлен RefInc, а после RefDec
← →
homm © (2007-05-27 22:10) [9]> Более точно: предусмотретельно поставлен RefInc, а после
> RefDec
Я кстати до сих пор не понимаю зачем вообще нужен этот RefDec? Нужено гарантированое существование объекта на заданом участке коде, делаем как-бы копию RefInc, не нужен более — уничтожаем Free. Зачем мудрить?
← →
Vladimir Kladov (2007-05-28 15:32) [10]RefDec это и есть Free, по сути. Или Free - это RefDec.
← →
homm © (2007-05-28 18:22) [11]> RefDec это и есть Free, по сути. Или Free - это RefDec.
Но почему тогда это разные методы? Кроме обратной совместимости нет вроде причин.
← →
Vladimir Kladov (2007-05-28 18:31) [12]В принципе, можно состряпать типа "синоним", не требующий самостоятельного кода. По крайней мере, в обычном Delphi прокатит: объявляется свойство property Free: Boolean read RefDec; соответственно RefDec объявить как булевскую функцию. И совместимость не страдает, и кода на несколько байтов меньше. Вот только у кого BDS всякие, тут недавно было, что не понимает новый Delphi такого обращения к свойству, без присваивания значения чему нибудь.
← →
homm © (2007-05-28 18:51) [13]> В принципе, можно состряпать типа "синоним", не требующий
> самостоятельного кода. По крайней мере, в обычном Delphi
> прокатит:
Дак все в наших руках :){$IFDEF }
← →
domo (2007-07-03 15:36) [14]У меня тоже есть небольшой вопрос про мышь. Мне нужно определить на каком символе (или после какого символа) произошел двойной щелчок мышкой в поле компонента KOLEditBox, чтобы потом вставить в эту позицию свой символ. Подскажите пожалуйста как это сделать (только мне желательно с примером).
← →
Vladimir Kladov (2007-07-03 17:15) [15]Пример вам. Совсем думать не хочется? Читайте про EM_CHARFROMPOS в справке по API или в MSDN. И методом TControl.Perform вызывайте.
← →
domo (2007-07-04 18:08) [16]Попробую, спасибо.
← →
domo (2007-07-05 14:41) [17]Пока я нашел только
EditBox1.Perform(EM_CHARFROMPOS , 0 , MAKELPARAM(x, y) );
но вставить это в программу пока не получилось.
← →
Дмитрий К © (2007-07-05 15:34) [18]
> но вставить это в программу пока не получилось.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-06 18:28) [19]Ну, понятно, пойду экспериментировать. Большое спасибо Дмитрию К. А я то пробовал:
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:31) [20]Ну, понятно, пойду экспериментировать. Большое спасибо Дмитрию К. А я то пробовал:
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-09 10:12) [21]Вставил в программу, проверил. Работает на ура. Спасибо, Дмитрий К, еще раз. Правда, у меня есть 2 вопросика, прошу ответьте пожалуйста:
- Почему в Sender.Perform(WM_CHAR,ord("!"),0); используется 0, а не 1, ведь мне нужно вставлять 1 символ, а не пустоту?
- После вставки слово остается выделенным, а это неудобно. Как программно снять выделение?
← →
=BuckLr= (2007-07-09 11:25) [22]
> используется 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
← →
Дмитрий К © (2007-07-09 11:59) [23]
> - После вставки слово остается выделенным, а это неудобно.
> Как программно снять выделение?
Например добавить после WM_CHAR:
Sender.Postmsg(EM_SETSEL,CharPos,CharPos);
← →
domo (2007-07-09 16:45) [24]Огромное спасибо за помощь и Дмитрию К за ответы.
> Причём тут пустота?
При том, что по документации этот параметр (0) задает сколько символов нужно вставить и "0" должен не вставлять ничего.
← →
domo (2007-07-10 08:58) [25]Народ, вы если мне советуете, то хоть как-то проверяйте свои советы тоже. Меня лучше не путать, я и сам путаюсь. В общем,
SelLength
выделение не снимает. Так что _не_ пишитеEditBox1.SelLength:=1;
, а _пишите_Sender.Postmsg(EM_SETSEL,CharPos,CharPos);
и говорите Дмитрию К спасибо.
← →
=BuckLr= (2007-07-10 11:21) [26]
> При том, что по документации этот параметр (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 12:56) [27]Нет, нет, я без претензий, особенно к тебе, =BuckLr=, наоборот, я тебе благодарен. Просто у меня нет той квалификации, чтобы проверить все предлагаемые теории. Я их принимаю на веру и пытаюсь заставить работать, а они не работают. Но хотя я ошибся, написав в SelLength "1" вместо "0", это не меняет сути:
EditBox1.SelLength:=0;
выделения не снимет. Или может снимет в Мемо1, но не в EditBox1.
← →
=BuckLr= (2007-07-11 15:23) [28]
> EditBox1.SelLength:=0; выделения не снимет. Или может снимет
> в Мемо1, но не в EditBox1
Опять неверно! И опять "может". А попробовать совсем никак?
← →
=BuckLr= (2007-07-11 15:42) [29]И опять же... (разворошили пчелиный улей :)) Что SelLength, что SelStart - всё одно, подойдёт и для мемо, и для эдита. Ведь они оба одной крови, так сказать.
Даю подсказку :) Всё, что тебе нужно - это SelStart и SelLength. SelStart покажет начало выделения, т.е. ты сможешь узнать, какой символ щёлкнули. Например:p
rocedure TForm1.EditBox1MouseUp(Sender: PControl; var Mouse: TMouseEventData);
begin
showmessage(int2str(EditBox1.SelStart));
end;
А SelLength := 0 чтобы снять выделение. Всё что нужно, уже есть в КОЛ, зачем изобретать велосипед...
← →
Дмитрий К © (2007-07-11 15:51) [30]
> сможешь узнать, какой символ щёлкнули
А если DoubleClick?
← →
Vladimir Kladov (2007-07-11 21:59) [31]При двойном клике сначала срабатывает OnMouseDown, где и можно запомнить SelStart на случай, если это двойной клик.
← →
=BuckLr= (2007-07-11 22:45) [32]
> А если DoubleClick?
Да какая разница... Пусть использует, где нужно, это лишь пример.
← →
domo (2007-07-12 09:45) [33]Что ж, я все сделал. И откликается на двойной, и мой символ вставляет, и выделение снимает. Всем огромное спасибо (и персонально =BuckLr=, Дмитрий К, Vladimir Kladov). Вопросов про мышь пока нет.
P.S.Остались вопросы по веткам ListView и Не ставятся никакие пакеты...
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.048 c