Ray Adams & Koval Чуть подправил. Измененные и добавленные места выделены - // Edit.
В оригинальном варианте после удаления мышки с объекта происходит постоянная генерация события OnMouseLeave.
Достаточно в обработчик события OnMouseLeave добавить ShowMessage('MouseLeave'), чтобы убедится в этом. В предложенном в варианте это исправлено.
procedure TExtImage.CMMouseEnter(var Msg:TMessage); begin inherited; if not FMouseOnObject then // Edit begin Picture.Assign(Picture2); FMouseOnObject := True; MouseEnter; end; end;
procedure TExtImage.CMMouseLeave(var Msg:TMessage); begin inherited; if FMouseOnObject then // Edit begin Picture.Assign(Picture1); FMouseOnObject := False; MouseLeave; end; end;
procedure TExtImage.MouseEnter; // Edit begin if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); end;
procedure TExtImage.MouseLeave; // Edit begin if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); end;
procedure TExtImage.SetPicture1; begin FPicture1.Assign(P); Picture.Assign(p); end;
procedure TExtImage.SetPicture2; begin FPicture2.Assign(P); Picture.Assign(p); end;
constructor TExtImage.Create(AOwner: TComponent); begin inherited; FPicture1:=TPicture.Create; FPicture2:=TPicture.Create; end;
procedure Register; begin RegisterComponents('Ray Adams', [TExtImage]); end;
end.
Кое-что убрал, что с дуру приблудилось.
Последний раз редактировалось _SGK 02.09.2005 20:42, всего редактировалось 3 раз(а).
Member
Статус: Не в сети Регистрация: 11.07.2004 Откуда: Воронеж
_SGK Ты тоже заметил.
Да кстати ты лучше чем я поправил.
Я просто зделал обработку сообшений для всех объектов на форме и определял
что это за объект, а ты сохранил это как отднльный испр.(блин вернее компонент).
Спасибо тебе тоже
_________________ Удачи и мудрости.
Последний раз редактировалось Koval 03.09.2005 19:30, всего редактировалось 1 раз.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
_SGK писал(а):
В оригинальном варианте после удаления мышки с объекта происходит постоянная генерация события OnMouseLeave.
Не должна если только ты не будеш вставлять туда показ ShowMessage Хотя я не проверял, мне было это нужно один раз да и не для коммерческой разработки, а для собственной нужды и причем одноразово. Уже сейчас даже и не помню для чего я это дело писал вообще У меня много таких компонентов чисто одноразовых.
Не должна если только ты не будеш вставлять туда показ ShowMessage
Если ты обратил внимание, то я пост редактировал 3 раза.
Потому, что краткая формулировка проблемы мне не нравилась, а на пол страницы писать не хотелось. Просто ты, очевидно, не вставлял код в обработчик события и ессно ничего не заметил.
Согласись, что многократное выполнение кода в обработчике не есть хорошо, в том случае если код необходимо выполнить один раз как реакцию на событие.
ShowMessage был предложен, как наиболее явный, визуально наблюдаемый пример глюка. Имхо если предложен обработчик, то и вставляемый код должен им обрабатываться корректно.
Последний раз редактировалось _SGK 03.09.2005 22:06, всего редактировалось 1 раз.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Не знаю почему у тебя так, но у меня проблем с этим нет и с чего ты вообще взял что это так???
Вот тебе пример.
На форму бросаеш это компонент и один TMemo
type TForm1 = class(TForm) ExtImage1: TExtImage; Memo1: TMemo; procedure ExtImage1MouseEnter(Sender: TObject); procedure ExtImage1MouseLeave(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ExtImage1MouseEnter(Sender: TObject); begin Memo1.Lines.Add('enter'); end;
procedure TForm1.ExtImage1MouseLeave(Sender: TObject); begin Memo1.Lines.Add('leave'); end;
end.
И глянь , что получится Даже если добавить ShowMessage то и так он будет показывать только один при входе!
Если у тебя иначе, значит глючит Delphi! Так как обработка CM_MOUSEENTER есть в стандартных компонентах.
Добавлено спустя 3 минуты, 3 секунды: Только сейчас понял почему ты так подумал! Ты выводиш ShowMessage, нажимаеш ESC и оно у тебя она выходит! Почему? Да потому, что когда выодится ShowMessage оно выводится модально и соответственно когда оно прячется фокус передается в старое окно и мышь опять появляется на TExtImage, что соответственно опять вызывает обработчик - что и должно быть
Так как обработка CM_MOUSEENTER есть в стандартных компонентах.
Я в курсе.
Ray Adams писал(а):
что соответственно опять вызывает обработчик - что и должно быть
Неа, так быть не должно. Одно событие вызванное пользователем = одна обработка.
Ну, кому, как тебе не знать, что если разработчик предоставляет пользователю компоненты свойства и события, то он вполне может ожидать того, что пользователь будет их использовать по своему усмотрению.
И частенько абсолютно не так, как ожидалось разработчиком. Если есть обработчик события, то должна быть и возможность вставить в обработчик любой код.
А рекомендации типа "белого и синего не носить" не к чему хорошему не ведут.
Другой вопрос, что класс создавался как разовый.
Я просто привел пример и слегка изменил твой код, чтобы он всегда выполнялся корректно.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
_SGK писал(а):
Ну, кому, как тебе не знать, что если разработчик предоставляет пользователю компоненты свойства и события, то он вполне может ожидать того, что пользователь будет их использовать по своему усмотрению. И частенько абсолютно не так, как ожидалось разработчиком
Ты что-то гвориш не то Все пашет так как и было задумано, по одному разу срабатывает событие при входе мыши и при выходе. В чем проблема то?
Код:
чтобы он всегда выполнялся корректно.
Он и так корректно выполнялся, я не вижу не корректности кода
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Возникла у меня тут необходимость написать что-то типа теста, но проблема в том, что приложение(я) должно быть типа клиент/сервер. Т.е. на серваке в сети стоит прога, которая должна выдавать по запросу клиентам случайное задание из списка и по окончании тестирования принимать отчет (типа фамилия, оценка и т.д.). При этом клиетская часть проги естесственно должна эти запросы отсылать.
В связи с этим несколько вопросов:
1. Какой протокол лучше использовать TCP или UDP
2. Компов в сети много, небудет ли проблем при использовании одного порта?
Я сейчас в нете роюсь, инфу по этому вопросу ищу, так что если кто подкинет полезные ссылочки, буду очень благодарен.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Почитал про сокеты, остановился на компонентах TClientSocket и TServerSocket. Вроде с коннекто разобрался, но остался вопрос:
Будет ли корректно для реализации
Цитата:
на серваке в сети стоит прога, которая должна выдавать по запросу клиентам случайное задание из списка
применить такую схему:
1. сервак по ClientRead получает запрос на рандомную выборку вопросов
2. тут же производит создание данной выборки
3. тут же передает ее клиенту по Socket.SendBuf
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Последний раз редактировалось Lord_of_Darkness 06.09.2005 18:23, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 13.06.2005 Откуда: Украина, Глухов
Lord_of_Darkness а чем, собственно, не устраивают базы данных?
к примеру Interbase/Firebird - для таких задач самое оно.
Запросы, коннекты, логины/пароли - все решается сервером, а отображение на клиенте, ну плюс какая-никакая логика.
А. Или и клиент и сервер тобой написанные должны быть?
Member
Статус: Не в сети Регистрация: 13.06.2005 Откуда: Украина, Глухов
оно конечно, кому как. но если чуток знаешь БД - сильно проще будет в твоем вопросе. IMHO, как здесь любят повторять всеравно ж заморачиваться с сокетами.
_________________ Что-то начнется, что-то закончится...
Люди спасайте!
Надо менять прокси-сервев в ИЕ налету. Отрыл код на С++ но я в нем туго соображаю ((( Может кто "переведет" его на Делфу или откомпилит мне dll?
Код:
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr) { //conn_name: active connection name. //proxy_full_addr : eg "210.78.22.87:8000" INTERNET_PER_CONN_OPTION_LIST list; BOOL bReturn; DWORD dwBufSize = sizeof(list); // Fill out list struct. list.dwSize = sizeof(list); // NULL == LAN, otherwise connectoid name. list.pszConnection = conn_name; // Set three options. list.dwOptionCount = 3; list.pOptions = new INTERNET_PER_CONN_OPTION[3]; // Make sure the memory was allocated. if(NULL == list.pOptions) { // Return FALSE if the memory wasn't allocated. OutputDebugString("failed to allocat memory in SetConnectionOptions()"); return FALSE; } // Set flags. list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
// Set proxy name. list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";
// Set proxy override. list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; list.pOptions[2].Value.pszValue = "local";
// Set the options on the connection. bReturn = InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory. delete [] list.pOptions; InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0); return bReturn; } BOOL DisableConnectionProxy(LPCTSTR conn_name) { //conn_name: active connection name. INTERNET_PER_CONN_OPTION_LIST list; BOOL bReturn; DWORD dwBufSize = sizeof(list); // Fill out list struct. list.dwSize = sizeof(list); // NULL == LAN, otherwise connectoid name. list.pszConnection = conn_name; // Set three options. list.dwOptionCount = 1; list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount]; // Make sure the memory was allocated. if(NULL == list.pOptions) { // Return FALSE if the memory wasn't allocated. OutputDebugString("failed to allocat memory in DisableConnectionProxy()"); return FALSE; } // Set flags. list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT ; // Set the options on the connection. bReturn = InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize); // Free the allocated memory. delete [] list.pOptions; InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0); return bReturn; }
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Можно ли как-нибудь сохранить свою структуру данных (запись), в которой присутствует динамический массив?
Типизированные файлы не катят, т.е. на Fl: file of TMyData; где TMyData запись, содержащая динамический массив, дельфя долго и упорно ругается... Оно и понятно, но есть ли другой способ? Ессно не хотелось бы руками в текстовый файл писать
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 02.03.2005 Откуда: Владивосток
Lord_of_Darkness писал(а):
Можно ли как-нибудь сохранить свою структуру данных (запись), в которой присутствует динамический массив? Типизированные файлы не катят, т.е. на Fl: file of TMyData; где TMyData запись, содержащая динамический массив, дельфя долго и упорно ругается... Оно и понятно, но есть ли другой способ? Ессно не хотелось бы руками в текстовый файл писать :insane:
Как я думаю если у тебя динамический массив, то остается самому написать
функции записи и чтения в файл, т.е. все делать ручками, писать по-очереди все элементы массива и кол-во этих элементов в заголовок файла. А при чтении считываеш заголовок и далее читаеш N-ое кол-во раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения