Форум: "Основная";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
ВнизПеремещение элементов в ListBox Найти похожие ветки
← →
kodov (2007-03-30 18:38) [0]Здравствуйте!
Такой вопрос. Есть код для перемещения элементов в 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-03-30 19:02) [1]Эх и замучил тебя этот листбокс...
http://delphimaster.net/view/1-1174909546/
← →
RASkov (2007-03-30 19:23) [2]
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;
← →
kodov (2007-03-30 19:53) [3]Ругается на FMoveUp
← →
Кросспостинг! (2007-03-30 19:59) [4]Кросспостинг.
http://www.sql.ru/forum/actualthread.aspx?tid=413143
← →
kodov (2007-03-30 20:14) [5]Этот я только что попробовал, работает.
← →
RASkov (2007-03-30 20:15) [6]> [3] kodov (30.03.07 19:53)
> Ругается на FMoveUp
Что значит ругается? кто?
← →
kodov (2007-03-31 11:31) [7]Значит выдаёт ошибку, говорит, что это неизвестное.
← →
RASkov (2007-03-31 13:09) [8]> [7] kodov (31.03.07 11:31)
Кому неизвестное? это параметр процедуры :) Чета ты темнишь, ну да ладно, тебе на другом форуме ответили, будь доволен :)
← →
kodov (2007-03-31 20:27) [9]Говорит, что ошибка вот на этой строке:
if FMoveUp then N:=Lst.ItemIndex-1 else N:=Lst.ItemIndex+1;
← →
RASkov (2007-03-31 21:55) [10]> [9] kodov (31.03.07 20:27)
А ты в языке на котором программы "пишешь" - разбираешься?
У меня вот ничего не говорит, и даже работает так - как тебе надо.
Ну извини... мое дело предложить, твое отказаться.
← →
RASkov (2007-04-01 00:16) [11]> [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-04-01 00:24) [12]> Ну не может быть ошибки здесь...
> Есть косяк в приведенном мной здесь коде процедуры DoMoveListItem
> - нет проверки на существование Lst.
Т.е. даже если ты и вызывал(в чем я сомневаюсь) так: DoMoveListItem(nil, False); - то AV вылетит раньше, но не на той строке, которую ты показал...
> if Lst.ItemIndex < 0 then Exit; - AV
Ну немогу я тебе объяснить почему у тебя ошибка :) Пользуй тот код, который тебе дали на сайте по ссылке, из [4]....
← →
kodov (2007-04-01 17:03) [13]Приношу свои извинения. Это я накосячил. Я просто тупо впихнул код процедуры DoMoveListItem в ListBox1KeyDown не подумав.)
Ваш код прекрасно работает. Огромное спасибо.
← →
{RASkov} (2007-04-01 21:53) [14]Не зачто :) Ответ был еще [3] RASkov (26.03.07 22:10) в твоей другой ветке :)
Кому-то понравился мой ник :) теперь я не RASkov :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c