Jump to content

Горизонтальный список


x11

Recommended Posts

Подскажите, какой компонентой можно сделать примерно такой горизонтальный список для мобильной формы?

Чтобы можно было выбирать либо одно значение, либо несколько?

Я вижу, что есть UnimSegmentedButton. Но там, если я правильно понял, можно сделать только один выбор, т.е. только одну кнопку нажать. Если в UnimSegmentedButton можно сделать множественный выбор (MultiSelect), подскажите, как это сделать?

К сожалению, документации по TUnimSegmentedButton не нашел ни в оффлайне, ни в онлайне.

Спасибо.

Screenshot_29.jpg

Link to comment
Share on other sites

1 hour ago, x11 said:

Я вижу, что есть UnimSegmentedButton. Но там, если я правильно понял, можно сделать только один выбор, т.е. только одну кнопку нажать. Если в UnimSegmentedButton можно сделать множественный выбор (MultiSelect), подскажите, как это сделать?

Первым делом можете включить этот конфиг:

procedure TMainmForm.UnimFormCreate(Sender: TObject);
begin
  UnimSegmentedButton1.JSInterface.JSConfig('allowMultiple', [True]);
end;

 

  • Like 1
Link to comment
Share on other sites

А как програмно управлять нажатием кнопок?

Например, как очистить выбор?

for I := 0 to pred(UnimSegmentedButton1.Items.Count) do
    UnimSegmentedButton1.Items[i].Pressed := false;

Так не получается. Ничего не происходит. Кнопки остаются нажатыми.

 

Link to comment
Share on other sites

16 minutes ago, x11 said:

А как програмно управлять нажатием кнопок?

Например, как очистить выбор?


for I := 0 to pred(UnimSegmentedButton1.Items.Count) do
    UnimSegmentedButton1.Items[i].Pressed := false;

Так не получается. Ничего не происходит. Кнопки остаются нажатыми.

http://forums.unigui.com/index.php?/topic/12506-unimsegmentedbutton-set-button-pressed-programmatically/&do=findComment&comment=66556

  • Like 1
Link to comment
Share on other sites

Спасибо.

Ещё вопрос.

А как получить значение?

Пишу

.Items[0].Pressed then

....

и ничего не происходит, хотя кнопка нажата...

Извините, но я не могу понять, зачем разработчики ввели свойство Pressed, если оно ничего не дает? Ничего не меняет.

Link to comment
Share on other sites

38 minutes ago, x11 said:

А как получить значение?

Пишу

.Items[0].Pressed then

....

и ничего не происходит, хотя кнопка нажата...

Извините, но я не могу понять, зачем разработчики ввели свойство Pressed, если оно ничего не дает? Ничего не меняет.

Я открыл два запроса в портале поддержки.

 

41 minutes ago, x11 said:

зачем разработчики ввели свойство Pressed, если оно ничего не дает? Ничего не меняет.

Обходной путь...

 

  • Like 1
Link to comment
Share on other sites

1 minute ago, Sherzod said:

Обходной путь...

 т.е. самому менять при выборе?

Ну ОК.

Вот я делаю так. В событии  UnimSegmentedButton1.OnClick я пишу

procedure TfmmSearchParams.UnimSegmentedButton1Click(Sender: TUnimButtonItem);
begin
  Sender.Pressed := not Sender.Pressed;// меняем значение на обратное при каждом клике
end;

 

 

Теперь где-то на другой кнопке вешаю код
 

  if UnimSegmentedButton1.Items[0].Pressed then
    ShowMessage('UnimSegmentedButton1.Items[0].Pressed');

 

Меняю значение кнопки и проверяю... ShowMessage вообще никогда не отображается, не важно в каком состоянии кнопка.

Link to comment
Share on other sites

Ещё проблема в событии

procedure TfmmSearchParams.UnimSegmentedButton1Click(Sender: TUnimButtonItem);
begin
  Sender.Pressed := not Sender.Pressed;// меняем значение на обратное при каждом клике
  ShowMessage(Sender.Caption)
end;

Я добавил   ShowMessage(Sender.Caption), для теста и наглядности.

ShowMessage отображается ТОЛЬКО при включении кнопки. Когда повторно щелкаешь по кнопке, чтобы отключить (отжать) её, то ShowMessage не появляется на экране.

 

