Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация


Leha1987 ©   (2008-02-20 22:28:00) 

Господа мастера, как можно оптимизировать нижеописанный код:

function ReceivePoint: TPoint;
begin
  if X < 0 then
  begin
    Result := Point(-1, 0);
    SetTimer(
    Handle, FKeyId_TranslocateIn,
      const_def_DELAYTRANSLOCATEIN, FlpTimerFunc);
  end
  else
  if Y < 0 then
  begin
    Result := Point(0, -1);
    SetTimer(Handle, FKeyId_TranslocateIn,
      const_def_DELAYTRANSLOCATEIN, FlpTimerFunc);
  end
  else
  if (X > FDownCtrl.Width -
      TCustomRangeBar(FDownCtrl.ScrollBars.Slave).Width) then
  begin
    Result := Point(1,  0);
    SetTimer(
    Handle, FKeyId_TranslocateIn,
      const_def_DELAYTRANSLOCATEIN, FlpTimerFunc);
  end
  else
  if (Y > FDownCtrl.Height -
       TCustomRangeBar(FDownCtrl.ScrollBars.Master).Height) then
  begin
    Result := Point(0,  1);
    SetTimer(Handle, FKeyId_TranslocateIn,
      const_def_DELAYTRANSLOCATEIN, FlpTimerFunc);
  end
  else
  begin
    KillTimer(Handle, FKeyId_TranslocateIn);
  end;
end;


KilkennyCat   (2008-02-21 03:20:00) [1]

Удалено модератором


Германн   (2008-02-21 00:56:00) [2]

Удалено модератором


Leha1987   (2008-02-20 23:43:00) [3]


> Обалденный код. Ты в курсе, что тебе MemProof выдаст?
>


Никаких ошибок не выдает все работает как и надо.
Но не оптимизировано.


homm   (2008-02-20 23:35:00) [4]

> [0] Leha1987   (20.02.08 22:28)

Обалденный код. Ты в курсе, что тебе MemProof выдаст?


KilkennyCat   (2008-02-20 23:32:00) [5]

> [12] Johnmen ©   (20.02.08 23:30)

ага, я так и понял. согласен.


Johnmen   (2008-02-20 23:30:00) [6]


> KilkennyCat ©   (20.02.08 23:23) [11]

Вот, на пальцах:
Есть вариант чистого условия X < 0 (первое). Почему же нет чистого условия Y < 0???
Почему оси координат неравноправны?


KilkennyCat   (2008-02-20 23:23:00) [7]

> Johnmen ©   (20.02.08 23:19)

гм... наверное.
Я что-то не допонял.
Имеешь ввиду, что могут сроаботать два условитя, а отработает только первое?


KilkennyCat   (2008-02-20 23:19:00) [8]

> [8] Игорь Шевченко ©   (20.02.08 23:17)

 знаю. лень было :)


Johnmen   (2008-02-20 23:19:00) [9]


> KilkennyCat ©   (20.02.08 23:16) [7]

Потому, что координаты X и Y должны быть "симметричны".
А это не так...


Игорь Шевченко   (2008-02-20 23:17:00) [10]


>  if X < 0 then zx := -1 else
>  if Y < 0 then zy := -1 else
>  if (X > FDownCtrl.Width - TCustomRangeBar(FDownCtrl.ScrollBars.
> Slave).Width) then zx := 1 else
>  if (Y > FDownCtrl.Height - TCustomRangeBar(FDownCtrl.ScrollBars.
> Master).Height) then zy := 1 else begin
>    KillTimer(Handle, FKeyId_TranslocateIn);
>    exit;
>  end;


Читать просто невозможно. Вот если бы esle был под if-ом, тогда читать несколько проще


KilkennyCat   (2008-02-20 23:16:00) [11]

> [5] Johnmen ©   (20.02.08 23:14)
> Тогда однозначно, что логика кривая.


ну почему же... может, нужна задержка?


KilkennyCat   (2008-02-20 23:15:00) [12]

Да, кстати, при попадании в последнее условие функция фигню вернет....


Johnmen   (2008-02-20 23:14:00) [13]

Тогда однозначно, что логика кривая.


KilkennyCat   (2008-02-20 23:13:00) [14]

function ReceivePoint: TPoint;
var
 zx, zy : integer;
begin
 zx := 0;
 zy := 0;
 if X < 0 then zx := -1 else
 if Y < 0 then zy := -1 else
 if (X > FDownCtrl.Width - TCustomRangeBar(FDownCtrl.ScrollBars.Slave).Width) then zx := 1 else
 if (Y > FDownCtrl.Height - TCustomRangeBar(FDownCtrl.ScrollBars.Master).Height) then zy := 1 else begin
   KillTimer(Handle, FKeyId_TranslocateIn);
   exit;
 end;
 Result := Point(zx, zy);
 SetTimer(Handle, FKeyId_TranslocateIn, const_def_DELAYTRANSLOCATEIN, FlpTimerFunc);
end;


не скажу, что оптимизация, но читать проще. можно и еще проще...


Leha1987   (2008-02-20 23:06:00) [15]

функция  вызывается на событии OnMouseMove и определяет параметры приращения шага по осям x, y Result(x,y). Короче, отслеживается выход курсора мыши за пределы контрола (ImgView32) в 4 возможных случаях ( Left, Top, Right, Bottom). Таймер определяет через какой промежуток времени скролбар будет менять позицию.  В случае если курсор мыши выходит, скролим изображение на приращиваемый шаг.


Johnmen   (2008-02-20 22:52:00) [16]

Есть сильное предположение, что логика получения Result неверна. Нет "симметрии".


Loginov Dmitry   (2008-02-20 22:50:00) [17]

Поскольку не знаю, накой здесь нужно этот таймер, то предложу избавиться прежде всего от него.


Наверх

Титульная страница Поиск, карта сайта Написать письмо