Перейти к содержанию
Fire Monkey от А до Я

Aptem

Пользователи
  • Постов

    55
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Весь контент Aptem

  1. Здравствуйте. Это класс фреймворка Spring4D. Кстати, всем рекомендую. Работа со списками очень удобна, есть LINQ-подобные конструкции для поиска элементов с различными предикатами, а также неплохо реализован IoC-контейнер. TCollections = class public class function CreateList<T>: IList<T>; overload; static; class function CreateList<T>(const comparer: IComparer<T>): IList<T>; overload; static; class function CreateList<T>(const comparer: TComparison<T>): IList<T>; overload; static; class function CreateList<T>(const values: array of T): IList<T>; overload; static; class function CreateList<T>(const values: IEnumerable<T>): IList<T>; overload; static; class function CreateList<T: class>(ownsObjects: Boolean): IList<T>; overload; static; class function CreateList<T: class>(const comparer: IComparer<T>; ownsObjects: Boolean): IList<T>; overload; static; class function CreateList<T: class>(const comparer: TComparison<T>; ownsObjects: Boolean): IList<T>; overload; static; class function CreateObjectList<T: class>(ownsObjects: Boolean = True): IList<T>; overload; static; class function CreateObjectList<T: class>(const comparer: IComparer<T>; ownsObjects: Boolean = True): IList<T>; overload; static; class function CreateObjectList<T: class>(const comparer: TComparison<T>; ownsObjects: Boolean = True): IList<T>; overload; static; class function CreateObjectList<T: class>(const values: array of T; ownsObjects: Boolean = True): IList<T>; overload; static; class function CreateObjectList<T: class>(const values: IEnumerable<T>; ownsObjects: Boolean = True): IList<T>; overload; static; class function CreateInterfaceList<T: IInterface>: IList<T>; overload; static; class function CreateInterfaceList<T: IInterface>(const comparer: IComparer<T>): IList<T>; overload; static; class function CreateInterfaceList<T: IInterface>(const comparer: TComparison<T>): IList<T>; overload; static; class function CreateInterfaceList<T: IInterface>(const values: array of T): IList<T>; overload; static; class function CreateInterfaceList<T: IInterface>(const values: IEnumerable<T>): IList<T>; overload; static; class function CreateDictionary<TKey, TValue>: IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(capacity: Integer): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(const comparer: IEqualityComparer<TKey>): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(capacity: Integer; const comparer: IEqualityComparer<TKey>): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(ownerships: TDictionaryOwnerships): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(ownerships: TDictionaryOwnerships; capacity: Integer): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(ownerships: TDictionaryOwnerships; capacity: Integer; const comparer: IEqualityComparer<TKey>): IDictionary<TKey, TValue>; overload; static; class function CreateDictionary<TKey, TValue>(dictionary: Generics.Collections.TDictionary<TKey, TValue>; ownership: TOwnershipType): IDictionary<TKey, TValue>; overload; static; class function CreateMultiMap<TKey, TValue>: IMultiMap<TKey, TValue>; overload; static; class function CreateMultiMap<TKey, TValue>(ownerships: TDictionaryOwnerships): IMultiMap<TKey, TValue>; overload; static; class function CreateStack<T>: IStack<T>; overload; static; class function CreateStack<T: class>(ownsObjects: Boolean): IStack<T>; overload; static; class function CreateStack<T>(const values: array of T): IStack<T>; overload; static; class function CreateStack<T>(const values: IEnumerable<T>): IStack<T>; overload; static; class function CreateQueue<T>: IQueue<T>; overload; static; class function CreateQueue<T: class>(ownsObjects: Boolean): IQueue<T>; overload; static; class function CreateQueue<T>(const values: array of T): IQueue<T>; overload; static; class function CreateQueue<T>(const values: IEnumerable<T>): IQueue<T>; overload; static; class function CreateSet<T>: ISet<T>; overload; static; class function CreateSet<T>(const comparer: IEqualityComparer<T>): ISet<T>; overload; static; class function CreateSet<T>(const values: array of T): ISet<T>; overload; static; class function CreateSet<T>(const values: IEnumerable<T>): ISet<T>; overload; static; /// <summary> /// Returns an empty <see cref="IEnumerable<T>" /> that has the /// specified type argument. /// </summary> /// <typeparam name="T"> /// The type to assign to the type parameter of the returned generic /// <see cref="IEnumerable<T>" />. /// </typeparam> /// <returns> /// An empty <see cref="IEnumerable<T>" /> whose type argument is /// <i>T</i>. /// </returns> class function Empty<T>: IEnumerable<T>; static; class function Query<T>(const source: TArray<T>): IEnumerable<T>; overload; static; class function Query<T>(const source: TEnumerable<T>): IEnumerable<T>; overload; static; class function Range(start, count: Integer): IEnumerable<Integer>; static; class function Repeated<T>(const element: T; count: Integer): IEnumerable<T>; static; class function Select<T, TResult>(const source: IEnumerable<T>; const selector: TFunc<T, TResult>): IEnumerable<TResult>; overload; static; end;
  2. Спасибо за ответ. Но у интерфейса такого метода нет. Если приводить каждый элемент списка к определенному типу, то теряется все изящество использования интерфейсов как абстракции.
  3. Коллеги, не могу разобраться с освобождением памяти объектов интерфейсного типа. Вот есть у меня переменная: var surveyList : IList<TSurvey>; То есть это список простеньких объектов. Предположим, TSurvey - класс, содержащий два поля: Id и Name. Есть функция которая заполняет этот список, например, из базы данных: function GetList () : IList<TSurvey> var list : IList<TSurvey>; i : Integer; item : TSurvey; begin list := TCollections.CreateList<TSurvey>; for i := 0 to 10 do begin item := TSurvey.Create (); item.Id := берем_например_из_БД item.Name := берем_например_из_БД list.Add ( item ); end; Result := list; end; И дальше необходимо в течении жизни программы обновлять этот список, то есть вызывать эту функцию. surveyList := GetList (); Так вот, при каждом вызове функции выделяется определенная память, например, 5 Мб. И каждый раз при вызове этой функции общий объем оперативной памяти увеличивается на 5 Мб (это видно из Диспетчера задач). Но ведь память интерфейсного объекта освобождается при величине счетчика ссылок равной 0. Почему тогда идет увеличение? Пытался и так сделать: if Assigned ( surveyList ) then begin surveyList.Clear (); surveyList := nil; end; surveyList := GetList (); Но это не помогает. Как правильно освободить память?
  4. Здравствуйте, Ярослав. Проблему временно решил с помощью ссылок на функцию. То есть вместо процедурного типа использовал ссылку: type TSearchFunction = reference to function ( criteria : Integer ) : IDictionary<String, Integer>; ... LeftFunction : TSearchFunction; А при вызове использовал анонимную функцию-обертку: fmSearch.LeftFunction := function ( criteria : Integer ) : IDictionary<String, Integer> begin Result := searchHelper.GetItems ( criteria ); end; Решение конечно так себе, но работать позволяет. Однако, все таки привожу код, о котором вы спрашивали. Интерфейс класса TSearchVSPHelper: /// <summary> /// Helper for VSP-binded well search /// </summary> type TSearchVSPHelper = Class ( TInterfacedObject, ISearchHelper ) private {$REGION 'Private fields'} /// <summary> /// Data provider instance /// </summary> _provider : IDatabaseProvider; /// <summary> /// Criteria list /// </summary> _criteriaList : IDictionary<String, Integer>; {$ENDREGION} {$REGION 'Methods'} /// <summary> /// Gets expeditions list (by subject identifiers list) /// </summary> /// <param name="idList">Subject identifier list</param> /// <returns>Items</returns> function GetExpeditionList ( idList : IList<Integer> = nil ) : IDictionary<String, Integer>; /// <summary> /// Gets subject list (by expedition identifiers list) /// </summary> /// <param name="idList">Expedition identifiers list</param> /// <returns>Items</returns> function GetSubjectList ( idList : IList<Integer> = nil ) : IDictionary<String, Integer>; /// <summary> /// Gets wellbore list (by expedition and subject identifiers lists) /// </summary> /// <param name="expeditionIdList">Expedition identifiers list</param> /// <param name="subjectIdList">Subject identifiers list</param> /// <returns>Items</returns> function GetWellboreList ( expeditionIdList : IList<Integer> = nil; subjectIdList : IList<Integer> = nil ) : IDictionary<String, Integer>; {$ENDREGION} public {$REGION 'Methods'} /// <summary> /// Gets criteria list /// </summary> /// <returns>Criteria list</returns> function GetCriteriaList () : IDictionary<String, Integer>; /// <summary> /// Gets direction based on criteria /// </summary> /// <param name="criteria">Criteria</param> /// <returns>Direction</returns> function GetDirection ( criteria : Integer ) : Integer; /// <summary> /// Gets items for particular search criteria /// </summary> /// <param name="criteria">Criteria</param> /// <returns>Items</returns> function GetItems ( criteria : Integer ) : IDictionary<String, Integer>; overload; /// <summary> /// Gets items for particular search criteria and identifiers list /// </summary> /// <param name="criteria">Criteria</param> /// <param name="idList1">First identifiers list</param> /// <param name="idList2">Second identifiers list</param> /// <returns>Items</returns> function GetItems ( criteria : Integer; idList1 : IList<Integer>; idList2 : IList<Integer> ) : IDictionary<String, Integer>; overload; {$ENDREGION} {$REGION 'Constructors'} /// <summary> /// Creates instance with particular session /// </summary> /// <param name="session">Connection session</param> constructor Create ( session : TOraSession ); {$ENDREGION} {$REGION 'Properties'} /// <summary> /// Gets wells list /// </summary> property CriteriaList : IDictionary<String, Integer> read GetCriteriaList; {$ENDREGION} end; Метод GetItems: /// <summary> /// Gets items for particular search criteria /// </summary> /// <param name="criteria">Criteria</param> /// <returns>Items</returns> function TSearchVSPHelper.GetItems ( criteria : Integer ) : IDictionary<String, Integer>; var items : IDictionary<String, Integer>; begin items := TCollections.CreateDictionary<String, Integer>; case criteria of 1 : begin items := GetExpeditionList (); end; 2 : begin items := GetSubjectList (); end; 3 : begin items := GetWellboreList (); end; end; Result := items; end;
  5. Коллеги, не могу справиться вот с такой задачей. Есть модуль Search.pas. В нем объявлен процедурный тип: type TSearchFunction = function ( criteria : Integer ) : IDictionary<String, Integer> of object; Далее в этом же модуле есть класс формы и в нем есть переменная процедурного типа: type TfmSearch = class(TForm) lbCriteria: TLabel; btOk: TButton; .. public LeftFunction : TSearchFunction; В модуле SearchVSPHelper.pas есть класс и в нем функция: function TSearchVSPHelper.GetItems ( criteria : Integer ) : IDictionary<String, Integer>; var items : IDictionary<String, Integer>; begin items := TCollections.CreateDictionary<String, Integer>; Result := items; end; Есть третий модуль VSPList.pas. В нем при создании формы типа TfmSearch я пытаюсь присвоить ее переменной LeftFunction метод класса TSearchVSPHelper.GetItems: .. fmSearch.LeftFunction := searchHelper.GetItems; .. Однако при попытке компиляции получаю ошибку на этой строке: [dcc32 Error] VSPList.pas(261): E2035 Not enough actual parameters Если функцию GetItems перенести в класс формы, то все компилируется. В чем может быть проблема? Чего я не вижу? Спасибо.
  6. А постоянное - это обновление Delphi до XE7? Или остается надежда на hotfix для XE5?
  7. Выпускали патч для iOS 7. Я его ставил, все работало без проблем. Для iOS 8 патчей не было. Надеюсь, что еще будут.
  8. Здравствуйте. Недавно обновил XCode до последней версии и обнаружил, что приложение, разработанное на Delphi XE5 уже не хочет запускаться на iOS-устройствах. Учитывая, что для XE5 уже давно не выходило hotfix'ов, я так понимаю поддержку iOS 8 для XE5 никто продолжать (или начинать) не собирается. Получается, что мне нужно обновить Delphi до XE7? И вообще быть готовым раз в год обновлять Delphi (вместе с выходом новой iOS)? Или все таки можно как-то запускать приложения XE5 на iOS 8?
  9. Иногда бывает так, что при отладке все breakpoints становятся зелеными, и где бы ты их не поставил, они всегда игнорируются. Лечится следующим образом: В дереве проектов жамкаем правой кнопкой мыши и выбираем пункт "Clean" или "Clean All". Далее пересобираем проект, делая "Build" (Shift+F9). Запускаем. Все работает. Как воспроизвести такое странное поведение IDE - не знаю, самому интересно. Случается периодически, но не часто.
  10. Вопрос касался вообще технологии разработки мультиязычных приложений. Меня интересовало в частности стоит ли разрабатывать две и более (для каждого маркета) версий одной и той же программы или можно все сделать в одной. По сути вариант с локализацией и есть решение проблемы если создавать одно приложение.
  11. Попытаюсь сам и ответить. Вдруг кому пригодится. Я сделал следующим образом. Создал одно приложение. Все визуальные тексты (надписи на кнопках, списках и т.д.) вынес в отдельный файл, воспользовавшись resourcestring. Сделал два аналога строк (русский и английский варианты). Данные в БД тоже продублировал на двух языках. При запуске приложения проверяю локаль, установленную на устройстве способом, вежливо подсказанным Ярославом http://fire-monkey.ru/topic/359-kak-opredelit-lokal-ustanovlennuiu-na-ustroi/, и просто подгружаю тот или иной вариант перевода строк. Вариант меня вполне устроил.
  12. Большое спасибо, Ярослав! То, что нужно. Воспользовался кроссплатформенным сервисом FM, так как приложение тоже кроссплатформенное.
  13. Здравствуйте. Разработка на Delphi XE5. Как программно определить локаль, установленную на устройстве под управлением iOS? В Objective C это делается так: NSString *currentLanguage = [[NSLocale preferredLanguages] objectAtIndex:0]; Есть что-то подобное в Delphi? Спасибо.
  14. Коллеги, приветствую. Хочу поделиться успешным опытом подключения аппарата HTC Desire C к Delphi XE5. Никаких сложностей с подключением не возникло. Скачал с официального сайта HTC программу HTC Sync http://www.htc.com/ru/support/content.aspx?id=6301. В ее состав входят и драйверы. После установки саму программу HTC Sync снес, она мне как таковая не нужна. Смартфон автоматически появился в дереве target-устройств проекта. Выходные данные: Смартфон: HTC Desire C ОС смартфона: Android 4.0.3 ОС среды Delphi: Windows XP Версия Delphi: XE5 UPD. Небольшая поправка для пользователей Windows 7. Почему-то, по-умолчанию, драйверы на эту ОС ставятся некорректно и устройство помечается как "Драйверы не установлены". Достаточно запустить процедуру обновления драйверов и руками указать путь к ним. Драйверы лежат в папке "C:\Program Files\HTC\HTC Driver\Driver Files\Win7_x86\" после установки вышеописанной программы.
  15. Ярослав, есть ли у вас мнения на этот счет? Почему не отключается регистрозависимость?
  16. Здравствуйте. Разрабатываю проект под iOS на Delphi XE5. В любом нативном приложении для iOS любой список можно прокрутить в начало тапнув по системным часам. Как добиться такого же эффекта в Delphi для TListBox? Спасибо.
  17. Здравствуйте. У меня Delphi XE5, разрабатываю проект под iOS. И почему-то поиск чувствителен к регистру. Вот скриншоты:
  18. Здравствуйте. Разрабатываю приложение, которую собираюсь переводить на английский язык. Хочу понять, стоит создавать 2 варианта одного и того же приложения для русского и остальных маркетов, каждый с адаптированным названием, ключевыми словами и описанием, или есть возможность сделать это более универсальным способом — чтобы для каждого маркета были вшиты свои параметры? Спасибо.
  19. Ярослав, на чистом проекте все оказалось нормально. Клавиатура появляется. Но вот в рабочем проекте у меня все не так. Я создаю TEdit динамически и назначаю ему клавиатуру тоже динамически. if not Assigned ( edit ) then begin edit := TEdit.Create ( self ); edit.Parent := vsxExpensesEditor; edit.Position.X := 16; edit.Position.Y := editY; edit.Width := 280; edit.Height := 31; edit.Name := componentName; edit.KeyboardType := TVirtualKeyboardType.vktNumbersAndPunctuation; end; В итоге показывается стандартная клавиатура. И еще вопрос в догонку. Можно ли как-то переопределить клавиатуру? Мне необходимо вводить в TEdit только дробные числа (цифры и точка).
  20. Сам же нашел ответ. В мануале меленько-меленько написано Вот здесь: http://docwiki.embarcadero.com/Libraries/XE5/en/Talk:FMX.ListView.TListViewItem.Accessory
  21. Здравствуйте. Можно ли у TListViewItem при добавлении его в TListView установить свойство Accessory в None? По-умолчанию, можно установить только More, Checkmark или Detail. У компонента TListView реализован механизм Swipe-to-Delete и это очень удобно при работе со списками. Но вот дополнительный контрол справа совсем не нужен. У TListBox можно поставить None, но у него нет Swipe-to-Delete. Спасибо.
  22. Здравствуйте. Как отключить регистрозависимость при использовании поиска через TSearchBox у TListBox? А если этого сделать нельзя, то как переопределить событие поиска? Спасибо.
  23. Да, конечно. Сейчас под рукой нет, выложу позже.
×
×
  • Создать...