Link to comment
Share on other sites

13 hours ago, x11 said:

ShowMessage отображается ТОЛЬКО при включении кнопки. Когда повторно щелкаешь по кнопке, чтобы отключить (отжать) её, то ShowMessage не появляется на экране.

procedure TMainmForm.UnimFormCreate(Sender: TObject);
begin
  with UnimSegmentedButton1.JSInterface do
  begin
    JSConfig('allowDepress', [True]);
    JSConfig('allowMultiple', [True]);
    JSAddListener('toggle', 'function(container, button, pressed){if (!pressed) ajaxRequest(this, "toggle", ["btn="+button.nm, "prsd="+pressed])}');
  end;

end;

 

Link to comment
Share on other sites

Вот ещё проблема. Несколько раз нажимаю кнопки. Включаю и отключаю, но ShowMessage не отображается.

 

procedure TfmmSearchParams.UnimSegmentedButton1Click(Sender: TUnimButtonItem);
begin
  Sender.Pressed := not Sender.Pressed;

  if Sender.Pressed then
    ShowMessage(Sender.Caption + ' ' + Sender.Index.ToString);

end;

 

Т.е. на данный момент остается вопрос: как узнать состояние кнопки в тот или иной момент?

Link to comment
Share on other sites

21 minutes ago, x11 said:

Т.е. на данный момент остается вопрос: как узнать состояние кнопки в тот или иной момент?

Если хотите я попробую дать Вам обходное решение, используя:

procedure TMainmForm.UnimSegmentedButton1AjaxEvent(Sender: TComponent;
  EventName: string; Params: TUniStrings);
begin
  if EventName = 'toggle' then
  begin
    //
  end;

end;

 

Или же, в портале поддержки уже есть запрос, который мы постараемся исправить в следующих версиях.

  • Upvote 1
Link to comment
Share on other sites

  • 3 months later...

@Sherzod Вы про меня забыли.

Я ужен почти полгода не могу нормально ничего сделать в мобильной версии своего проекта.

За что не возьмусь, почти ничего не работает в библиотеке или чего-то вообще нет.

Одно не работает должным образом, каких-то компонент вообще не хватает или свойств/событий не хватает. Если вышеуказанное свойство Pressed как-то и можно установить с помощью JS, то как его прочитать? Часть функционала как бы и есть у ExtJS Modern, но в UniGUI приходится его допиливать с помощью JS.

То же самое сейчас с unimSelect + multiselect

http://forums.unigui.com/index.php?/topic/15111-мультивыбор-для-touch-extmodern/&do=findComment&comment=82700

:sad:

Link to comment
Share on other sites

4 hours ago, x11 said:

Вы про меня забыли

Вы не правы, никто про Вас не забыл. Смотрите, я на сайте с основания и большинство постов, это ответы. Вы на сайте не так давно. У Вас постов больше  чем у меня почти в два раза. И большинство вопросов. Многие вещи Фаршад просто не успевает создать, для этого существует документация про Ext.Modern, прежде всего нужно смотреть там. Вы не одни на форуме и, если посмотреть , сколько Вам отвечали, то Вы не можете похвастаться на отсутствие внимания.

Link to comment
Share on other sites

Иногда техподдержка оперативно помогает, за что большое спасибо.

А иногда, вот как сейчас, приходится ждать....

Дело еще и не в том, техподдержка быстрая или медленная, а в том, что функционал недоделан. Эта тема - прекрасный пример.

Есть TUnimSegmentedButton, но функционал этой компоненты рассчитан только на то, чтобы показать покупателю, что это есть, но оно до конца не работает, т.е. просто кнопки нажимаются и это видно визуально, но от этого толку мало, т.к. программно к кнопкам просто так не добраться с помощью Delphi-кода и нужно ще писать обвязку с помощью JS-кода.

Вот как и с соседней теме с TunimSelect >>>

