Вопрос № 86156: Уважаемые эксперты, у меня есть на форме некоторый физуальный объект, Button1, например, как мне создать новый объект на форме, который бы унаследовалал все свойства исходного Button1?
По задумке код в приложении должен делать следующее:при нажат...Вопрос № 86189: Уважаемые эксперты, помогите пожайлуста разобраться.
Необходимо создавать несколько дочерних форм (кол-во неизвестно).
Они будут показывать изображение получаемое через TMemoryStream.
Привожу код тестового примера. Формы и потоки создаютс...Вопрос № 86195: Доброго времени суток, Уважаемые эксперты.
а) есть Image1 (TImage)
б) реализуем два обработчика события Image1Click и Image1DblClick для него.
Думаю вы уже догадываетесь в чем проблема:
если реализован только один из этих обработчиков...
Вопрос № 86.156
Уважаемые эксперты, у меня есть на форме некоторый физуальный объект, Button1, например, как мне создать новый объект на форме, который бы унаследовалал все свойства исходного Button1?
По задумке код в приложении должен делать следующее:при нажатии на кнопку Button1 должна появиться под ней ее точная копия, однако исходная кнопка просто исчезает.
Как исправить ситуацию?
Приложение:
Отправлен: 09.05.2007, 15:17
Вопрос задал: Werebear (статус: 1-ый класс)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Denisss
Здравствуйте, Werebear!
См. пример в приложении.
Небольшое замечание к Вашему коду:
NewButt:= Button1;
- данная операция не производит копирования свойств кнопки Button1 в NewButt.
Копировать свойства, в данном случае, придется вручную.
В Delphi, на "физическом" уровне, объекты представляют собой ссылки на область памяти, где размещена реализация нужного объекта. При подобном копировании, Вы замещаете ссылку к объекту NewButt на ссылку к объекту Button1.
Т.о., выполняемая далее операция
NewButt.top:=NewButt.top+Button1.height;
приводит к тому, что Вы компоненту Button1 устанавливаете свойство Top равное сумме Top и Height, поэтому она у Вас и исчезает, а если точнее, то она просто куда-то перемещается.
PS
Может стоит использовать другое название объекту NewButt, а то перевод слова Butt не совсем цензурный. ;-)
Удачи!
Приложение:
Ответ отправил: Denisss (статус: Профессионал) Россия, Москва WWW:Хлама много, по сути ничего... ICQ: 281599577 ---- Ответ отправлен: 09.05.2007, 16:25 Оценка за ответ: 2
Отвечает: Coupler
Здравствуйте, Werebear!
Я предлагаю читать и копировать компонент именно как память, используя TMemoryStream. Но при этом способе приходится на время менять имя кнопки-источника.
Приложение:
Ответ отправил: Coupler (статус: Студент)
Ответ отправлен: 09.05.2007, 16:48 Оценка за ответ: 5
Отвечает: Gh0stik
Здравствуйте, Werebear!
Предлагаю еще один способ.
Смотрите приложение, по нажатию на кнопку создается копия текущей, но только немного ниже.
Good Luck!!!
Приложение:
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессионал) Украина, Славянск Организация: Славянский государственный педагогический университет (Кафедра алгебры) ICQ: 289363162 ---- Ответ отправлен: 09.05.2007, 18:07 Оценка за ответ: 4
Отвечает: Вадим Викторович Витомский
Здравствуйте, Werebear!
Для копирования ВСЕХ свойств любого обьекта используется метод Assign. В Вашем случае можно попробовать следующий код (см. приложение).
Приложение:
Ответ отправил: Вадим Викторович Витомский (статус: 7-ой класс)
Ответ отправлен: 10.05.2007, 09:27 Оценка за ответ: 2 Комментарий оценки: Convert Error
Вопрос № 86.189
Уважаемые эксперты, помогите пожайлуста разобраться.
Необходимо создавать несколько дочерних форм (кол-во неизвестно).
Они будут показывать изображение получаемое через TMemoryStream.
Привожу код тестового примера. Формы и потоки создаются, но фомы обрабатывают один и тот же поток. Никак не могу понять как каждой форме подсунуть свой. Или нужно идти другим путём? Подскажите тогда как это сделать.
Строчка, где Вы пишете "Тут ошибка", по сути, не нужна вовсе. Вместо rt нужно использовать Tag - Вы в него уже записали нужное Вам значение. И так во всем коде.
А вообще, глобальных переменных лучше либо не использовать, либо использовать как можно меньше.
Заодно, лучше очищать память не с помощью MyStream:= nil, а с помощью освобождения каждого элемента, входящего в данный массив.
Приложение:
Ответ отправил: Denisss (статус: Профессионал) Россия, Москва WWW:Хлама много, по сути ничего... ICQ: 281599577 ---- Ответ отправлен: 10.05.2007, 01:01 Оценка за ответ: 5 Комментарий оценки: Есть небольшие неточности. Но всё легко исправить.
Вопрос № 86.195
Доброго времени суток, Уважаемые эксперты.
а) есть Image1 (TImage)
б) реализуем два обработчика события Image1Click и Image1DblClick для него.
Думаю вы уже догадываетесь в чем проблема:
если реализован только один из этих обработчиков, то он работает, а если оба одновременно,
то выполняется только Image1Click (т.к. по сути Image1DblClick - это два события Image1Click).
Каким образом можно "разделить" эти методы?
Спасибо.
type
TForm1 = class(TForm)
Image1: TImage;
...
procedure TForm1.Image1Click(Sender: TObject);
begin
ShowMessage('click');
end;
procedure TForm1.Image1DblClick(Sender: TObject);
begin
ShowMessage('dblclick');
end;
Как вариант, можно использовать таймер для отлова двойного нажатия (см. пример в приложении).
Для того, чтобы код заработал, достаточно на форму разместить таймер TTimer со вкладки "System".
Удачи!
Приложение:
Ответ отправил: Denisss (статус: Профессионал) Россия, Москва WWW:Хлама много, по сути ничего... ICQ: 281599577 ---- Ответ отправлен: 10.05.2007, 02:00 Оценка за ответ: 5 Комментарий оценки: То что надо!
Предложу Вам просто немного "подождать" и посмотреть если было событие DblClick - то выполнять его, а если нет то продолжаем выполнять OneClick.
Вот код соответствующих прощедур: procedure TForm1.Image3Click(Sender: TObject);
var ms:TMsg;
tm:Cardinal;
begin
tm:=GetTickCount+GetDoubleClickTime; {вычисляем время для второго клика}
repeat
if PeekMessage(ms,0,WM_LBUTTONDBLCLK,WM_LBUTTONDBLCLK,PM_NOREMOVE)
then begin Image3DblClick(Sender);exit;end; {если все-таки нажали дважды то передаем обработку на двойное нажатие и по возвращению сразу обрываем работу одиночного клика}
until GetTickCount > tm; {если не уложились во время значит нажатие был "одиночным"}
ShowMessage('One clicked!!!!!!');
end;
procedure TForm1.Image3DblClick(Sender: TObject);
begin
ShowMessage('Double clicked!!!!!!');
end;
Good Luck!!!
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессионал) Украина, Славянск Организация: Славянский государственный педагогический университет (Кафедра алгебры) ICQ: 289363162 ---- Ответ отправлен: 10.05.2007, 03:03 Оценка за ответ: 5 Комментарий оценки: Спасибо. Потрясающе простой код!
Отвечает: Werewolf
Здравствуйте, Ренат Байрамгулов!
Дело в том, что события OnClick и OnDoubleClick вызываются при получении наследниками TControl сообщений WM_LBUTTONUP и WM_LBUTTONDBLCLK cоответственно
при чем
сообщение WM_LBUTTONUP посылается при каждом отпускании левой кнопки мыши
а сообщение WM_LBUTTONDBLCLK посылается если интервал времени между предыдущим и последним отпусканием мыши меньше или равен параметру, который можно задать в настройках мыши в панели управления.
при одном нажатии ваша форма получит сообщение
WM_LBUTTONUP
при двойном нажатии ваша форма получит сообщения в следующем порядке
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
если в вашем обработчике нет показа модального окна
иначе ваше форма просто не получит сообщение второго нажатия, т.к. после первого нажатия откроется другое окно
в данном случае проще
убрать обработку OnClick
добавить к рисунку PopupMenu в него добавить все необходимые действия
написать обработчик OnDblClick
Удачи. =)
Ответ отправил: Werewolf (статус: Студент)
Ответ отправлен: 10.05.2007, 12:06