Перейти к содержанию
  • 0
neo

стандартная работа с ListBox (delete,rename,move)

Вопросы

Здравствуйте товарищи знатоки!

 

Недавно решил перейти на Firemonkey чтоб создавать мобильные приложения...

но к сожалению обнаружил что работа в нём сильно отличается =( и информации в интернете очень мало...

и в дельфи демках тоже подобных примеров нету =(

 

не понимаю как можно узнать информацию если ты не работаешь в большом коллективе программистов у которых есть связь с западными колегами

которые участвовали в создании тех или иных компонентов...

 

сейчас я разбираюсь с ListBox

и хочу научится делать стандартные вещи....

 

например сначала я попытался создать 2 колонки как в VCL но оказалось так уже нельзя

пол дня шерстил интернет и методом тыка научился делать это через Detail ... ok! =)

 

Add:

добавлять пункты научился так

  LItem:=TListBoxItem.Create(ListBox1)

  ...

  ListBox1.AddObject(LItem);

 

Delete:

поскольку DeleteSelected больше нет

удаляю пункт сл образом

  ListBox1.Items.Delete(listbox1.Selected.index)

но как проверить существует ли item?

иначе возникает ошибка когда удаляешь и ничего не выделено

 

Rename:

переименовать item не получается =(

 

разве что вставить пункт на место выделенного listbox1.InsertObject(... ,...);

а сл удалить

 

Move:

поменять позицию у выделенного пункта тоже не получается

 

Подскажите пожалуйста ответы на эти казалось бы простые вопросы!

думаю это поможет очень многим начинающим ФаерМанкерам =)

Отредактировал neo

Поделиться сообщением


Ссылка на сообщение

Рекомендуемые сообщения

  • 0

во первых колонки есть! смотреть внимаельно в опциях TListBox

Columns = 1, поменяй на 2

 

для Add есть еще один способ, просто указать парент

  LItem:=TListBoxItem.Create(nil);
  LItem.Parent := ListBox1;
  ...

для Delete

if Assigned(ListBox1.Selected) then
  ListBox1.Items.Delete(listbox1.Selected.index);

зачем нужно делать переименование??

 

а перемещение где-то было в стандартных демо если не ошибаюсь

Отредактировал ZuBy

Поделиться сообщением


Ссылка на сообщение
  • 0

во первых колонки есть! смотреть внимаельно в опциях TListBox

Columns = 1, поменяй на 2

 

для Add есть еще один способ, просто указать парент

  LItem:=TListBoxItem.Create(nil);
  LItem.Parent := ListBox1;
  ...

для Delete

if Assigned(ListBox1.Selected) then
  ListBox1.Items.Delete(listbox1.Selected.index);

зачем нужно делать переименование??

 

а перемещение где-то было в стандартных демо если не ошибаюсь

 

это не те колонки) проверьте ... просто идёт размещение в две колоны.. а пункты раздельные... и выделение идёт раздельное...субитомов больше нету

 

а наличие я вот так проверяю: if not (Listbox1.Selected=nil) then

 

в ListView переименование легко делается... вот и хотел узнать как в ListBox

 

у меня XE7 в ней точно примеров нет как перемещать пункты...

и самое главное в ListView тоже не получается пункты сдвинуть

 

просто например мне в настройках нужно по желанию менять очередность пунктов

 

спасибо что ответили надеюсь подобные темы для начинающих будут развиваться

Поделиться сообщением


Ссылка на сообщение
  • 0

1. Все контролы в ФМ являются контейнерами.

2. Итемы внутр листбокса являются контролами, а значит и контейнерами, следовательно вы можете делать там внутри что угодно хоть колонки, хоть кружочки, хоть что...

3. поменять местами итемы можно так:

ListBox1.ItemsExchange( ListBox1.ItemByIndex(0), ListBox1.ItemByIndex(1)  );

4. Чтобы в Листбокс итеме поменять текст, нужно поменять его паблишед свойство Text, делается это так:

ListBox1.ItemByIndex(1).Text := '123';

Поделиться сообщением


Ссылка на сообщение
  • 0

 

