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

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

Перемещение элементов в 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


Наверх

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