Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Почему не работает TTrackBar.OnExit?   Найти похожие ветки 

 
Валера   (2012-04-29 11:02) [0]

Этот код не раборает, Дельфи 7:


procedure TForm1.TrackBar1Enter(Sender: TObject);
begin
 Caption:= "Enter";
end;

procedure TForm1.TrackBar1Exit(Sender: TObject);
begin
 Caption:= "Exit";
 ShowMessage("Exit");
end;


Или подскажите какое сообщение генерируется после "отжатия" бегунка?
Т.е. покак мы его таскаем все нормально, а как отпускаем нужно получить сообщение.


 
Baks   (2012-04-29 15:23) [1]

Обрабатывай OnChange

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 Caption:= IntToStr(TrackBar1.Position);
end;


 
Валера   (2012-04-29 15:43) [2]


> Baks   (29.04.12 15:23) [1]
>
> Обрабатывай OnChange


Оно срабатывает при "таскании" ползунка.
Нужно получить событии при его отпускании.


 
Плохиш ©   (2012-04-30 00:39) [3]

OnKeyUp/OnKeyDown


 
Германн ©   (2012-04-30 01:42) [4]


> Плохиш ©   (30.04.12 00:39) [3]

Это события клавиатуры.


> Валера   (29.04.12 11:02)

OnEnter/OnExit это события возникающие когда указатель мыши входит/выходит на/с компонент.
Единственное простое решение дано в Baks   (29.04.12 15:23) [1]

Решение для задачи "Нужно получить событии при его отпускании" - OnMouseUp. Но тут нужно уточнить задачу. Ибо OnMouseUp возбуждается как при отпускании кнопки мыши нажатой на самом ползунке, так и при отпускании кнопки мыши нажатой на самом треке.


 
AntiUser   (2012-04-30 02:01) [5]


> Германн ©   (30.04.12 01:42) [4]
OnEnter/OnExit это события возникающие когда указатель мыши входит/выходит на/с компонент.

Не совсем так. OnEnter/OnExit это установка/потеря компонентом фокуса.
А "указатель мыши входит/выходит на/с компонент", это MouseEnter и MouseLeave


 
Германн ©   (2012-04-30 02:04) [6]


> AntiUser   (30.04.12 02:01) [5]

Согласен. Посыпаю пеплом остаток моей причёски. :(


 
Валера   (2012-04-30 10:46) [7]

Так как же быть?


 
AntiUser   (2012-04-30 10:59) [8]

Ну фиг знает, я на память не помню чего там в трекбаре, но сдается мне что ты хочешь чего-то странного. Ты бы лучше задачу описал. Не то как ты видишь ее решение (то что в [0]), а именно задачу.

Ну а если на тех условиях что в [0], то посмотри у трекбара событие mouseup если есть, то на нем работай, если нет, то возьми у парента и по x, y определи над трекбаром ли.

Либо хелпера напиши к трекбару, это, наверное, будет лучший вариант для условий из [0].

Но еще раз повторюсь, не то ты делаешь мил человек.


 
AntiUser   (2012-04-30 11:00) [9]

Да, и кстати, почему здесь, а не в начинающих?


 
Влад   (2012-04-30 11:02) [10]

type
 TForm1 = class(TForm)
   TrackBar1: TTrackBar;
   procedure FormCreate(Sender: TObject);
 private       { Private declarations }
   procedure MyOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 public        { Public declarations }
 end;

 TC = class(TControl);

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyOnMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
 Caption :=  IntToStr(TrackBar1.Position);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TC(TrackBar1).OnMouseUp := MyOnMouseUp;
end;


 
Влад   (2012-04-30 11:05) [11]


> Да, и кстати, почему здесь, а не в начинающих?

тут народу больше?
даже если перенесут - будет две точки входа :)


 
Baks   (2012-04-30 14:29) [12]


> но сдается мне что ты хочешь чего-то странного


Вот именно так. Изначально неправильный подход. Дело в том, что обрабатывать OnMouseUp и т.п. нет смысла, т.к. изменить положение бегунка можно при помощи клавиатуры например и OnMouseUp не сработает.


 
Валера   (2012-04-30 16:04) [13]


