Лидеры
Популярный контент
Показан контент с высокой репутацией 01.03.2016 во всех областях
-
listBoxItem управление цветом
Равиль Зарипов (ZuBy) и 2 других отреагировал zairkz за вопрос
На 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;3 балла -
Вы уже достаточно много знаете... осталось только собрать информацию воедино. Под настоящей инфой подразумевается Адрес, который определяется по клику на карте? Значит вам понадобится MapView (понадобится прописать ApiKey в VersionInfo). Алгоритм такой - обрабатываете OnMapClick чтобы получить координату для маркера, через Geocoder получаете адрес, с помощью процедуры AddMarker добавляете маркер на карту, указав в качестве Title. Советую скачать компонент TMapsEngine, с ним очень удобно работать, когда дело касается MapView.2 балла
-
[Android]Каталог, вывод в 2-3 колонки
Равиль Зарипов (ZuBy) и ещё один отреагировал zairkz за вопрос
На 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.Gepard2 балла -
ммм... я так понимаю что на форме 5 лежит TRectangle под именем left... бывает, когда переработаешь, отдохнуть вам надо бы... пивка там2 балла
-
zairkz, спасибо! Правда оказалось немного не то что мне нужно. Горизонтальный скролл оказывается нужен только вертикальный скролл. Пытаюсь сделать подобие каталога, как на скриншоте. Нужно в зависимости от ширины экрана выводить список товаров в одну/две/три колонки. Только с вертикальным скролом. Пробую через TListView, но что то не получается. Опыта написания для Android можно сказать нет, весь опыть - написание БД, много лет назад. Буду благодарен за помощь, можно в личку.1 балл
-
zairkz, большое спасибо за развернутый ответ! Буду переваривать. Думаю пригодится не только мне. Для Крапоткина: тоже большое спасибо, учту ваши советы.1 балл
-
На VCL это очень легко делается. Сделаете TransparentColor = true, и color формы сделаете одинаково со свойством TransparentColorValue На FMX пока не нашел1 балл
-
да, если строк > 10 listBox сразу идет в топку положить в ListViewItem все нужные компоненты вообще не очень сложно при этом главное помнить что в FMX можно вкладывать что хочешь куда попало! и совсем не обязательно использовать уже положенные туда Text Detail и т.д.1 балл
-
[Android]Каталог, вывод в 2-3 колонки
zairkz отреагировал Andrey Efimov за вопрос
Тема создана по просьбе Mantikor Сообщения перенесены из темы TListViewHorz1 балл -
Так, я всё последнее накиданное на форму перенёс на фрейм (через "вырезать-вставить"), который создаётся динамически и опять же на форму помещается. Ошибка перестала выскакивать. В том числе нет ошибки и на показе фрейма. Но вопрос остался - что за фигня, куда копать когда это опять неизбежно появится по причине космических флуктуаций? О! Опять началось. Теперь уже для фрейма.1 балл
-
janovskis, почитайте темы в этом же разделе, узнаете много полезного. Private FMarkers: TList<TMapMarker>; procedure Tfmain.FormCreate(Sender: TObject); begin FMarkers := TList<TMapMarker>.Create; End; Procedure AddMarker; var mapCenter: TMapCoordinate; MyMarker: TMapMarkerDescriptor; Begin mapCenter := TMapCoordinate.Create(StrToFloat(Lat), StrToFloat(Lon)); MyMarker := TMapMarkerDescriptor.Create(mapCenter, 'Text'); fmain.MapView1.Location := mapCenter; FMarkers.Add(fmain.MapView1.AddMarker(MyMarker)); End;1 балл
-
Вроде писали, что минимально поддерживаемая версия 4.11 балл
-
Завтра-послезавтра тоже начинаю в iOS версии Push делать. Пока для себя оставил вот эту закладочку Ссылка Может пригодится.1 балл
-
Как реализовать это?
Равиль Зарипов (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;1 балл -
vkbdhelper - поднятие компонентов над клавиатурой
Равиль Зарипов (ZuBy) отреагировал kami за вопрос
Update. Исправили недостаток на Android 5. Большое спасибо Rusland за тестирование. Итоговый файл прикладываю. По прежнему не рекомендую использовать этот модуль, если создаваемые в runtime контролы ложатся напрямую на форму. Перед написанием претензий, пожалуйста прочитайте known issues в комментарии в начале файла. vkbdhelper.zip1 балл -
Да не надо ваш проект или пример. Создайте новый проект с двумя формами аналогично вашему, если там эта проблема будет повторяться, то выложите, здесь проверят. Если такой ошибки не возникнет, то значит листайте 1,5 тысяч строк по-видимому они не полностью рабочие.1 балл
-
может конфликт имен... посмотрите внимательнее...1 балл
-
Помогите начать
zairkz отреагировал Andrey Efimov за вопрос
спасибо. вроде понятно что проблема просто в версии android. сейчас попросил запустить приложение человека с android 4 - у него работает. Проблема в поддержке версии Андроид, в данном случае, XE5 не поддерживает разработку приложений под Android 5. Как уже сказал Zuby, чтобы разрабатывать под пятый Андроид, необходимо установить более свежую версию RAD Studio. Поддержка появилась с версии XE7 Upd 1, ставьте её, а ещё лучше, сразу последнюю, RAD Studio Seattle и будет вам счастье. Справка по поддерживаемым версиям Android: XE5: http://docwiki.embarcadero.com/RADStudio/XE5/en/Android_Devices_Supported_for_Application_Development XE6: http://docwiki.embarcadero.com/RADStudio/XE6/en/Android_Devices_Supported_for_Application_Development XE7 (для Android 5, выпущен ап): http://docwiki.embarcadero.com/RADStudio/XE7/en/Android_Devices_Supported_for_Application_Development XE8: http://docwiki.embarcadero.com/RADStudio/XE8/en/Android_Devices_Supported_for_Application_Development Seattle: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Android_Devices_Supported_for_Application_Development p.s. Разрабатывать на XE5, самое неблагодарное дело (как вспомню, сколько там багов было, даже в дрожь бросает), переходите на новую версию.1 балл -
Альтернатива FMX
Mantikor отреагировал Камышев Александр за вопрос
Ядро Андроида - Linux Kernel, написан, в основном, на си, и серьезность проекта коррелируется скорее с навыками программера чем со средой RAD. Приложения под операционную систему Android являются программами в нестандартном байт-коде для виртуальной машины Dalvik. Программы для Dalvik пишутся на языке Java. Несмотря на это, стандартный байт-код Java не используется, вместо него Dalvik исполняет байт-код собственного формата. После компиляции исходных текстов программы на Java (при помощи javac) утилита dx из Android SDK преобразует файлы классов (расширение .class) в файлы собственного формата (с расширением .dex), которые и включаются в пакет приложения (.apk). Android Native Development Kit позволяет портировать библиотеки и компоненты приложений, написанные на Си и других языках.1 балл -
Как реализовать это?
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
нет, я просто отрисовал нужные контролы в Item'e. а тот класс это для покраски TListView, через него я убрал разделитель. все что вам нужно находиться в OnUpdateObjects, посмотрите на константы и как присваиваются данные1 балл -
В топике старый протокол отправки пушей на ИОС. Не более 256 знаков, а с учетом юникода так вообще не более около 50 букв на русском!!! Переписал на новый 2-й протокол, чуток попапрился с байтами-битами ), но все же сделал. Теперь на русском можно около 400 букв, а на инглише как и разрешено около 2000. Это лучший ответ, но не хочу и первую версию снимать со счета...она ведь для ИОС ниже 8. Вообщем Enjoy : procedure TForm1.Button2Click(Sender: TObject); var i,j,p: integer; s,c,t,m: string; vStr: TStringStream; begin if not TCPClient.Connected then TCPClient.Connect; m := EscapeString(edMsg.Text); c := edToken.Text; t := ''; for i := 0 to (length(c) div 2) - 1 do t := t + AnsiChar(Byte(('$'+copy(c,i*2+1,2)).ToInteger)); s := '{"aps":{"alert":"'+ m +'","sound":"default","badge":0}}'; p := length(s); j := p + 38; s := #2#0#0 + AnsiChar(hi(j)) + AnsiChar(lo(j)) + #1#0#32 + t + #2 + AnsiChar(hi(p)) + AnsiChar(lo(p)) + s; vStr := TStringStream.Create(s); try SSLHandler.write(vStr); finally vStr.Free; end; end; p.s: нафиг 4 байта для общей длины...если дали разрешение на длину сообщения в 2 килобайта...1 балл
-
XE8 без апдейтов. На какой строке AV? Provisioning profile должен включать APN. uses: System.PushNotification, FMX.PushNotification.iOS1 балл
-
Дам вам подсказку из Android доков... public String getDeviceId () Added in API level 1 Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available. Requires Permission: READ_PHONE_STATE public String getDeviceId (int slotId) Added in API level 23 Returns the unique device ID of a subscription, for example, the IMEI for GSM and the MEID for CDMA phones. Return null if device ID is not available. Requires Permission: READ_PHONE_STATE Parameters slotId of which deviceID is returned1 балл
-
Текст плюс картинка. Какие компоненты лучше выбрать
Владимир отреагировал Brovin Yaroslav за тема
TScrollBox автоматически высчитывает размер скролируемого контента. Поэтому, когда вы помещаете в него контрол и перемещаете его за видимые границы контрола (ViewPort), то TScrollBox пересчитывает размеры контента и добавляет полосы прокрутки. Отсюда следует важный факт, что размер контента TScrollBox зависит от внутернний контролов. Вы пытаетесь добавить внутрь контента Layout, выравненный по всей области скроллбокса. Что вы вы этом случае ожидаете получить на выходе? Как я думаю, вы догадываетесь, что это выравнивание зависит от размер родительского контрола. А сам скролл бокс (предок), использует ваш Layout для определение размера контента. Так что в вашей ситуации TScrollBox для контента возьмет размер самого скролл бокса. Чтобы вам добавить прокрутку нужно: Взять за основу TVertScrollBox Поместить внутрь TLayout (если хотите, можно без него напрямую складывать контролы). Выравнять его по верхнему краю. В этом случае вы сможете руками задать требуемую высоту, при получении новых данных Когда вы будите знать размер вашего изображения, пересчитать высоту и обновить ее для вашего Layout.1 балл