![]() |
|
|
#1
|
||||
|
||||
|
Как управлять элементами листбокс с помощью кнопок расположенных на форме? Например передвинуть один или несколько выделенных элементов кнопками "вверх" или "вниз", переместить элементы сразу вверх или вниз списка или удалить из списка.
|
|
#2
|
|||
|
|||
|
Код:
ListBox1.ItemIndex:=ListBox1.ItemIndex+1; |
|
#3
|
||||
|
||||
|
Переместить выделенный в конец
Код:
if ListBox1.ItemIndex>0 then ListBox1.Items.Move(ListBox1.ItemIndex, ListBox1.Count-1); в начало Код:
if ListBox1.ItemIndex>0 then ListBox1.Items.Move(ListBox1.ItemIndex, 0); удалить Код:
if ListBox1.ItemIndex>0 then ListBox1.Items.Delete(ListBox1.ItemIndex); вверх Код:
if ListBox1.ItemIndex>0 then ListBox1.Items.Move(ListBox1.ItemIndex, ListBox1.ItemIndex-1); вниз Код:
if ListBox1.ItemIndex>0 then ListBox1.Items.Move(ListBox1.ItemIndex, ListBox1.ItemIndex+1); это если фокус сохранять нужно (сдвиг вниз) Код:
var i:Word; begin if ListBox1.ItemIndex>0 then begin i:=ListBox1.ItemIndex; ListBox1.Items.Move(i, i-1); ListBox1.Selected[i-1]:=true; end; end; |
|
#4
|
||||
|
||||
|
Цитата:
это сдвиг фокуса, но не Item-a ![]() |
|
#5
|
|||
|
|||
|
Цитата:
Вопрос не внимательно прочитал |
|
#6
|
||||
|
||||
|
Спасибо! Все работает.
Как быть, если надо передвинуть несколько строк сразу? |
|
#7
|
||||
|
||||
|
Еще вопросик. Как переименовать файл на диске, используя значение из элемента листбокса, в котором содержится полный адрес включая расширение.
Последний раз редактировалось timeless, 28.06.2008 в 03:39. |
|
#8
|
|||
|
|||
|
Вообще, переименовать файл можно командой Rename. Одно из имен у тебя уже готовое лежит в листбоксе. Второе надо сконструировать.
Код:
var
OldName, NewName : String;
begin
OldName := ListBox1.Items[ListBox1.ItemIndex]; // Get current name
If InputQuery('Rename','New name:',NewName) Then // Ask user for new name
Begin
NewName := ExtractFilePath(OldName) + // path
ChangeFileExt(NewName,ExtractFileExt(OldName)); // New file name and save orig. extention
If Rename(OldName,NewName)
Then ListBox1.Items[ListBox1.ItemIndex] := NewName // Update current name
Else ShowMessage('Error renaming file.');
End;
end;Сорри, коменты по английски. Идея такая. В листбоксе лежит полное имя файла (с путем). Переименовываем выбранный файл. Спрашиваем новое имя у пользователя. Если получилось переименовать, то обновляем инфу в листбоксе, иначе - сообщение об ошибке. |
|
#9
|
||||
|
||||
|
что значит несколько строк? несколько выделенных? начиная с какой-то позиции или что?
|
|
#10
|
||||
|
||||
|
lmikle,
Спасибо, сделал по вашему примеру. Ferra, Угу, нескольких выделенных. Пользователь выделяет несколько строк, и, при нажатии кнопки "вверх", они все перемещаются вверх на одну позицию. Аналогично с кнопками "в начало" и "удалить" и т.д. Подозреваю будут проблемы, если строки выделены через одну. Алгоритм в голове есть, но он слишком громоздкий, и я не знаю как обработать множественное выделение. |
|
#11
|
|||
|
|||
|
Если передвижка идет на 1 позицию, то особых проблем нет.
Если двигаем вверх, то циклом от 0 до Count-1 двигаем поочереди все строки на единичку вверх (используя метод Exchange и контролируя, что строка и так не является первой). Если двигаем вниз, то циклом от Count-1 до 0 двигаем поочереди все строки на единичку вниз (используя метод Exchange и контролируя, что строка и так не является последней). Пример нужен или сам справишся? |
|
#12
|
||||
|
||||
|
Пожалуй, нужен пример.
|
|
#13
|
|||
|
|||
|
О, господи!!!
Код:
procedure MoveItemsUp(AListBox : TListBox);
var
I : Integer;
begin
If AListBox.Items.Count > 1 Then
For I := 1 To AListBox.Items.Count-1 Do
If Not AListBox.Selected[I-1] Then
AListBox.Exchange(I,I-1);
end;Вниз аналогично, только цикл в обратном напрмвлении и проверяешь I+1. Вроде должно работать. |
|
#14
|
||||
|
||||
|
Цитата:
Последний раз редактировалось timeless, 01.07.2008 в 13:39. |
|
#15
|
||||
|
||||
|
И еще вопрос, если я не совсем надоел
. Как получить адрес папки при перетаскивании её из проводника в листбокс? |