1. Все контролы в ФМ являются контейнерами.

2. Итемы внутр листбокса являются контролами, а значит и контейнерами, следовательно вы можете делать там внутри что угодно хоть колонки, хоть кружочки, хоть что...

3. поменять местами итемы можно так:

ListBox1.ItemsExchange( ListBox1.ItemByIndex(0), ListBox1.ItemByIndex(1)  );

4. Чтобы в Листбокс итеме поменять текст, нужно поменять его паблишед свойство Text, делается это так:

ListBox1.ItemByIndex(1).Text := '123';

ага отлично) самое главное что точно также пытался менять через ItemsExchange но ошибку выдавал.. наверно где-то была тупая опечатка

 

а у ListView как? не знаете? там нету ItemsExchange

 

мне на ум только такая ерунда приходит:

    Litem:=ListView1.Items.Insert(ListView1.Selected.Index-1);

    LItem.Text:=listview1.Items.Item[ListView1.Selected.Index].Text;

    LItem.Detail:=listview1.Items.Item[ListView1.Selected.Index].Detail;

    Listview1.Items.Delete(ListView1.Selected.Index);

 

это чтоб пункт вверх сдвинуть ну и соответственно вниз то плюс

Поделиться сообщением


Ссылка на сообщение
  • 0

Итак вот что получилось

 

//сдвинуть выделенный пункт вверх

procedure TForm1.Up1Click(Sender: TObject);
begin
  if Assigned(ListBox1.Selected) and (listbox1.Selected.index>=1) then
  ListBox1.ItemsExchange( ListBox1.ItemByIndex(listbox1.Selected.index), ListBox1.ItemByIndex(listbox1.Selected.index-1)  );
end;

 

//сдвинуть выделенный пункт вниз
procedure TForm1.Down2Click(Sender: TObject);
var
  NextItem: Integer;
begin
  if Assigned(ListBox1.Selected) and (listbox1.Selected.index<ListBox1.Items.Count-1) then
  begin
  NextItem:=Listbox1.Selected.Index+1;
  ListBox1.ItemsExchange( ListBox1.ItemByIndex(listbox1.Selected.index), ListBox1.ItemByIndex(listbox1.Selected.index+1)  );
  Listbox1.ClearSelection; //к сож. нужно добавить ClearSelection и NextItem иначе идёт мультиселект
  listbox1.ItemIndex:=NextItem;
  end;

end;

Отредактировал neo

Поделиться сообщением


Ссылка на сообщение
  • 0

Возможно будет полезно, вот тут немного про ListBox и его особенности (глюки) описывал. Кое что решил:

 

http://fire-monkey.ru/topic/949-posle-aktivatcii-tsearchbox-ne-vozvraschaetsia-indeks-novog/

Отредактировал Belov.V.

Поделиться сообщением


Ссылка на сообщение
  • 0

А как реализовать у ListBox и у ListBoxItem длинный (продолжительный) Tap?