> Влад   (30.04.12 11:02) [10]
>  TC = class(TControl);


Как называется этот прием?


 
Валера   (2012-04-30 16:07) [14]


> Влад   (30.04.12 11:02) [10]
>  TC = class(TControl);


Как называется этот прием?


> AntiUser   (30.04.12 10:59) [8]


> Но еще раз повторюсь, не то ты делаешь мил человек.


Когда начинается OnChange меняется одно тяжелое значение.
Потом флагом проверяется, прошло ли оно или нет.
А при окончании OnChange, должно произойти еще одно изменение этого тяжелого значения.

Что тут не ясно?
(Тяжелое значение - вызов функции одной библиотеки, она относительно долго происходит)


> Дело в том, что обрабатывать OnMouseUp и т.п. нет смысла


Вот именно, как быть?


 
Омлет ©   (2012-04-30 17:51) [15]


> Вот именно, как быть?

"Тяжелое" действие вынести в отдельный поток. При изменении позиции ползунка, останавливать поток и возобновлять с новым значением. Возможно, будет полезным кэширование результатов для уже вычесленных значений. Еще, как вариант, срабатывание по таймеру - если в течении 500 мс значение ползунка не менялось, начинаем считать.


 
Омлет ©   (2012-04-30 17:57) [16]


> Как называется этот прием?

Protected Hack. Или доступ к защищенным полям класса.


 
Влад   (2012-04-30 22:22) [17]


> как быть?

ButtonStart

 GetAllOptions;
 RunCalc;


 
Валера   (2012-05-01 12:41) [18]


> Омлет ©   (30.04.12 17:51) [15]
> Возможно, будет полезным кэширование результатов для уже
> вычесленных значений.


Такого нет.

> Еще, как вариант, срабатывание по таймеру - если в течении 500 мс значение > ползунка не менялось, начинаем считать.

Костыль.

> "Тяжелое" действие вынести в отдельный поток.

И? Когда его запускать, а когда нет?


> Влад   (30.04.12 22:22) [17]
>
>
> > как быть?
>
> ButtonStart
>


Что это?


 
Baks   (2012-05-01 15:34) [19]


> Валера


http://www.youtube.com/watch?v=gga1BEHNYOk


 
Влад   (2012-05-01 21:03) [20]


> Валера   (01.05.12 12:41) [18]
> Что это?

сделать отдельную кнопку, по нажатию которой проверяются все настройки/состояния
а после начинается действо


 
AntiUser   (2012-05-02 02:59) [21]


> Валера   (01.05.12 12:41) [18]
> > Омлет ©   (30.04.12 17:51) [15]
> Возможно, будет полезным кэширование результатов для уже вычесленных значений.

> Такого нет.

Значит нужно сделать.


> Еще, как вариант, срабатывание по таймеру - если в течении 500 мс значение ползунка не менялось, начинаем считать.

> Костыль.

Не костыль, а нормальный вариант.


> "Тяжелое" действие вынести в отдельный поток.

> И? Когда его запускать, а когда нет?

Этот вариант самый лучший.
Запускать на OnChange, предварительно проверив не запущен ли поток, если да, то остановить и запустить снова.


 
Валера   (2012-05-02 17:09) [22]


> Запускать на OnChange, предварительно проверив не запущен
> ли поток, если да, то остановить и запустить снова.


А когда выключить? :)


> Значит нужно сделать.


Такого нету, там просто функция принимающая хендл.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.074 c
15-1334367657
Edgar_Wine
2012-04-14 05:40
2013.03.22
Есть ли разница в какие слоты ставить оперативку?


15-1354100495
O'ShinW
2012-11-28 15:01
2013.03.22
Запретить всем прятать таскбар


15-1332189002
Юрий
2012-03-20 00:30
2013.03.22
С днем рождения ! 20 марта 2012 вторник


15-1345798515
Beginer
2012-08-24 12:55
2013.03.22
Как отключить автовыравнивание значков на рабочем столе?


2-1347783911
alfa
2012-09-16 12:25
2013.03.22
Требуется разъяснение команды AS