-
Постов
135 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Активность репутации
-
zairkz получил реакцию от Rusland в Исключить устройства с Intel Atom как не поддерживаемые
А еще вроде как новые устройства на Intel Atom поддерживают эмуляцию, поэтому вам только старые устройства отключить на которых приложения вообще не запустятся. На эмуляторе Intela нормально все работает если правильно делать. А "работающие и пользующиеся популярностью приложения" наврятли оно таким станет, если у ~30% пользователей не будет возможность даже скачать (Допустим 30% скачало, из них 10% не запустилось). Кроме того все надеемся на новые версии студии в котором будет поддержка Intel
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Исключить устройства с Intel Atom как не поддерживаемые
все баги которые написал решаемы, так что я пока не вижу смысла не поддерживать Intel. Приложение ведет себя более менее адекватно, пользоваться можно
поворот - можно отключить
тосты - своя реализация у меня
анимация - можно не использовать
ListBox - использовать ListView
работа с формой (неправильный расчёт) - два варианта: 1) использовать модифицированный файл 2) FullScreen режим
-
zairkz отреагировална Andrey Efimov в Какие статьи вы хотели бы видеть в блогах?
Статья/видео урок на английском: http://delphi.org/2014/07/android-voice/
-
zairkz отреагировална rareMax в Составление URL в HttpClient
Ага, нашел, кажется
class function THello.AdvancedShort(const URL, APIkey: String; const AppID: Int64; Domen, Folder: String; AdvertType: TAdvertType): String; var HTTP: THTTPClient; URI: TURI; begin HTTP := THTTPClient.Create; try //---cut URI.AddParameter('key', APIkey); URI.AddParameter('uid', AppID.ToString); URI.AddParameter('url', URL); Result := HTTP.Execute('GET', URI).ContentAsString.Trim; finally HTTP.Free; end; end; -
zairkz отреагировална Andrey Efimov в Глобальные тормоза сайта
Днём, нормально всё было. Но такие лаги уже не первый раз вижу... Сейчас сообщу Ярославу.
-
zairkz отреагировална Brovin Yaroslav в Глобальные тормоза сайта
Доброй ночи,
Мы с Андреем провели анализ проблемы. Причины были найдены и устранены.
Однако, не исключается возможность повторения проблемы. В случае возникновения, просьба всех отписаться в этой же ветке форума.
Всем спасибо за бдительность
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Глобальные тормоза сайта
пару дней назад на форум мог зайти только через Tor.
Причина была в провайдере, но все же что такого в форуме, что на него не было доступа.
хотя все соц сети и популярные сайты работали
-
zairkz отреагировална 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
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Thoma Bravo Announces Sale of Embarcadero to Idera, Inc.
это все конечно имеет место быть, но использовать мне кажется не удобно. даже чтобы разместить одну кнопку нужно проделать кучу не нужных действий.
а ели представить что с использованием этой штуки делать большой проект, нее увольте
да и кроссплатформенность теряется
-
zairkz отреагировална Error в RAD 11 на подходе?
Может мне везет так, но имея бесплатную библиотеку компонентов и, группу про либу в вк созданную недавно, посвященную либе, я переодически получаю в личку сообщения вида "дельфи мертв" и подобные, от людей которых не знаю. При расспросе людей часто выясняется что "я недавно начал первый язык - питон изучать, но знаю по отзывам что дельфи мертв" xD
-
zairkz отреагировална Martifan в RAD 11 на подходе?
что тут спорить, кому не нравится на Delphi программировать есть очень много языков где можно писать код некто вас не держит а кому нравится остается на Delphi несмотря на рейтинги и всякое фигни вот и все, не хотите или рейтинг ненравится вас некто не держит
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Вопрос к знатокам установки
бывают, но почти всегда есть адаптивный режим для планшетов.
нужно помнить всегда что есть дисплей 3,2 дюйма и нужно чтобы туда все влезло.
я пишу на 5 дюймах и приложения адекватно ведут себя на маленьких дисплеях, зато на больших если кнопка растянута до краёв это просто ужасно
для мелких дисплеев подкладываю TVertScrollBox и контент туда пихаю, не включая Toolbar'ы и прочие элементы управления
на 7 дюймах еще нормально, а на 10-ке нужно адаптировать в зависимости от ориентации
-
-
zairkz получил реакцию от Равиль Зарипов (ZuBy) в 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; -
zairkz получил реакцию от Равиль Зарипов (ZuBy) в Как реализовать это?
Нужен 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; -
zairkz получил реакцию от Равиль Зарипов (ZuBy) в [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
-
-
zairkz получил реакцию от Равиль Зарипов (ZuBy) в [TTabControl] При переключении Tabs исчезает вкладка
Нет не было, но бывают такие аномальные явления, скорее всего из за вспышек на солнце или фаза луны не та.
Исходник давай)
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Как правильно зачистить ListBox
while TListBox Items.Count > 0 do TListBox Items.Delete(0); -
zairkz отреагировална Rusland в Перехват события звонка
Вот пример, из которого вы можете видеть как перехватывать звонки (добавьте на форму Memo)
uses CSBroadcastReceiver, Androidapi.JNI.JavaTypes.Own, Androidapi.Jni, AndroidApi.JNI.GraphicsContentViewText, Androidapi.Jni.JavaTypes, Androidapi.JNI.Os, Androidapi.JNIBridge, Androidapi.JNI.Telephony, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls; private { Private declarations } procedure CreateBroadcastReceiver; procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); procedure CheckPhoneCallState(Context: JContext; Intent: JIntent); procedure CheckSmsInState(Context: JContext; Intent: JIntent); function KillCall(Context: JContext): Boolean; public { Public declarations } end; var Form1: TForm1; BroadcastReceiver: TCSBroadcastReceiver; implementation uses Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log; procedure TForm1.CreateBroadcastReceiver; begin if not Assigned(BroadcastReceiver) then begin BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.NEW_OUTGOING_CALL'); end; end; procedure TForm1.CheckPhoneCallState(Context: JContext; Intent: JIntent); var telephonyService: JObject; telephonyManager: JTelephonyManager; state: JString; incomingCallNumber: string; outgoingCallNumber: string; outputResult: string; begin outputResult:= #13#10; telephonyService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID); if JStringToString(Intent.getAction).Equals('android.intent.action.PHONE_STATE') then begin state:= Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_STATE); if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_IDLE) then outputResult:= outputResult + 'Phone is IDLE ' + #13#10 else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_RINGING) then begin incomingCallNumber:= JStringToString(Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_INCOMING_NUMBER)); if incomingCallNumber.Equals('') then incomingCallNumber:= 'PRIVATE NUMBER'; outputResult:= outputResult + 'Phone is RINGING' + #13#10; outputResult:= outputResult + 'Incoming call from ' + incomingCallNumber + #13#10; if incomingCallNumber = '+79391234567' then /// телефон в черном списке // тут отбиваем звонок end else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_OFFHOOK) then outputResult:= outputResult + 'Phone is OFFHOOK' + #13#10; end else if JStringToString(Intent.getAction).Equals('android.intent.action.NEW_OUTGOING_CALL') then begin outgoingCallNumber:= JStringToString(Intent.getStringExtra(TJIntent.JavaClass.EXTRA_PHONE_NUMBER)); outputResult:= outputResult + 'Outgoing call to ' + outgoingCallNumber + #13#10; if outgoingCallNumber = '+79051234567' then /// телефон в черном списке begin BroadcastReceiver.SetResultData(nil); outputResult:= outputResult + 'Call is not allowed to ' + outgoingCallNumber + #13#10; end; end; Memo1.Lines.Append(outputResult); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(BroadcastReceiver) then BroadcastReceiver.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateBroadcastReceiver; end; Отправить на PHP сервер можно, например, через Indy компоненты.
-
zairkz отреагировална #WAMACO в Какие статьи вы хотели бы видеть в блогах?
Обновление базы данных в фоновом режиме.
Есть сеть - обновляем БД! Нет, работаем в оффлайн режиме!
ОС: iOS, Android
-
zairkz отреагировална Alex Bozhko в Какие статьи вы хотели бы видеть в блогах?
Как опубликовать FM приложение в Google Play. Пошаговый солюшн.
-
zairkz отреагировална GASCHE в Какие статьи вы хотели бы видеть в блогах?
OC: Android. Многопоточные приложения, синхронизация потоков, создание потоконезависимых компонентов.
-
zairkz отреагировална Alex7wrt в Какие статьи вы хотели бы видеть в блогах?
Как воспроизводить видео из одного файла одновременно на двух компонентах разного размера.
-
zairkz отреагировална fsdb в Какие статьи вы хотели бы видеть в блогах?
1. как воспроизвести потоковое видео с IP камеры на Андройд
2. пример использования распознания речи google api на Андройд
3. пример передачи даных из сервиса в приложение / узнать из севиса что приложение работает