-
Постов
55 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Весь контент Aptem
-
Здравствуйте. Это класс фреймворка 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;
-
Коллеги, не могу разобраться с освобождением памяти объектов интерфейсного типа. Вот есть у меня переменная: 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 (); Но это не помогает. Как правильно освободить память?
-
Здравствуйте, Ярослав. Проблему временно решил с помощью ссылок на функцию. То есть вместо процедурного типа использовал ссылку: 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;
-
Процедурный тип. Не могу присовить значение.
Aptem опубликовал вопрос в Вопросы по языку Object Pascal и RTL
Коллеги, не могу справиться вот с такой задачей. Есть модуль 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 перенести в класс формы, то все компилируется. В чем может быть проблема? Чего я не вижу? Спасибо. -
А постоянное - это обновление Delphi до XE7? Или остается надежда на hotfix для XE5?
-
Выпускали патч для iOS 7. Я его ставил, все работало без проблем. Для iOS 8 патчей не было. Надеюсь, что еще будут.
-
Здравствуйте. Недавно обновил XCode до последней версии и обнаружил, что приложение, разработанное на Delphi XE5 уже не хочет запускаться на iOS-устройствах. Учитывая, что для XE5 уже давно не выходило hotfix'ов, я так понимаю поддержку iOS 8 для XE5 никто продолжать (или начинать) не собирается. Получается, что мне нужно обновить Delphi до XE7? И вообще быть готовым раз в год обновлять Delphi (вместе с выходом новой iOS)? Или все таки можно как-то запускать приложения XE5 на iOS 8?
-
Иногда бывает так, что при отладке все breakpoints становятся зелеными, и где бы ты их не поставил, они всегда игнорируются. Лечится следующим образом: В дереве проектов жамкаем правой кнопкой мыши и выбираем пункт "Clean" или "Clean All". Далее пересобираем проект, делая "Build" (Shift+F9). Запускаем. Все работает. Как воспроизвести такое странное поведение IDE - не знаю, самому интересно. Случается периодически, но не часто.
-
Вопрос касался вообще технологии разработки мультиязычных приложений. Меня интересовало в частности стоит ли разрабатывать две и более (для каждого маркета) версий одной и той же программы или можно все сделать в одной. По сути вариант с локализацией и есть решение проблемы если создавать одно приложение.
-
Попытаюсь сам и ответить. Вдруг кому пригодится. Я сделал следующим образом. Создал одно приложение. Все визуальные тексты (надписи на кнопках, списках и т.д.) вынес в отдельный файл, воспользовавшись resourcestring. Сделал два аналога строк (русский и английский варианты). Данные в БД тоже продублировал на двух языках. При запуске приложения проверяю локаль, установленную на устройстве способом, вежливо подсказанным Ярославом http://fire-monkey.ru/topic/359-kak-opredelit-lokal-ustanovlennuiu-na-ustroi/, и просто подгружаю тот или иной вариант перевода строк. Вариант меня вполне устроил.
-
Большое спасибо, Ярослав! То, что нужно. Воспользовался кроссплатформенным сервисом FM, так как приложение тоже кроссплатформенное.
- 3 ответа
-
- NSString
- prefferedLanguages
- (и ещё 3 )
-
Здравствуйте. Разработка на Delphi XE5. Как программно определить локаль, установленную на устройстве под управлением iOS? В Objective C это делается так: NSString *currentLanguage = [[NSLocale preferredLanguages] objectAtIndex:0]; Есть что-то подобное в Delphi? Спасибо.
- 3 ответа
-
- NSString
- prefferedLanguages
- (и ещё 3 )
-
Коллеги, приветствую. Хочу поделиться успешным опытом подключения аппарата 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\" после установки вышеописанной программы.
-
Ярослав, есть ли у вас мнения на этот счет? Почему не отключается регистрозависимость?
- 4 ответа
-
- ISearchResponder
- SetFilterPredicate
-
(и ещё 1 )
C тегом:
-
Здравствуйте. Разрабатываю проект под iOS на Delphi XE5. В любом нативном приложении для iOS любой список можно прокрутить в начало тапнув по системным часам. Как добиться такого же эффекта в Delphi для TListBox? Спасибо.
-
Здравствуйте. У меня Delphi XE5, разрабатываю проект под iOS. И почему-то поиск чувствителен к регистру. Вот скриншоты:
- 4 ответа
-
- ISearchResponder
- SetFilterPredicate
-
(и ещё 1 )
C тегом:
-
Здравствуйте. Разрабатываю приложение, которую собираюсь переводить на английский язык. Хочу понять, стоит создавать 2 варианта одного и того же приложения для русского и остальных маркетов, каждый с адаптированным названием, ключевыми словами и описанием, или есть возможность сделать это более универсальным способом — чтобы для каждого маркета были вшиты свои параметры? Спасибо.
-
Ярослав, на чистом проекте все оказалось нормально. Клавиатура появляется. Но вот в рабочем проекте у меня все не так. Я создаю 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 только дробные числа (цифры и точка).
-
Сам же нашел ответ. В мануале меленько-меленько написано Вот здесь: http://docwiki.embarcadero.com/Libraries/XE5/en/Talk:FMX.ListView.TListViewItem.Accessory
- 2 ответа
-
- TListView
- TListViewItem
-
(и ещё 1 )
C тегом:
-
Здравствуйте. Можно ли у TListViewItem при добавлении его в TListView установить свойство Accessory в None? По-умолчанию, можно установить только More, Checkmark или Detail. У компонента TListView реализован механизм Swipe-to-Delete и это очень удобно при работе со списками. Но вот дополнительный контрол справа совсем не нужен. У TListBox можно поставить None, но у него нет Swipe-to-Delete. Спасибо.
- 2 ответа
-
- TListView
- TListViewItem
-
(и ещё 1 )
C тегом:
-
Здравствуйте. Как отключить регистрозависимость при использовании поиска через TSearchBox у TListBox? А если этого сделать нельзя, то как переопределить событие поиска? Спасибо.
- 4 ответа
-
- ISearchResponder
- SetFilterPredicate
-
(и ещё 1 )
C тегом:
-
Да, конечно. Сейчас под рукой нет, выложу позже.