Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1178531293
Doom-2
2007-05-07 13:48
2007.05.27
Проект вызвал исключение EStringListError


2-1178606219
Ken9
2007-05-08 10:36
2007.05.27
Чтение самого себя


8-1158295080
SlayerX
2006-09-15 08:38
2007.05.27
Как развернуть окно на весь экран?


2-1178872367
vitv
2007-05-11 12:32
2007.05.27
FormKeyDown-проблема.


2-1178777782
Шакал
2007-05-10 10:16
2007.05.27
Проблемы работы написанных программ в win98-2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский