Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.06.2008, 22:48
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию Работа с ListBox

Как управлять элементами листбокс с помощью кнопок расположенных на форме? Например передвинуть один или несколько выделенных элементов кнопками "вверх" или "вниз", переместить элементы сразу вверх или вниз списка или удалить из списка.
Ответить с цитированием
  #2  
Старый 27.06.2008, 23:29
Ozerich Ozerich вне форума
Новичок
 
Регистрация: 11.04.2008
Адрес: В городе-герой Минск
Сообщения: 69
Репутация: 10
По умолчанию

Код:
ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
Ответить с цитированием
  #3  
Старый 27.06.2008, 23:32
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Смущение

Переместить выделенный в конец
Код:
 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;
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #4  
Старый 27.06.2008, 23:34
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Восклицание

Цитата:
Сообщение от Ozerich
Код:
ListBox1.ItemIndex:=ListBox1.ItemIndex+1;


это сдвиг фокуса, но не Item-a
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #5  
Старый 28.06.2008, 00:11
Ozerich Ozerich вне форума
Новичок
 
Регистрация: 11.04.2008
Адрес: В городе-герой Минск
Сообщения: 69
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ferra
это сдвиг фокуса, но не Item-a
Извиняюсь!
Вопрос не внимательно прочитал
Ответить с цитированием
  #6  
Старый 28.06.2008, 00:31
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Спасибо! Все работает.
Как быть, если надо передвинуть несколько строк сразу?
Ответить с цитированием
  #7  
Старый 28.06.2008, 03:06
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Еще вопросик. Как переименовать файл на диске, используя значение из элемента листбокса, в котором содержится полный адрес включая расширение.

Последний раз редактировалось timeless, 28.06.2008 в 03:39.
Ответить с цитированием
  #8  
Старый 28.06.2008, 08:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, переименовать файл можно командой 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  
Старый 28.06.2008, 14:08
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Вопрос

что значит несколько строк? несколько выделенных? начиная с какой-то позиции или что?
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #10  
Старый 29.06.2008, 05:25
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

lmikle,
Спасибо, сделал по вашему примеру.

Ferra,
Угу, нескольких выделенных. Пользователь выделяет несколько строк, и, при нажатии кнопки "вверх", они все перемещаются вверх на одну позицию. Аналогично с кнопками "в начало" и "удалить" и т.д. Подозреваю будут проблемы, если строки выделены через одну. Алгоритм в голове есть, но он слишком громоздкий, и я не знаю как обработать множественное выделение.
Ответить с цитированием
  #11  
Старый 29.06.2008, 08:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если передвижка идет на 1 позицию, то особых проблем нет.

Если двигаем вверх, то циклом от 0 до Count-1 двигаем поочереди все строки на единичку вверх (используя метод Exchange и контролируя, что строка и так не является первой).

Если двигаем вниз, то циклом от Count-1 до 0 двигаем поочереди все строки на единичку вниз (используя метод Exchange и контролируя, что строка и так не является последней).

Пример нужен или сам справишся?
Ответить с цитированием
  #12  
Старый 30.06.2008, 01:27
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Пожалуй, нужен пример.
Ответить с цитированием
  #13  
Старый 30.06.2008, 07:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

О, господи!!!

Код:
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  
Старый 01.07.2008, 13:23
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Цитата:
Сообщение от lmikle
Вроде должно работать.
Работает не так, как надо. Просто ставит первый элемент последним, не зависимо от того какие строки выделены. Я хочу получить эффект как в программе "Universal share downloader" при выборе команды "передвинуть выше".

Последний раз редактировалось timeless, 01.07.2008 в 13:39.
Ответить с цитированием
  #15  
Старый 01.07.2008, 13:26
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

И еще вопрос, если я не совсем надоел . Как получить адрес папки при перетаскивании её из проводника в листбокс?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:40.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025