-
Постов
2 517 -
Зарегистрирован
-
Посещение
-
Победитель дней
264
Активность репутации
-
Равиль Зарипов (ZuBy) отреагировална zairkz в listBoxItem управление цветом
На ListView скролл значительно лучше и без лагов, и вообще очень мощный компонент, все равно, рано или поздно вы откажетесь от ListBOX.
Кнопку можно разместить стандартным способам в настройках самой ListView. Если же вам нужно сто кнопок в одном Итеме, тогда да придется чуток заморочиться.
Во первых надо в настройках ListView в ItemAppearance включить ImageListItemBottomDetailRightButton.
Далее в ItemAppearanceObjects -> ItemObjects можете указывать любые настройки, через PlaseOffset.X - Y перемещать текст и детайл текст как хотите и куда хотите, тоже самое с картинкой и кнопкой, менять цвета и шрифты.
Можете повесить обработчик в свойствах на OnItemClick, а также нажатие на саму кнопку OnButtonClick.
При заполнении Item'ам присваивайте Tag и по ним ориентируйтесь.
Далее для покраски Item'ов подключите Хелпер Zuby(все таки не хелпер, а измененный исходник TListView) FMX.ListView.zip, пропишите пару процедур:
procedure myDefaultItemColor(const aLV: TListView; const aItemIndex: integer; const aUseCustomColor: Boolean = false);
begin with aLV.Items[aItemIndex] do begin Data['aUseCustomColor'] := aUseCustomColor; end; end; /// <summary> устанавливаем кастомный цвет для Item'a </summary> procedure myCustomItemColor(const aLV: TListView; const aItemIndex: integer; const aCustomColor: TAlphaColor; const aUseCustomColor: Boolean = true); begin with aLV.Items[aItemIndex] do begin Data['aUseCustomColor'] := aUseCustomColor; Data['aCustomColor'] := aCustomColor; end; end; Далее к примеру заполняем ListView ListViewPoisk.BeginUpdate; for i := 0 to 15 do begin ListViewPoisk.Items.Insert(0); ListViewPoisk.Items[0].Tag := i; ListViewPoisk.Items[0].Text := 'X_text'; ListViewPoisk.Items[0].Detail := 'X_detail'; ListViewPoisk.Items[0].ButtonText := 'X_buttext'; ListViewPoisk.Items[0].Data['offer'] := 0; //Если нужно хранить не отображаемые данные. ListViewPoisk.Items[0].Bitmap.Assign(Image1.Bitmap); if i mod 2 = 0 then myCustomItemColor(ListViewPoisk, ListViewPoisk.Items[0].Index, TAlphaColors.Lime); // TAlphaColors.Lime можно заменить TAlphaColorF.Create(70 / 255, 130 / 255, 180 / 255, 155 / 255).ToAlphaColor; end; ListViewPoisk.EndUpdate; -
Равиль Зарипов (ZuBy) отреагировална krapotkin в listBoxItem управление цветом
кстати, в D11 через месяц обещали какие-то вкусные плюшки как раз по ListView items, редактор и что-то там
-
Равиль Зарипов (ZuBy) отреагировална zairkz в Как реализовать это?
Нужен Timer и ListView
Например в ListView -> OnUpdateObjects
procedure TForm1.ListViewPoiskUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var aTime: TListitemText; begin aTime := AItem.Objects.FindDrawable('time') as TListitemText; if aTime = nil then begin aTime := TListitemText.Create(AItem); aTime.Name := 'time'; aTime.PlaceOffset.X := 0; aTime.PlaceOffset.Y := 2; aTime.Font.Size := 14; aTime.TextVertAlign := TTextAlign.Center; aTime.TextAlign := TTextAlign.Center; end; aTime.Width := 72; aTime.Height := 20; //Двигаем Text итема с отступом AItem.Objects.TextObject.PlaceOffset.X := aTime.Width + 6; end; И таймер procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; begin if ListView1.ItemCount > 0 then for i := 0 to ListView1.ItemCount - 1 do ListView1.Items[i].Data['time'] := FormatDateTime('ss сек.', Now); end; -
Равиль Зарипов (ZuBy) отреагировална Andrey Efimov в [Android]Каталог, вывод в 2-3 колонки
Отдельную тему создавайте (в правилах ясно указано: одна тема-один вопрос), здесь обсуждается другая тема.
-
Равиль Зарипов (ZuBy) отреагировална zairkz в [Android]Каталог, вывод в 2-3 колонки
На ListView будет достаточно сложно это реализовать.
Попробуйте TPresentedScrollBox и элементы стиля.
Стиль нужен: к примеру:
Вам необходимо фиксированные размеры панелек, например глобальные переменные
ObjectHeight := 205;
ObjectWidth := 160;
PanHeight := 200;
PanWidth := 148;
Затем вычислить количество колонок на FormResize, тоже глобальные пр.
procedure TForm_main.FormResize(Sender: TObject);
begin
PrColumns := Floor(Form_main.ClientWidth / ObjectWidth);
AllMargins := (Form_main.ClientWidth - (PrColumns * PanWidth)) / (PrColumns + 1);
end;
Процедура заполнения, здесь только создания панелей в скроллбоксе, я использовал обычный button в виде панельки
procedure TForm_main.LoadObject();
var
x, i: integer;
LT: TLayout;
Butt: TButton;
begin
x := 0;
for i := 0 to OBJ.Count - 1 do
begin
if x mod PrColumns = 0 then
begin
LT := TLayout.Create(PresentScrolBox);
LT.Parent := PresentScrolBox;
LT.Position.y := PresentScrolBox.ContentBounds.Height + 100;
LT.Align := TAlignLayout.Top;
LT.Height := ObjectHeight;
LT.HitTest := false;
end;
Butt:= TButton.Create(LT);
Butt.Parent := LT;
Butt.Position.x := LT.Width;
Butt.Height := PanHeight;
Butt.Width := PanWidth;
Butt.Align := TAlignLayout.Left;
Butt.Margins.Top := (ObjectHeight - PanHeight) / 2;
Butt.Margins.Bottom := (ObjectHeight - PanHeight) / 2;
Butt.Margins.Left := AllMargins;
Butt.StyleLookup := 'buttonx';
Butt.text := '';
Butt.tag := 55; //Пример
Butt.TextSettings.WordWrap := True;
Butt.OnTap := Form_main.ButObjTap;
{$IFDEF MSWINDOWS}
Butt.OnClick := Form_main.ButtObjectClick;
{$ENDIF}
Butt.OnApplyStyleLookup := Form_main.ObjectStyle;
x := x + 1;
end;
end;
LT := TLayout.Create(SB_Object);
LT.Parent := SB_Object;
LT.Position.y := SB_Object.ContentBounds.Height + 100;
LT.Align := TAlignLayout.Top;
LT.Height := 72;
end;
После создания заполнять данными необходимо в Butt.OnApplyStyleLookup := Form_main.ObjectStyle;
procedure TForm_main.ObjectStyle(Sender: TObject);
var
i: integer;
begin
for i := 0 to 9 do
if TButton(Sender).tag=i then
begin
TButton(TButton(Sender).FindStyleResource('btn_add')).tag := i;
// TButton(TButton(Sender).FindStyleResource('btn_add')).text := ‘+’;
TButton(TButton(Sender).FindStyleResource('btn_add')).OnClick := Form_main.But_Main_Add;
TText(TButton(Sender).FindStyleResource('text')).text := 'i = '+inttostr(i);
TText(TButton(Sender).FindStyleResource('obj_price')).text := ‘500’;
TImage(TButton(Sender).FindStyleResource('img')).Bitmap.Assign(Какой нибудь битмап);
break;
end;
end;
Желательно данные и картинки загрузить сперва в Record, затем заполнять их в OnApplyStyleLookup.
ХЗ может подойдет вариант, на слабых телефонах лагов не много, но и ListView на слабых подлагивает.
Как вариант старое наше с Zuby приложение по доставке еды Gepard, не судите строго мы его забросили): https://play.google.com/store/apps/details?id=kz.vbaze.Gepard
-
-
Равиль Зарипов (ZuBy) отреагировална zairkz в [TTabControl] При переключении Tabs исчезает вкладка
Нет не было, но бывают такие аномальные явления, скорее всего из за вспышек на солнце или фаза луны не та.
Исходник давай)
-
Равиль Зарипов (ZuBy) отреагировална kami в vkbdhelper - поднятие компонентов над клавиатурой
Update. Исправили недостаток на Android 5. Большое спасибо Rusland за тестирование.
Итоговый файл прикладываю.
По прежнему не рекомендую использовать этот модуль, если создаваемые в runtime контролы ложатся напрямую на форму.
Перед написанием претензий, пожалуйста прочитайте known issues в комментарии в начале файла.
vkbdhelper.zip
-
Равиль Зарипов (ZuBy) получил реакцию от enatechno в Как правильно зачистить ListBox
while TListBox Items.Count > 0 do TListBox Items.Delete(0); -
Равиль Зарипов (ZuBy) получил реакцию от zairkz в Как правильно зачистить ListBox
while TListBox Items.Count > 0 do TListBox Items.Delete(0); -
Равиль Зарипов (ZuBy) получил реакцию от zairkz в Как реализовать это?
нет, я просто отрисовал нужные контролы в Item'e. а тот класс это для покраски TListView, через него я убрал разделитель.
все что вам нужно находиться в OnUpdateObjects, посмотрите на константы и как присваиваются данные
-
Равиль Зарипов (ZuBy) получил реакцию от Владимир в Потоки и процедуры
использовать такую конструкцию
//uses System.Threading; TTask.Run( procedure begin // выполняем загрузку файла из интернета; TThread.Synchronize(nil, procedure begin // выполняем действия связанные с визуальными компонентами end); end); но помнить что из доп. потока нельзя запустить доп. поток
-
Равиль Зарипов (ZuBy) получил реакцию от Владимир в [TBitmap] Загрузка изображений из интернета в приложение
idhttp1.Create(Application); - что это за бред?
IdHTTP - это откуда взялось?
никогда и никому этот код не показывай
берем файлик во вложении подключаем в проекте и пишем
with ListView1.Items.Add do begin Text := 'Text'; Bitmap.LoadFromUrl('http://site.ru/icons/icon.png'); end; не проверял, но должно работать. не нужно пихать в поток, там итак уже используется
FMX.Features.Bitmap.Helpers.zip
-
Равиль Зарипов (ZuBy) получил реакцию от enatechno в Путь к файлам другой Android апликации
да, чтобы в android/data писать нужно через TPath.GetSharedDocumentsPath
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в Помогите начать
XE7 update 1 и выше могут собирать под андроид 5
А то что у вас пути разные так это не проблема, если присмотреться в корне лежат линки с подобными путями.
-
Равиль Зарипов (ZuBy) получил реакцию от enatechno в PushEvents без Provider
для основы статья хорошая, но она требует доработки в плане добавления заголовка для обоих платформ.
если в android'е это делается дописыванием строчки
$message = new \push\CodeMonkeysRu\GCM\Message($tokens, array("title" => $title, "message" => $text)); то в классе для IOS нужно пару строк добавить в ApnsPHP/Message.php
переменка новая в классе class ApnsPHP_Message
// ZuBy === protected $_sTitle; // === ZuBy и два метода
// ZuBy === public function setTitle($sText) { $this->_sTitle = $sText; } public function getTitle() { return $this->_sTitle; } // === ZuBy и в мотоде protected function _getPayload() нужно добавить проверку есть ли у нас Title
было примерно так (не помню уже)
$aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; заменить на такую конструкцию
// ZuBy === if (isset($this->_sTitle) and isset($this->_sText)){ if (!empty($this->_sTitle)){ $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['title'] = (string)$this->_sTitle; $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['body'] = (string)$this->_sText; } else { if (isset($this->_sText)) { $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; } } } // === ZuBy в методе public function getPayload() нужно заменить следующее
$sJSONPayload = str_replace( '"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"'.self::APPLE_RESERVED_NAMESPACE.'":{}', $sJSON); на вот такое
// ZuBy === $sJSONPayload = str_replace( ['"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"alert":[]'], ['"'.self::APPLE_RESERVED_NAMESPACE.'":{}', '"alert":{}'], $sJSON); // === ZuBy и теперь мы можем вызвать наш новый метод
# Устанавливаем параметры отправки сообщения $message->setSound(); $message->setTitle($title); // ZuBy $message->setBadge(0); $message->setText($text); если не ошибаюсь заголовок появился начиная в IOS 8.2
-
Равиль Зарипов (ZuBy) получил реакцию от Rusland в PushEvents без Provider
для основы статья хорошая, но она требует доработки в плане добавления заголовка для обоих платформ.
если в android'е это делается дописыванием строчки
$message = new \push\CodeMonkeysRu\GCM\Message($tokens, array("title" => $title, "message" => $text)); то в классе для IOS нужно пару строк добавить в ApnsPHP/Message.php
переменка новая в классе class ApnsPHP_Message
// ZuBy === protected $_sTitle; // === ZuBy и два метода
// ZuBy === public function setTitle($sText) { $this->_sTitle = $sText; } public function getTitle() { return $this->_sTitle; } // === ZuBy и в мотоде protected function _getPayload() нужно добавить проверку есть ли у нас Title
было примерно так (не помню уже)
$aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; заменить на такую конструкцию
// ZuBy === if (isset($this->_sTitle) and isset($this->_sText)){ if (!empty($this->_sTitle)){ $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['title'] = (string)$this->_sTitle; $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['body'] = (string)$this->_sText; } else { if (isset($this->_sText)) { $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; } } } // === ZuBy в методе public function getPayload() нужно заменить следующее
$sJSONPayload = str_replace( '"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"'.self::APPLE_RESERVED_NAMESPACE.'":{}', $sJSON); на вот такое
// ZuBy === $sJSONPayload = str_replace( ['"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"alert":[]'], ['"'.self::APPLE_RESERVED_NAMESPACE.'":{}', '"alert":{}'], $sJSON); // === ZuBy и теперь мы можем вызвать наш новый метод
# Устанавливаем параметры отправки сообщения $message->setSound(); $message->setTitle($title); // ZuBy $message->setBadge(0); $message->setText($text); если не ошибаюсь заголовок появился начиная в IOS 8.2
-
Равиль Зарипов (ZuBy) получил реакцию от Rusland в Видео с Евгением Крюковым
вот это?
https://www.youtube.com/watch?v=eqrVYWZ8SPk
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в Видео с Евгением Крюковым
вот это?
https://www.youtube.com/watch?v=eqrVYWZ8SPk
-
Равиль Зарипов (ZuBy) отреагировална krapotkin в Сортировка TListBoxItem по алфавиту
что ж так сложно то O_O
выделить из строки подстроку - на 100 строк процедура?
а еще как обычно замечу, что данные нужно хранить в модели данных а не на экране
тогда доступ к ним гораздо проще
и сортировка тоже
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в [DX10] Drag-and-Drop Пример
https://youtu.be/ta_N6DSi0Xg -
Равиль Зарипов (ZuBy) отреагировална ivadimos в Серьезно о FireMonkey на Android и iOS
Можно писать, как раз занимаюсь похожим, только функционал намного шире)
-
Равиль Зарипов (ZuBy) получил реакцию от mrseagull в Серьезно о FireMonkey на Android и iOS
если выбрать правильные инструменты, то возможно.
FMX + сервак + PHP (или любой серверный язык) всю работу с БД и с картами (такие как запросы геокодинга и прочие ssl запросы на другие сайты) на PHP, а клиент-приложение только в виде отображения контента.
и можно делать не только одноформенные приложения, а сложные
-
Равиль Зарипов (ZuBy) отреагировална Axbor в Расчет высоты объекта на основе высоты TLabel
Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
ListBoxItem.zip
-
Равиль Зарипов (ZuBy) отреагировална enatechno в Серьезно о FireMonkey на Android и iOS
имхо: FMX - удачный инструмент. мы под даже под официанта все заточили. а клиенты бывают разные...