Вверх ↑
Этот топик читают: Гость
Ответов: 4309
Рейтинг: 670
#121: 2009-11-11 16:26:39 ЛС | профиль | цитата
andrestudio, так:

#pas
var
p:Longint;

constructor THiAsmClass.Create;
begin
...

p:=Longint(Self);
...
end;



function ChildCallback(HWnd: THandle; Msg: Cardinal;
....
begin
....
THiAsmClass(Pointer(P))._hi_onEvent(onPath, path);
...
end;
карма: 23

1
Голосовали:andrestudio
Ответов: 4639
Рейтинг: 513
#122: 2009-11-11 16:35:40 ЛС | профиль | цитата
nesco,Netspirit, для меня это тёмный лес, но всёравно спасибо, буду думать как зделать заплатку.
карма: 6

0
Ответов: 4309
Рейтинг: 670
#123: 2009-11-11 16:41:43 ЛС | профиль | цитата
Приведенный мной выше пример работает только, если в проекте только один экземпляр компонента THiAsmClass (демонстрация этого - мой компонент InputBox в "Компонентах").
Если в проекте несколько экземпляров - в переменной р будет ссылка только на последний инициализированный экземпляр.
Поупражняйся пока с одним экземпляром. Когда разберешся - качай мой компонент SysMenuEx, там реализовано, как
работать нескольким экземплярам компонента с одной WndProc.
карма: 23

0
Разработчик
Ответов: 25656
Рейтинг: 2085
#124: 2009-11-11 16:43:43 ЛС | профиль | цитата
Netspirit писал(а):
Приведенный мной выше пример работает только, если в проекте только один экземпляр компонента THiAsmClass (демонстрация этого - мой компонент InputBox в "Компонентах").
Если в проекте несколько экземпляров - в переменной р будет ссылка только на последний инициализированный экземпляр

Netspirit, повторяемся

nesco писал(а):
Можно было сделать глобальной переменной, но тут требуется наличие только одного экземпляра класса, если их будет несколько, то работать будет только последний инициализированный

карма: 19

0
Ответов: 4309
Рейтинг: 670
#125: 2009-11-11 16:47:07 ЛС | профиль | цитата
nesco, извини, пересиделся за компьютером наверное
карма: 23

0
Ответов: 4639
Рейтинг: 513
#126: 2009-11-11 21:54:28 ЛС | профиль | цитата
nesco,Netspirit не получилась у меня эта фишка, помогите чем можете, на последнем шаге запнулся , но чую овчинка выделки стоит. nesco, через инжект можно всю линейку Shell перетащить да из Delphi VCL кому до размера пофиг (как мне например) тоже прикрутить контролы будет без проблем наверно.

вот весь проект http://slil.ru/28192156 ~55Kb путь получает только с кнопки пока
карма: 6

0
Ответов: 4309
Рейтинг: 670
#127: 2009-11-12 12:20:47 ЛС | профиль | цитата
andrestudio, я приведенный мной выше пример подправил, только что заметил некоторые неточности.
Фрагмент в твоем коде

#pas
//THiAsmClass.doPath(path);
//THiAsmClass(Pointer(P))._hi_onEvent(onPathDbClc, path);
//_hi_onEvent(onPath, path);
//_hi_onEvent(onPathDbClc, path);
по-моему, должен выглядеть так:

#pas
THiAsmClass(Pointer(P)).doPath(path); //Явно указываем, что Р указывает на THiAsmClass в котором есть метод doPath
THiAsmClass(Pointer(P))._hi_onEvent(onPathDbClc, path);
//_hi_onEvent(onPath, path);
//_hi_onEvent(onPathDbClc, path);

Также раскоментируй var p:Longint;
Замени

#pas
procedure THiAsmClass.Create;
begin
p:=Longint(Self);
end;

на


#pas
constructor THiAsmClass.Create;
begin
p:=Longint(Self);
end;
(это одна из тех самых неточностей, которые я заметил сегодня). Добавь в класс обьявление этого конструктора.
И проверь, действительно ли вызывается процедура ChildCallback (положи в нее MBox).
карма: 23

1
Голосовали:andrestudio
Ответов: 4639
Рейтинг: 513
#128: 2009-11-12 12:52:35 ЛС | профиль | цитата
Netspirit, спасибо большое, ссылка на метод заработала а на точку пока нет, ну да ладно мне такой вариант даже лучше подходит. Вот теперь можно кодить потихоньку
карма: 6

0
Гость
Ответов: 17029
Рейтинг: 0
#129: 2009-11-12 12:59:56 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2017-06-14 22:55:52
карма: 0

0
Ответов: 4309
Рейтинг: 670
#130: 2009-11-12 13:01:00 ЛС | профиль | цитата
Выше - это я.
карма: 23

0
Ответов: 4639
Рейтинг: 513
#131: 2009-11-12 13:08:06 ЛС | профиль | цитата
Ага, принцип уловил, дальше дело техники
------------ Дoбавленo в 21.58:
Очень печально но событие по WM_LBUTTONUP не ловится , может кто в курсе в чём дело, вместо него двойной клик срабатывает.
карма: 6

0
Ответов: 4309
Рейтинг: 670
#132: 2009-11-13 11:46:49 ЛС | профиль | цитата
andrestudio писал(а):
вместо него двойной клик срабатывает

То есть, то, что должно было срабатывать по одиночному клику, срабатывает только по двойному?
Смахивает на неверное значение константы WM_LBUTTONUP, но это невероятно. Посмотри, может ты перепутал константы.
карма: 23

0
Ответов: 4639
Рейтинг: 513
#133: 2009-11-13 12:54:09 ЛС | профиль | цитата
Да, мне нужны именно события WM_KEYUP и WM_LBUTTONUP, т.к при WM_KEYDOWN и WM_LBUTTONDOWN возращает предыдущий путь, не отрабатывает контрол. Константы в Message.pas заданы верно, я проверил. Скорей всего гдето в другом месте собака порыта.
карма: 6

0
Разработчик
Ответов: 4671
Рейтинг: 420
#134: 2009-11-16 12:30:28 ЛС | профиль | цитата
Смотрю коды готовых проектов(Ctrl+D), раз сто увидел Self((мультик)ClassMain := Self;...) и никак не разберусь ЧаВо это за переменная, кто нибудь может подсказать?
Я это к тому, что хочу создать мультик, умеющий передавать значения property из компонента класса MultiElement(Ex) в класс EditMulti(Ex), например есть компонент MultiElement(_prop_Str1:string,_prop_Str2:string), как передать их значение в EditMulti для дальнейшей обработки?, а натыкаюсь на Self
карма: 10
0
Ответов: 5446
Рейтинг: 323
#135: 2009-11-16 13:26:14 ЛС | профиль | цитата
Assasin, Self - это указатель на текущий экземпляр (instance) текущего класса.
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)