А таких компонент, как дерево с мультивыбором (чекбоксами), как ListView для вывода разнородных данных и с кнопками, вообще нету :(

Link to comment
Share on other sites

On 9/22/2020 at 6:55 PM, stas said:

Вы не правы, никто про Вас не забыл.

дело не во мне.

Вот, как видно, прошло ПОЛТОРА года, а воз и ныне там. Компонента есть, а программистам самим приходится допиливать функционал.

Link to comment
Share on other sites

@Sherzod при нажатии вижу индекс нажатой кнопки, а как понять состояние кнопки в любой момент времени?

Например, пользователь сохраняет в базу данные. Нажимает кнопку Сохранить на ToolBar и мне надо в базу записать индексы только нажатых кнопок. Как понять, какие кнопки нажаты, а какие нет?

Придется какую-то глобальную переменную держать в модуле формы? Или у TUnimSegmentedButton есть какое-то свойство-массив, отвечающее за состояние кнопок?

procedure TfmmSearchParams.btnsRoomsClick(Sender: TUnimButtonItem);
begin
  self.ShowToast(Sender.Caption + ' ' + Sender.Index.ToString);
end;

 

Link to comment
Share on other sites

25 minutes ago, x11 said:

Например, пользователь сохраняет в базу данные. Нажимает кнопку Сохранить на ToolBar и мне надо в базу записать индексы только нажатых кнопок. Как понять, какие кнопки нажаты, а какие нет?

Придется какую-то глобальную переменную держать в модуле формы? Или у TUnimSegmentedButton есть какое-то свойство-массив, отвечающее за состояние кнопок?

Добрый день,

Я проанализирую.

Link to comment
Share on other sites

1 hour ago, x11 said:

Например, пользователь сохраняет в базу данные. Нажимает кнопку Сохранить на ToolBar и мне надо в базу записать индексы только нажатых кнопок. Как понять, какие кнопки нажаты, а какие нет?

Придется какую-то глобальную переменную держать в модуле формы? Или у TUnimSegmentedButton есть какое-то свойство-массив, отвечающее за состояние кнопок?

Попробуйте.

1. 

procedure TMainmForm.UnimFormCreate(Sender: TObject);
begin
  with UnimSegmentedButton1.JSInterface do
  begin
    JSConfig('allowDepress', [True]);
    JSConfig('allowMultiple', [True]);
    JSAddListener('toggle', 'function(container, button, pressed){ajaxRequest(this, "toggle", ["btnIndx="+this.indexOf(button), "prsd="+pressed])}');
  end;
end;

2.

procedure TMainmForm.UnimSegmentedButton1AjaxEvent(Sender: TComponent;
  EventName: string; Params: TUniStrings);
begin
  if EventName = 'toggle' then
  begin
    (Sender as TUnimSegmentedButton).Items[Params.Values['btnIndx'].ToInteger()].Pressed := Params.Values['prsd'].ToBoolean()
  end;
end;

3. 

procedure TMainmForm.UnimButton1Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to UnimSegmentedButton1.Items.Count - 1 do
    if UnimSegmentedButton1.Items[I].Pressed then 
      //
end;

 

  • Like 1
Link to comment
Share on other sites

UnimSegmentedButton1AjaxEvent почему-то два раза подряд срабатывает при нажатии.

И ошибка при втором срабатывании: Project raised exception class EConvertError with message ''' is not a valid integer value for Integer type'.

 

А при отжатии кнопки все норм, один раз срабатывает и ошибок нет.

Link to comment
Share on other sites

7 minutes ago, x11 said:

И ошибка при втором срабатывании: Project raised exception class EConvertError with message ''' is not a valid integer value for Integer type'.

Хмм, в моем случае, работает без ошибок.

Link to comment
Share on other sites

а теперь добавьте в событие вот такой код

 

procedure TfmmSearchParams.UnimSegmentedButton1Click(Sender: TUnimButtonItem);
begin
  if sender.Pressed then
    Self.ShowToast('111');
end;

и должно срабатывать 2 раза и на второй раз будет ошибка.

По идее, я не устанавливаю значение здесь, а всего-лишь читаю. Вроде бы ошибки и срабатывания AjaxEvent быть не должно?

Link to comment
Share on other sites

1 hour ago, Sherzod said:

for I := 0 to UnimSegmentedButton1.Items.Count - 1 do if UnimSegmentedButton1.Items[I].Pressed then

 

Еще не проверял, но я подозреваю, что в этом случае будет 5 раз AjaxEvent, если у мен 5 кнопок. Т.е. на  каждую итерацию в цикле будет выполняться запрос...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...