Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c