Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

выбор мышкой компонента   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.02 c
6-1180002451
FireMan_Alexey
2007-05-24 14:27
2008.02.24
snova Proxy!


9-1167719462
@!!ex
2007-01-02 09:31
2008.02.24
Collision Detection


2-1201596048
Михаил (Питер)
2008-01-29 11:40
2008.02.24
Интернет бот


15-1201188802
Sergei
2008-01-24 18:33
2008.02.24
Версия BIOS


2-1200477368
Washington
2008-01-16 12:56
2008.02.24
Панель задач - трей