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

Лидеры

  1. Равиль Зарипов (ZuBy)

    Равиль Зарипов (ZuBy)

    Модераторы


    • Баллы

      5

    • Постов

      2 517


  2. SergeyIT

    SergeyIT

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


    • Баллы

      4

    • Постов

      32


  3. Rusland

    Rusland

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


    • Баллы

      2

    • Постов

      1 204


  4. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      2

    • Постов

      2 124


Популярный контент

Показан контент с высокой репутацией 09.02.2016 во всех областях

  1. с использованием анонимных функции жить стало легче, как по мне. я их использую не только в потоках, а как отложенное действие.. Приведу пример: Есть форма в которой выбираются некие данные, допустим местоположение. Эта форма вызывается из нескольких мест, т.е. результат выбора пользователя отправляется всегда в разные формы и в визуальные компоненты. Как я делал это раньше: Заводил некую глобальную переменную и по ней смотрел кто вызвал и куда отправить myVar := 'form1'; // для примера if myVar = 'form1' then form1.lbLocation.Text := myLocation // (допустим тут хранится выбранные данные пользователя ) else и т.д. Как теперь: Переопределяю метод формы Show с параметром aProc: TThreadProcedure procedure Show(aProc: TThreadProcedure); overload; создаю переменку FProcedure:TThreadProcedure в privat секции В методе Show присваиваю FProcedure:= aProc; Show; // обычный метод формы При выборе пользователем местоположения, выполняется вот такой код FProcedure;// наша отложенная процедура Close; // закрываем форму и задаю при показе формы процедуру которая должна выполнится при выборе местоположения 1 вариант myLocationForm.Show(procedure begin Form1.lbLocation.Text := myLocation end); 2 вариант myLocationForm.Show(procedure begin ShowMesage(myLocation); end); Некая свобода действий всегда хорошо, и довольно просто в реализации
    2 балла
  2. Простите, а зачем? Вот лежит у меня в кармане телефон. Тихо, спокойно лежит. И тут какое-то приложение решает, что нужно разблокировать экран и что-то показать. Во-первых, легко могут пойти несанкционированные нажатия (мотыляется телефон во внутреннем кармане куртки, фиг знает как сенсор экрана будет реагировать), а во-вторых включается экран и начинает усиленно садиться батарейка. Вопрос: на... в смысле, зачем я буду держать на своем устройстве такое приложение? "Правильные" приложения показывают уведомление в "шторке", сопровождаемое звуковым сигналом. Услышал пользователь - сам разблокировал экран и пошел разбираться. Не услышал - значит чем-то занят, нечего его беспокоить.
    2 балла
  3. SergeyIT

    RAD 11 на подходе?

    Про условия DreamSpark не знаю. Но тесты - это дикость, ИМХО. Главное, идея - доступность для масс. Вот просто не могу представить случая, когда ты заработал кучу денег на инструменте и не начал оплачивать - то есть поддерживать этот инструмент. Но стартапам выложить такую сумму, начиная с нуля сложно. Да, Вы правы, тьфу-тьфу-тьфу. С дженериками, лямбдами, интерфейсами, словарями... и "Еду на всем" - это МОНСТР!
    2 балла
  4. Gingercat

    RAD 11 на подходе?

    "Но вот взять Microsoft, было и хорошее... " Оффтоп, но все же: под новый год письмо пришло - теперь INTUIT.RU снова предлагает доступ к регистрации DreamSpark, после прохождения теста, да еще и в придачу бесплатная регистрация разработчика в в магазине Windows. Так что... но мы не променяем бесплатные плюшки на привычную среду
    2 балла
  5. Нашел решение в другой теме. http://fire-monkey.ru/topic/504-neskolko-okon-prilozheniia-v-paneli-zadach/
    2 балла
  6. http://community.embarcadero.com/article/news/16211-embarcadero-rad-studio-2016-product-approach-and-roadmap-2
    2 балла
  7. Привет Всем! Решил поделится впечатлениями по работе с SuperObject'ом и родным JSON'ом тест был файла с 2000+ объектами в JSON файле структура файла была такая { "status":"OK", "last_id":"711", "objects":[ { "obj_id":"1", "obj_acc_id":"1", "obj_cat_id":"24", "obj_title":"13 магистраль", "obj_descr":"ЖК представляет собой комфортный дом, состоящий из 14 блок-секций (подъездов). Расположен в перспективном развивающемся районе по 13 Магистрали с удобным выездом как на левый берег, так и в старую часть города. Вблизи Жилого комплекса распологается новая школа, парк отдыха и культуры.", "obj_address":"ул. Мамышулы - 104, д. 16\/1", "obj_address2":null, "obj_url":"3fa07dd73be072b049529c80c7d74732", "obj_planet":"1", "obj_country":"1", "obj_region":"1", "obj_city":"292", "obj_lat":"51.141", "obj_lon":"71.4835", "obj_insert_dt":null, "obj_update_dt":null, "obj_editted":"0", "obj_updated":"0", "obj_deleted":"0", "obj_showed":"1", "obj_rating":"0", "obj_pro_top":"0", "obj_pro_selected":"0", "obj_pro_unix_dt":"0", "obj_partner":"0", "obj_parent_id":"0", "obj_has_child":"0", "obj_currency":"0" }, // тут далее 2000+ объектов ] } SuperObject Время выполнения: ~01:393 JSON родной Время выполнения: ~01:690 разница не особо ощутима, тем более если будет меньше объектов JSON родной function JSONParse(const aJSONData: string; const aMemo: TMemo): boolean; var aJSValue: TJSONValue; aJSObject, aJSObjArr: TJSONObject; aJSArray: TJSONArray; I: integer; begin Result := false; aJSValue := TJSONObject.ParseJSONValue(aJSONData) as TJSONValue; if Assigned(aJSValue) then begin aJSObject := aJSValue as TJSONObject; aMemo.Lines.Add('status: ' + aJSObject.GetValue('status').Value); if aJSObject.GetValue('status').Value = 'OK' then begin Result := true; if Assigned(aJSObject) then begin aJSArray := aJSObject.GetValue('objects') as TJSONArray; if Assigned(aJSArray) then begin Result := true; aMemo.Lines.Add('last_id: ' + aJSObject.GetValue('last_id').Value); aMemo.Lines.Add('count: ' + aJSArray.Count.ToString); for I := 0 to aJSArray.Count - 1 do begin aJSObjArr := aJSArray.Items[I] as TJSONObject; if Assigned(aJSObjArr) then begin aMemo.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' + aJSObjArr.GetValue('obj_cat_id').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_title').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_descr').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_address').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_url').Value); end; end; end; end; end; aJSValue.Free; end; end; SuperObject function JSONSOParse(const aJSONData: string; const aMemo: TMemo): boolean; var xObject: ISuperObject; xCount, I: integer; sfmt: string; begin Result := false; xObject := SO(aJSONData); aMemo.Lines.Add('status: ' + xObject['status'].AsString); if xObject['status'].AsString = 'OK' then begin Result := true; xCount := xObject['objects'].AsArray.Length; aMemo.Lines.Add('count: ' + xCount.ToString); aMemo.Lines.Add('last_id: ' + xObject['last_id'].AsInteger.ToString); for I := 0 to xCount - 1 do begin aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_acc_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_cat_id"'].AsInteger.ToString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_title"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_descr"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_address"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_url"'].AsString); end; end; end; Разница ощутима когда пишешь код, SO намного легче читать Подробней почитать и скачать SO
    1 балл
  8. ophion

    Диалоговое окно MessageBox на Android

    Используйте MessageDlg. На андроиде немного инная реализация, требующая добавления асинхронной процедуры обрабоки результатов, полученных от MessageDlg. Будет что-то вроде: MessageDlg('Удалить выбранный файл?', TMsgDlgType.mtConfirmation, mbYesNo, 0, procedure (const AResult: TModalResult) begin if (AResult=mrYes) then begin {тут обрабатываете результат нажатия кнопки "Yes"} end; end);
    1 балл
  9. Alexander

    GPS

    Нет возможности проверить, Tlocationsensor.Sensor.SensorType возможно, там либо устанавливается тип сенсора или приходит "тип" координат
    1 балл
  10. http://blogs.embarcadero.com/roschinspb/2015/03/03/timagelistxe8ru/
    1 балл
  11. SergeyIT

    RAD 11 на подходе?

    Поддерживаю фиксы, очень важное дело. И еще хотелось бы, чтобы файловую систему проекта в течение работы в RAD эмулировали (как в Visual Studio), а уж в некоторое время снимали с нее копию для физического хранения. Конечно, я новичок, но операции переименования - первое, что обескураживает. И почему то экран в RAD медленно обновляется после старт-стоп дебаг. При 5-6 проектах маленьких в группе.
    1 балл
  12. Rusland

    RAD 11 на подходе?

    Это самое главное
    1 балл
  13. Alexander

    Изменение курсора мыши, Windows

    всё правильно, вы в обработчике компонента присваиваете курсор не компоненту, а форме. Хотите, чтоб и над компонентом был такой курсор, так и ему присвойте. Проверил у себя, данный код работает procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin if Rectangle1.Cursor = crHourGlass then Form1.Cursor := crSQLWait else Form1.Cursor := crSizeNWSE; end; procedure TForm1.Rectangle1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin Form1.Cursor := crSizeAll; Rectangle1.Cursor := crHourGlass; end;
    1 балл
  14. В демонстрационных проектах есть пример работы с ImageList, где так-же в Run time добавляются новые изображения.. Найти его можно тут С:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ImageList (есть вероятность, что у вас необходимо немного изменить путь, в зависимости от расположения папки "Users" или "Пользователи", а так-же заменить 17.0 на вашу версию). Надеюсь это вам поможет.
    1 балл
  15. Как то так Left := screen.Displays[1].BoundsRect.Left;
    1 балл
  16. А если так? MessageDlg(L"русский текст",... void __fastcall TForm1::Button1Click(TObject *Sender) { MessageDlg(L"русский текст", TMsgDlgType::mtWarning, TMsgDlgButtons() << TMsgDlgBtn::mbOK, 0, 0); }
    1 балл
  17. Тема оказалась настолько интересна что занялся ей подробней. Мы с zairkz убили много времени, чтобы понять как выкрасить в один цвет без полупрозрачности, взяв скриншот и фотошоп определили, что затемнение происходит на 40% Решение родилось само собой, затемнить цвет ToolBar'a на 40% и цвет выровняется. Казалось бы можно осветлить цвет для подложки и цвет тоже выровнится, но например белый или светлые цвета нельзя еще осветлить. также написал процедуру для определения высоты статус бара и панели навигации procedure androidGetBounds(out statusBar, navigationBar: Integer); {$IFDEF ANDROID} var KeyCharacterMap: JKeyCharacterMap; resourceID: Integer; ScreenService: IFMXScreenService; sScale: Single; {$ENDIF} begin navigationBar := 0; statusBar := 0; {$IFDEF ANDROID} if TOSVersion.Check(5, 0) then // вроде только работает с 5.0 ниже нет устройства проверить begin sScale := 1; if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then sScale := ScreenService.GetScreenScale; //получаем скейл resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('status_bar_height'), StringToJString('dimen'), StringToJString('android')); if resourceID > 0 then statusBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale); if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then // проверка на существование наэкранных кнопок или физических begin resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'), StringToJString('dimen'), StringToJString('android')); if resourceID > 0 then navigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale); end; end; {$ENDIF} end; и в модуле FMX.Platform.Android нужно изменения внести (если вы используете измененный модуль для Intel'а) // Fix by Flying Wang & CallInUIThread( procedure begin if (not PlatformAndroid.GetFullScreen(nil)) and (SharedActivity.getWindow.getAttributes.Flags and TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN <> TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN) and (SharedActivity.getWindow.getAttributes.Flags and TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS <> TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS) // fix by ZuBy ... SystemBar.zip
    1 балл
  18. SergeyIT

    RAD 11 на подходе?

    Вы меня простите, Господа. Но позвольте высказать мнение человека нового в Object Pascal, из .NET пришедшего. Тьфу-тьфу, дай им всем Бог в Embarcadero доброго здоровья и процветания. Оглянитесь вокруг, ничего ж и близкого нет, даже отдаленно напоминающего того, к чему пришли в Embarcadero за последние годы с кроссплатформенностью! Уму не постижимо. Взять Java (хоть к теме напрямую не относится) - на Android идет сырец-порт JavaFX, сервисы и плюшки - за деньги в частном порядке. Xamarin видели? Хотите поднять настроение - погуглите. Выглядит это так: MAMA MILA RAMU... С# по Java (что-то дико нелепое). Если человек знает что такое Activity, зачем ему C#? Или Java менее элегантней (учитывая полное родство). MONO - мычание из преисподней, GUI нет фактически. Да вот возьмите хотя бы Unity 3D. Как-то на конференции человек оттуда проговорился: Вы ведь не знаете - мы 90% времени правим баги платформозависимые, чтобы у Вас почти все работало. У Microsoft судороги предсмертные в части всего, что не Windows 10. Почитать куда их бросает каждый месяц - жуть. Кто-то испрашивал по поводу поддержки Windows Phone в одном из топиков. Да даже если бы технически это было возможно, то они ж меняют API каждые полгода на него: то Windows Phone Silverlight, то HTML5, то DirectX C++ (взамен XNA Windows Phone 7)... Поддержка разработчиков ушла в StackOverflow, MSDN скоро рекламу начнет размещать о таблетках для мужчин. Ну, кто еще остался? Qt? Это не моя тема. Мне трудно думать про указатели, когда надо думать про логику. Увы, не дано... Не владею темой. Так что пока нас не слишком много в сравнении с Китаем, есть шанс, что быстро ответят на заданный вопрос... Скоро эта халява закончится...
    1 балл
  19. Для ищущих ответа: Есть стандартное demo Object Pascal\Mobile Snippets\AndroidIntents\AndroidIntentsGroup.groupproj, в котором показано как из одного приложения передавать данные другому. С помощью этого примера удалось передавать данные из сервиса в основное приложение. В юните основного приложения пишем: uses FMX.Platform, FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.Helpers, System.Messaging, Androidapi.JNI.GraphicsContentViewText; private { Private declarations } function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function HandleIntentAction(const Data: JIntent): Boolean; procedure TForm1.FormCreate(Sender: TObject); var AppEventService: IFMXApplicationEventService; begin ... if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, AppEventService) then AppEventService.SetApplicationEventHandler(HandleAppEvent); // Register the type of intent action that we want to be able to receive. // Note: A corresponding <action> tag must also exist in the <intent-filter> section of AndroidManifest.template.xml. MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW); TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleActivityMessage); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageReceivedNotification then HandleIntentAction(TMessageReceivedNotification(M).Value); end; function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var StartupIntent: JIntent; begin Result := False; if AAppEvent = TApplicationEvent.BecameActive then begin StartupIntent := MainActivity.getIntent; if StartupIntent <> nil then HandleIntentAction(StartupIntent); end; end; function TForm1.HandleIntentAction(const Data: JIntent): Boolean; var Extras: JBundle; begin Result := False; if Data <> nil then begin Memo1.ClearContent; // записываем в Memo пришедшее сообщение Extras := Data.getExtras; if Extras <> nil then Memo1.Text := JStringToString(Extras.getString(TJIntent.JavaClass.EXTRA_TEXT)); Invalidate; end; end; в AndroidManifest.template.xml добавляем <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="text/pas" /> Отправка сообщения из сервиса делается так: SendTextViaIntent('Hello from service'); procedure TAndroidServiceDM.SendTextViaIntent(const AText: string); var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setType(StringToJString('text/pas')); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); // добавил такой флаг, без него сервис затыкался Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AText)); if TJContextWrapper.Wrap(System.JavaContext).getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then TJContextWrapper.Wrap(System.JavaContext).startActivity(Intent); // заменил MainActivity на TJContextWrapper.Wrap(System.JavaContext), т.к. это сервис end; Работает исправно, хоть 100%-ую правильность кода не гарантирую Но как передать сообщение из основной программы обратно в сервис я пока не знаю. Также делать хендл внутри сервиса? Попытался просто добавить FMX.Platform, в результате получаю ошибку в FMX.Platform.Android вываливается ошибка об использовании Activity внутри сервиса.
    1 балл
  20. krapotkin

    SuperObject vs JSON

    работать с XSO гораздо удобнее, а уж читать код - вдвойне и там разные штуки типа фильтров встроены а еще при сериализации например в этом случае, XSO хорошо и удобно работает с TObjectList, а System.JSON - нет и атрибуты при сериализации - крайне удобная вещь и то, что EMRO никогда не переплюнет автор исправляет замечания прямо за пару дней )))
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...