Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 44 из 116<  1 ... 41  42  43  44  45  46  47 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Ray Adams & Koval
Чуть подправил. ;)
Измененные и добавленные места выделены - // Edit.
В оригинальном варианте после удаления мышки с объекта происходит постоянная генерация события OnMouseLeave.
Достаточно в обработчик события OnMouseLeave добавить ShowMessage('MouseLeave'), чтобы убедится в этом. :)
В предложенном в варианте это исправлено.
Код:
unit Ext_Image;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TExtImage = class(TImage)
  private
    { Private declarations }
    FMouseOnObject: Boolean;  // Edit
    FOnMouseEnter: TNotifyEvent;  //Make the Mouse Enter and Leave available
    FOnMouseLeave: TNotifyEvent;
    FPicture1:TPicture;
    FPicture2:TPicture;
    procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
    procedure SetPicture1(P:TPicture);
    procedure SetPicture2(P:TPicture);
  protected
    { Protected declarations }
    procedure MouseEnter; dynamic;  // Edit
    procedure MouseLeave; dynamic;  // Edit
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
    property OnMouseEnter: TNotifyEvent
        read FOnMouseEnter  // Edit
       write FOnMouseEnter;

    property OnMouseLeave: TNotifyEvent
        read FOnMouseLeave  // Edit
       write FOnMouseLeave;

    property  Picture1:TPicture read FPicture1 write SetPicture1;
    property  Picture2:TPicture read FPicture2 write SetPicture2;
  end;

procedure Register;

implementation

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 раз.

 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
LoCk_J
Цитата:
MMSystem относится к Borland Delphi 6
извини, но это бред. В Delphi 7 он 100% есть, сам не раз пользовался.
Цитата:
может из-за того что я установил compact вместо typical?
может.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
_SGK писал(а):
В оригинальном варианте после удаления мышки с объекта происходит постоянная генерация события OnMouseLeave.

Не должна если только ты не будеш вставлять туда показ ShowMessage :)
Хотя я не проверял, мне было это нужно один раз да и не для коммерческой разработки, а для собственной нужды и причем одноразово. Уже сейчас даже и не помню для чего я это дело писал вообще :) У меня много таких компонентов чисто одноразовых.


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Ray Adams
Ray Adams писал(а):
Не должна если только ты не будеш вставлять туда показ ShowMessage

Если ты обратил внимание, то я пост редактировал 3 раза.
Потому, что краткая формулировка проблемы мне не нравилась, а на пол страницы писать не хотелось. :)
Просто ты, очевидно, не вставлял код в обработчик события и ессно ничего не заметил.
Согласись, что многократное выполнение кода в обработчике не есть хорошо, в том случае если код необходимо выполнить один раз как реакцию на событие.
ShowMessage был предложен, как наиболее явный, визуально наблюдаемый пример глюка. ;)
Имхо если предложен обработчик, то и вставляемый код должен им обрабатываться корректно.


Последний раз редактировалось _SGK 03.09.2005 22:06, всего редактировалось 1 раз.

 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Не знаю почему у тебя так, но у меня проблем с этим нет и с чего ты вообще взял что это так???
Вот тебе пример.
На форму бросаеш это компонент и один TMemo
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ExtImage;

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, что соответственно опять вызывает обработчик - что и должно быть :)


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
Ray Adams
Хм странно у меня получется что картинка много раз перерисовывается.
Можьть глюк...

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Ray Adams
Ray Adams писал(а):
Так как обработка CM_MOUSEENTER есть в стандартных компонентах.

Я в курсе. :)

Ray Adams писал(а):
что соответственно опять вызывает обработчик - что и должно быть

Неа, так быть не должно. :)
Одно событие вызванное пользователем = одна обработка.
Ну, кому, как тебе не знать, что если разработчик предоставляет пользователю компоненты свойства и события, то он вполне может ожидать того, что пользователь будет их использовать по своему усмотрению.
И частенько абсолютно не так, как ожидалось разработчиком. ;)
Если есть обработчик события, то должна быть и возможность вставить в обработчик любой код.
А рекомендации типа "белого и синего не носить" не к чему хорошему не ведут.
Другой вопрос, что класс создавался как разовый.
Я просто привел пример и слегка изменил твой код, чтобы он всегда выполнялся корректно. :beer:


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
_SGK писал(а):
Ну, кому, как тебе не знать, что если разработчик предоставляет пользователю компоненты свойства и события, то он вполне может ожидать того, что пользователь будет их использовать по своему усмотрению. И частенько абсолютно не так, как ожидалось разработчиком

Ты что-то гвориш не то :) Все пашет так как и было задумано, по одному разу срабатывает событие при входе мыши и при выходе. В чем проблема то? :)

Код:
чтобы он всегда выполнялся корректно.

Он и так корректно выполнялся, я не вижу не корректности кода


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Ray Adams
Ray Adams писал(а):
Он и так корректно выполнялся, я не вижу не корректности кода

Очень хорошо. :)
Дискуссию закончил.


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Возникла у меня тут необходимость написать что-то типа теста, но проблема в том, что приложение(я) должно быть типа клиент/сервер. Т.е. на серваке в сети стоит прога, которая должна выдавать по запросу клиентам случайное задание из списка и по окончании тестирования принимать отчет (типа фамилия, оценка и т.д.). При этом клиетская часть проги естесственно должна эти запросы отсылать.
В связи с этим несколько вопросов:
1. Какой протокол лучше использовать TCP или UDP
2. Компов в сети много, небудет ли проблем при использовании одного порта?

Я сейчас в нете роюсь, инфу по этому вопросу ищу, так что если кто подкинет полезные ссылочки, буду очень благодарен.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Lord_of_Darkness писал(а):
1. Какой протокол лучше использовать TCP или UDP

Хммм, а ты сам понимаеш разницу между этими двумя протоколами? :) Конечно TCP/IP, UDP тебе тут ничем не поможет.

Lord_of_Darkness писал(а):
2. Компов в сети много, небудет ли проблем при использовании одного порта?

Вопрос можно? Ты с сокетами работал? Просто попробуй и думаю эти вопросы сами отвалятся :) Конечно никаких проблем не будет .

Там все в принципе просто, погляди на стандартные примеры от Indy, там почти все есть.


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Ray Adams Понял, бум работать...
Цитата:
Вопрос можно? Ты с сокетами работал?
Можно, не работал.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (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
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
wCat
Цитата:
а чем, собственно, не устраивают базы данных?
дык мне только элементарные вещи нужны, нехочется с БД марочится.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

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 запись, содержащая динамический массив, дельфя долго и упорно ругается... Оно и понятно, но есть ли другой способ? Ессно не хотелось бы руками в текстовый файл писать :insane:

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
Lord_of_Darkness писал(а):
Можно ли как-нибудь сохранить свою структуру данных (запись), в которой присутствует динамический массив?
Типизированные файлы не катят, т.е. на Fl: file of TMyData; где TMyData запись, содержащая динамический массив, дельфя долго и упорно ругается... Оно и понятно, но есть ли другой способ? Ессно не хотелось бы руками в текстовый файл писать :insane:


Как я думаю если у тебя динамический массив, то остается самому написать
функции записи и чтения в файл, т.е. все делать ручками, писать по-очереди все элементы массива и кол-во этих элементов в заголовок файла. А при чтении считываеш заголовок и далее читаеш N-ое кол-во раз.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 44 из 116<  1 ... 41  42  43  44  45  46  47 ... 116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan