Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.06 c
2-1201342202
Sairex
2008-01-26 13:10
2008.02.24
Склеивание несколько файлов в один


15-1200733009
Vernutoring
2008-01-19 11:56
2008.02.24
asm - ошибка...


2-1201872603
bunchuk
2008-02-01 16:30
2008.02.24
ошибка при выполнение программы написанной на Delphi


2-1201890405
Urvin
2008-02-01 21:26
2008.02.24
Вторая копия приложения в CodeGear


2-1200299984
dr_creigan
2008-01-14 11:39
2008.02.24
вырубание процессов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский