![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перемещение элементов в ListBox [D7, WinXP]
kodov © (2007-03-30 18:38:00)Здравствуйте!
Такой вопрос. Есть код для перемещения элементов в ListBox. Я хочу перемещать элементы клавишами вверз и вниз, а также кнопками speedbutton1 и speedbutton2 (вверх и вниз соответственно). Также мне нужно, чтобы когда элемент доходит ко конца, то выдавалось сообщение, типа, Хотите переместить на первую или на последнюю строку.
Но мой код немного глюкавит. Помогите, пожалуйста разобраться.
Вот сам код:
private
procedure DoMoveListItem(AKind: Boolean);
-------------------------------------------------
procedure TMainForm.DoMoveListItem(AKind: Boolean);
var
lIndex, NewIndex: Integer;
begin
lIndex := personslist.ItemIndex;
try
if (lIndex >= 0) and (lIndex < personslist.Count) then
begin
case AKind of
True: begin
NewIndex := lIndex + 1;
personslist.Items.Exchange(lIndex,NewIndex);
end;
False: begin
NewIndex := lIndex - 1;
personslist.Items.Exchange(lIndex,NewIndex);
end;
end;
personslist.ItemIndex:= lIndex;
end;
except
end;
end;
procedure TMainForm.personslistKeyUp(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
if key = vk_up then DoMoveListItem(True);
if key = vk_down then DoMoveListItem(False);
end;
procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
personslist.ItemIndex := personslist.ItemIndex -1;
DoMoveListItem(True);
end;
procedure TMainForm.SpeedButton2Click(Sender: TObject);
begin
personslist.ItemIndex := personslist.ItemIndex + 1;
DoMoveListItem(false);
end;
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
if key = vk_up then DoMoveListItem(True);
if key = vk_down then DoMoveListItem(False);
end;
{RASkov} (2007-04-01 21:53:00) [1]Не зачто :) Ответ был еще [3] RASkov (26.03.07 22:10) в твоей другой ветке :)
Кому-то понравился мой ник :) теперь я не RASkov :(
kodov (2007-04-01 17:03:00) [2]Приношу свои извинения. Это я накосячил. Я просто тупо впихнул код процедуры DoMoveListItem в ListBox1KeyDown не подумав.)
Ваш код прекрасно работает. Огромное спасибо.
RASkov (2007-04-01 00:24:00) [3]> Ну не может быть ошибки здесь...
> Есть косяк в приведенном мной здесь коде процедуры DoMoveListItem
> - нет проверки на существование Lst.
Т.е. даже если ты и вызывал(в чем я сомневаюсь) так: DoMoveListItem( nil, False); - то AV вылетит раньше, но не на той строке, которую ты показал...
> if Lst.ItemIndex < 0 then Exit; - AV
Ну немогу я тебе объяснить почему у тебя ошибка :) Пользуй тот код, который тебе дали на сайте по ссылке, из [4]....
RASkov (2007-04-01 00:16:00) [4]> [9] kodov (31.03.07 20:27)
Ну не может быть ошибки здесь... Проверь лучше все внимательно.
FMoveUp- это параметр процедуры - она не может быть неизвестной процедуре.
Есть косяк в приведенном мной здесь коде процедурыDoMoveListItem- нет проверки на существование Lst. Т.е. процедуру можно вызвать так:
DoMoveListItem(nil, False);- и здесь будет AV.
Можно исправить в первой строчке:
if not Assigned(Lst) or (Lst.ItemIndex < 0) then Exit;- или что-нибудь в этом роде.
В остальном все должно работать. Еще раз проверь на отдельном новом проекте, возможно у тебя уже все попуталось с этим листбоксом....
Вызов процедуры происходит с параметрами: первый - листбокс, в котором нужно перемещать сироки и второй - Булевый - True если нужно переместить строку вверх и False - вниз. Пример:DoMoveListItem(ListBox1, True);- Перемещает строку на одну позицию вверх.
И усе... Сорри за [10].
RASkov (2007-03-31 21:55:00) [5]> [9] kodov (31.03.07 20:27)
А ты в языке на котором программы "пишешь" - разбираешься?
У меня вот ничего не говорит, и даже работает так - как тебе надо.
Ну извини... мое дело предложить, твое отказаться.
kodov (2007-03-31 20:27:00) [6]Говорит, что ошибка вот на этой строке:
if FMoveUp then N:=Lst.ItemIndex-1 else N:=Lst.ItemIndex+1;
RASkov (2007-03-31 13:09:00) [7]> [7] kodov (31.03.07 11:31)
Кому неизвестное? это параметр процедуры :) Чета ты темнишь, ну да ладно, тебе на другом форуме ответили, будь доволен :)
kodov (2007-03-31 11:31:00) [8]Значит выдаёт ошибку, говорит, что это неизвестное.
RASkov (2007-03-30 20:15:00) [9]> [3] kodov (30.03.07 19:53)
> Ругается на FMoveUp
Что значит ругается? кто?
kodov (2007-03-30 20:14:00) [10]Этот я только что попробовал, работает.
Кросспостинг! (2007-03-30 19:59:00) [11]Кросспостинг.
http://www.sql.ru/forum/actualthread.aspx?tid=413143
kodov (2007-03-30 19:53:00) [12]Ругается на FMoveUp
RASkov (2007-03-30 19:23:00) [13]
procedure DoMoveListItem(Lst: TListBox; const FMoveUp: Boolean);
const Str: array [Boolean] of String = ('Переместить в конец?', 'Переместить в начало?');
var N: Integer; F: Boolean;
begin
if Lst.ItemIndex < 0 then Exit;
if FMoveUp then N:=Lst.ItemIndex-1 else N:=Lst.ItemIndex+1;
if N = Lst.Count then begin N:=0; F:=True; end
else if N < 0 then begin N:=Lst.Count-1; F:=True; end else F:=False;
if F and (MessageDlg(PChar(Str[N=0]), mtConfirmation, [mbYes, mbNo], 0) <> mrYes) then Exit;
Lst.Items.Move(Lst.ItemIndex, N);
Lst.ItemIndex:=N;
end;
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if not (ssCtrl in Shift) then Exit;
if Key=VK_UP then DoMoveListItem(ListBox1, True);
if Key=VK_DOWN then DoMoveListItem(ListBox1, False);
Key:=0;
end;
RASkov (2007-03-30 19:02:00) [14]Эх и замучил тебя этот листбокс...
http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1174909546