Т.е. нужно вызвать контекстное меню для выбранного (выделенного) ListBoxItem`а. Для Windows продолжительный Tap - это просто щелчок правой кнопкой мышки, а для Android - это продолжительный тап.

Например, чтобы удалить или расшарить то ,что лежит на ListBoxItem.

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Delpher-X
      Есть код для копирования файлов:
      procedure TForm1.Timer2Timer(Sender: TObject); var FileIndex, FileName : String; I : Integer; begin randomize; FileIndex := IntToStr(random(5000)); for I := 0 to ListBox1.Items.Count-1 do begin FileIndex := IntToStr(StrToInt(FileIndex) + 1); FileName := FileIndex + Exp; TFile.Copy(ListBox1.Items[I], FileName); end; Timer2.Enabled := False; end; Когда я его запускаю, все работает, однако постоянно выскакивает сообщение об ошибке: specified file already exists, то есть копируемый файл уже существует. То есть, программа пытается каждый файл скопировать дважды. Вопрос: почему? С чем это связано и как от этого избавиться? 
    • От Леонид Кудацкий
      Процедура  Process заполняет Listbox:
      procedure TForm1.Process;
      Const
         N=100;
      var
        I,Index:Integer;
        Item:TListBoxItem;
      begin
      for I := 1 to N do
          begin
          Item:=TListBoxItem.Create(ListBox1);
          Item.Text:=IntToStr(I);
          ListBox1.AddObject(Item);
          end;
      ListBox1.ScrollToItem(Item);
      end;
      Нужно, чтобы после заполнения Listbox скролировал в конец.
      Если процедура запускается нажатием кнопки, то всё нормально.
      А если из события формы FormCreate, то Listbox заполняется,
      а скролирование не происходит.
      Где тут собака порылась ?
    • От Sergiy_83
      Всем привет.
      Иногда, особенно когда есть прокрутка списка можно случайно выделить несколько элементов ListBox-а. Ощущение, что чем больше загрузка приложения, тем чаще проявляет себя эта проблема. Бывает редко но жутко раздражает. Работоспособность программы не нарушается.
      Что делать? Может "костыли" какие возможно придумать? 
      Android.
    • От YurMak
      Здравствуйте, уважаемые!
      Пробую писать некое подобие файлового менеджера.
      Для вывода папок и файлов использую  ListBox .
      Так вот: при обработке события ListBoxItemClick (нажатие  на строку) происходит переход по пути, казанному с этой строке, содержимое этой папки отображается, но строки в ней не нажимаютмя, не реагируют на событие нажатия.
      Если проще - строки на первой станице ListBox реагируют на нажатие, а на второй - нет.
      Что я делаю не так?
      {Клик по Item'у, вперёд} procedure TForm1.FoldersListBoxItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); var ExtFile: string; begin // Сохраняем выбранный путь CurrentPath := CurrentPath+Item.ItemData.Text; //Текущая директория if Item.TagString = 'folder' then //Проверяем, если это папка begin if TDirectory.Exists(CurrentPath) then //Проверяем, если папка существует begin Label1.Text:= 'Нажата строка № '+ inttostr(Item.Index); //Контроль!!! FillFolderListBox(CurrentPath, True); //Процедура заполнения ListBox`а папками и файлами end else if Item.TagString = 'file' then //Иначе - файл begin Label1.Text:='Отправляем файл "'+Item.ItemData.Text+'" на плеер'; //Готовим на исподнение end; end; end; Вот этот код срабатывает один (первый) раз.
       
      Прошу помощи, советов, вариантов.
    • От Sashar333
      Здравствуйте!
      Есть ListBox1, на нем разное кол-во tlistboxitem'ов, на каждом tlistboxitem'е есть один tgridpanellayout состоящий из четырех колонок и одной строчи, в каждой колонке
      по одному trectangle, в каждом trectangle по одному ttext с именами по очереди типа 'w'+IntToStr(Item.index), 'l'+IntToStr(Item.index), 'k'+IntToStr(Item.index)
      такие имена для Ttext требуются для дальнейшей обработки и распознования, в каждом Ttext надпись, на примере "-","2","2","Х" :

      при нажатии на текст "Х" удаляется tlistboxitem c помощью listbox1.Items.Delete(indexclick)
      Проблема следующая, при создании нового итема пишет дубликат имени Ttext, я так понял что итем удалился а то что на нем -нет
      как можно быстро удалить и итем и то что на нем находилось? Пример создания итема:
      procedure addrazmer(zap:typezap); var item:tlistboxitem; pg:tgridpanellayout; t1,t2,t3,t4:ttext; al:talignlayout; r1,r2,r3,r4:trectangle; i:integer; begin form1.listbox1.BeginUpdate; while Form1.listbox1.Count<>1 do Form1.listbox1.Items.Delete(0); for i := 0 to length(zap.razmer)-1 do begin item:=tlistboxitem.Create(form1.listbox1); item.Height:=30; pg:=tgridpanellayout.Create(item); pg.RowCollection[1].Value:=0; pg.ColumnCollection.Add;pg.ColumnCollection[2].Value:=50; pg.ColumnCollection.Add;pg.ColumnCollection[3].Value:=10; pg.Parent:=item; pg.Align:=al.alClient; r1:=trectangle.Create(pg); r2:=trectangle.Create(pg); r3:=trectangle.Create(pg); r4:=trectangle.Create(pg); r1.Parent:=pg;r1.Align:=al.alClient; r2.Parent:=pg;r2.Align:=al.alClient; r3.Parent:=pg;r3.Align:=al.alClient; r4.Parent:=pg;r4.Align:=al.alClient; t1:=ttext.Create(r1); if zap.tip<>'Лист' then Begin t1.Enabled:=false; t1.Text:='-'; End else Begin t1.text:=floattostr(zap.razmer.witdh); end; t2:=ttext.Create(r2);t2.text:=floattostr(zap.razmer.length); t3:=ttext.Create(form1);t3.Text:=floattostr(zap.razmer.kol); t4:=ttext.Create(form1);t4.Text:='X'; t1.Parent:=r1;t1.OnClick:=form1.CliskRazmerClick; t2.Parent:=r2;t2.OnClick:=form1.CliskRazmerClick; t3.Parent:=r3;t3.OnClick:=form1.CliskRazmerClick; t4.Parent:=r4;t4.OnClick:=form1.DeleteItemClick; t1.Align:=al.alClient; t2.Align:=al.alClient; t3.Align:=al.alClient; t4.Align:=al.alClient; form1.listbox1.InsertObject(form1.listbox1.Items.Count-1,item); t1.Name:='w'+IntToStr(item.Index); t2.Name:='l'+IntToStr(item.Index); t3.Name:='k'+IntToStr(item.Index); end; form1.listbox1.EndUpdate; end; Заранее спасибо!
    • От gresaggr
      Добрый день.
      IDE: Delphi 10.1 Berlin Update2
      OS: Windows 7/64 ->Android (тестировал на 4.4.4)
      Вопрос 1:
       
      Пытаюсь загрузить в Listbox файл с русскими словами: ListBox1.Items.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'test1.txt'));
      При запуске на устройстве выдает ошибку: No mapping for the Unicode character exists in the target multi-byte code page
      Файл пытался сохранить и в UTF-8, и в ANSI, и в Unicode - без разницы (после смены кодировки делал Deployment)
      Как можно это победить?
      Вопрос 2:
      Вставил напрямую в дизайн-моде список этих же слов (из файла вопрос1) в Listbox - при старте программа очень долго думает. Слов порядка 10000. Как-то можно это ускорить?


       


       


       
    • От M1shQa
      Есть один листбокс..) В общем парился я парился, так и не понял как запилить стиль по человечески для итемов в боксе и нашел кнопку Edit default Style. Нашел куда впилить TimageViewer и поставил ему свойство client. Все бы ничего, да вот размер итемов не статичен, а картинка не растягивается, к тому же pngшная картинка не отделяется от фона. Подскажите, как картинку растягивать в зависимости от длины и ширины итемов листбокса и как правильно юзать pngшные картинки (что бы они сохраняли прозрачность). Может я вообще не туда рою и нужно другими способами вставлять картинки под каждый item? Видел много гайдов под listview, но к сожалению мне нужно именно для бокса..
      ----
      п.с. что бы было проще: как нарисовать ровную плашку позади каждого элемента листбокс?
    • От chaplin.u@gmail.com
      У Мемо есть фича когда нажимаешь (тап по экрану) вылезает клавиатура для редактирования текста.
      Можно ли сделать такое-же с ListBox ? Тапаешь по итему и клавой исправляешь текст.
    • От M1shQa
      Всем утречка! Интересует вопрос кастмизации listbox в плане дизайна. Хотелось бы что бы плашки имели какой то другой цвет, рамку с обводкой и все на андроиде: в какую сторону рыть? Пилить стиль самому?
      Хотелось бы, что бы элементы в листбоксе были темно подсвечены и имели рамочку.. Стили ставил, а вот как поправить что-то в стиле пока не понял.
    • От Просто Проги
      Суть такова копаюсь в стилях, но не могу понять откуда идет наследования есть контейнер content в нем есть selection т,е выделенный элемент лист бокса , возможно ли создать стиль просто для итемов в листбоксе или это не делается через стиль?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...