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

Вниз

Проблема с PopupMenu в ListBox   Найти похожие ветки 

 
AlexanderMS ©   (2006-05-09 19:04) [0]

Помогите, пожалуйста! При нажатии правой кнопкой мыши на невыделенный пункт ListBox (зд. List) этот пункт становится выделенным, и выскакивает PopupMenu. Если User щёлкнул по пустому месту, где нет пунктов, то делается недоступным пункт меню PMDeleteLine.
Всё реализовано, вот код:

procedure TWindow.ListMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var n : integer;
begin
 if not (ssright in shift) then exit;
 n := List.itematpos(point(x, y), true); {видимо здесь задержка}
 if n = -1
   then
     PMDeleteLine.Enabled := false
   else
     begin
       PMDeleteLine.Enabled := true;
       if List.Selected[n] = false
         then
           begin
             List.ClearSelection;
             List.Selected[n] := true;
             List.ItemIndex := n;
             ListClick(Window)
           end
     end

end;


У меня проблема с быстродействием на этом участке кода.
Вопрос: как улучшить код для большего быстродействия?


 
KilkennyCat ©   (2006-05-09 19:09) [1]

Смотрим реализацию ItemAtPos

function TCustomListBox.ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
var
 Count: Integer;
 ItemRect: TRect;
begin
 if PtInRect(ClientRect, Pos) then
 begin
   Result := TopIndex;
   Count := Items.Count;
   while Result < Count do
   begin
     Perform(LB_GETITEMRECT, Result, Longint(@ItemRect));
     if PtInRect(ItemRect, Pos) then Exit;
     Inc(Result);
   end;

   if not Existing then Exit;
 end;
 Result := -1;
end;


 
AlexanderMS ©   (2006-05-09 19:16) [2]


> Смотрим реализацию ItemAtPos

и видим перебор.
У меня сначала всё нормально, но как нажму на предпоследнюю строчку...
Если затем вернусь на первую, то откуда-то берётся задержка...


 
KilkennyCat ©   (2006-05-09 19:19) [3]

Какая машина? на 6000 итемах у меня задержки не возникло. АМД 64 3000+ 1 гиг


 
AlexanderMS ©   (2006-05-09 19:23) [4]

Что интересно, машина не слабая: 2400 MHz, 512 RAM...
У меня итемов 7 тысяч.


 
AlexanderMS ©   (2006-05-09 19:24) [5]


> Что интересно, машина не слабая: 2400 MHz, 512 RAM...

По крайней мере, 2 года назад была не слабая...


 
KilkennyCat ©   (2006-05-09 19:25) [6]

нормально.
проблема не в машине.

ListClick(Window) - это что?


 
KilkennyCat ©   (2006-05-09 19:28) [7]

    begin
      PMDeleteLine.Enabled := true;
      if List.Selected[n] = false
        then
          begin
            List.ClearSelection;
            List.Selected[n] := true;
            List.ItemIndex := n;
            ListClick(Window)
          end
    end


можно сократить до:

    begin
      PMDeleteLine.Enabled := true;
      List.ItemIndex := n;
      ListClick(Window)
    end


 
AlexanderMS ©   (2006-05-09 19:38) [8]


> ListClick(Window) - это что?

Попутный вопрос : что нужно указывать в качестве Sender?
Я указал Window (главную форму), всё работает.
Насчёт кода, его трудно понять, но я погляжу, может, что исправить.


> KilkennyCat ©   (09.05.06 19:28) [7]

Благодарю.


 
AlexanderMS ©   (2006-05-09 19:40) [9]

Кстати, без ListClick(Window) ничего не меняется (я о быстродействии).


 
AlexanderMS ©   (2006-05-09 19:51) [10]


> проблема не в машине

и не в ListClick"е.

KilkennyCat ©   (09.05.06 19:28) [7]
Ваш вариант не прокатывает, ибо MultiSelect := true.


 
AlexanderMS ©   (2006-05-09 19:52) [11]


> проблема не в машине

и не в ListClick"е.

KilkennyCat ©   (09.05.06 19:28) [7]
Ваш вариант не прокатывает, ибо MultiSelect = true.


 
KilkennyCat ©   (2006-05-09 19:54) [12]


> ибо MultiSelect = true.


тогда да, некатит.


 
AlexanderMS ©   (2006-05-09 19:56) [13]

Я насчёт Sender. Что нужно указать в качестве параметра?


 
KilkennyCat ©   (2006-05-09 20:00) [14]


> Что нужно указать в качестве параметра?


то, что требуется обработчику.
в данном случае я бы оставил Sender.
Меня не это интересовало, а что крутится в обработчике клика. Ибо здесь задержки нет.



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

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

Наверх




Память: 0.5 MB
Время: 0.045 c
1-1145276080
Nic
2006-04-17 16:14
2006.05.28
Распознавание текстов


3-1144409466
Оливка
2006-04-07 15:31
2006.05.28
Клиент+Сервер приложений+БД


1-1145334556
Layner
2006-04-18 08:29
2006.05.28
TChart > Axis > Scales > Automatic, но как показать график чуть


9-1130842218
zx
2005-11-01 13:50
2006.05.28
Microsoft посадит OpenGL под замок?


1-1145272681
petun
2006-04-17 15:18
2006.05.28
сохранение данных формы в doc формате