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

Лидеры

  1. Brovin Yaroslav

    Brovin Yaroslav

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


    • Баллы

      3

    • Постов

      2 124


  2. xenon54

    xenon54

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


    • Баллы

      2

    • Постов

      385


  3. brunnengi

    brunnengi

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


    • Баллы

      1

    • Постов

      293


  4. ruslan

    ruslan

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


    • Баллы

      1

    • Постов

      160


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

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

  1. Походу триал-версия прав на баг-репорт не дает. Я прав? Эта правильная информация.
    2 балла
  2. Отправка: var len : integer; begin Context.Connection.IOHandler.WriteBufferOpen; Context.Connection.IOHandler.Write(len); Context.Connection.IOHandler.WriteFile(AFileName); Context.Connection.IOHandler.WriteBufferFlush; Context.Connection.IOHandler.WriteBufferClose; Прием ( Тут на клиентской стороне должен быть метод, который по таймеру смотрит есть ли данные на входном буффере ): var sz : integer; FS : TMemoryStream; begin if FIdTCPClient.IOHandler.InputBufferIsEmpty then exit; sz := FIdTCPClient.IOHandler.InputBuffer.Size; if sz <= 0 then exit; FS := TMemoryStream.Create; FIdTCPClient.IOHandler.ReadStream(FS,sz);
    1 балл
  3. Для получения «content» я сделал так var Intent: JIntent; Uri: Jnet_Uri; INStream: JInputStream; OUTStream: JOutputStream; outputfile: string; FFF: JFile; NumRead, NumWritten: Longint; Buffer: TJavaArray<Byte>; begin ... Intent := SharedActivity.getIntent; if (Pos('image/', JStringToString(Intent.getType))>0) or (Pos('audio/', JStringToString(Intent.getType))>0) or (Pos('video/', JStringToString(Intent.getType))>0) or (Pos('application/', JStringToString(Intent.getType))>0) or ('*/*' = JStringToString(Intent.getType)) then begin if JStringToString(Intent.getType) <> '' then begin Parcel := Intent.getParcelableExtra(TJIntent.JavaClass.EXTRA_STREAM); Uri := TJnet_Uri.Wrap(Parcel); if JStringToString(Uri.getScheme) = 'content' then begin if Pos('/mpeg', JStringToString(Intent.getType)) > 0 then outputfile := 'my.mp3' else if Pos('/jpeg', JStringToString(Intent.getType)) > 0 then outputfile := 'my.jpg' else outputfile := 'my.' + copy(JStringToString(Intent.getType), Pos('/', JStringToString(Intent.getType))+1, Length(JStringToString(Intent.getType)));//выдергиваем имя типа для того чтобы сделать его расширением //на случай если в Intent не уточнен тип, а указана *, например image/* if Pos('.*', outputfile) > 0 then outputfile := StringReplace(outputfile, '.*', '.tmp', [rfReplaceAll]); Buffer := TJavaArray<Byte>.Create(4096); INStream := SharedActivityContext.getContentResolver.openInputStream(Uri); try FFF := TJFile.JavaClass.init(StringToJString(<ИМЯ_ПАПКИ>), StringToJString(outputfile)); FFF.setWritable(true, false); OUTStream := TJFileOutputStream.JavaClass.init(FFF); repeat NumRead := inStream.read(buffer); if (NumRead <= 0) then Break; outStream.write(buffer, 0, NumRead); application.ProcessMessages; until NumRead <= 0; outStream.close; inStream.close; except on e: exception do raise Exception.CReate('Error. Can''t copy file'); end; end end end end может не самое оптимальное, но работает, в итоге у вас файл с именем outputfile и в папке <ИМЯ_ПАПКИ>
    1 балл
  4. Ну тут все просто. Remote Push Notification. Вот, хороший видос на эту тему для ведра тынц И сервис никакой не нужен. Для ведра это называется "Google Cloud Messaging"
    1 балл
  5. Регистрируем намерение через файл манифеста (ниже для файлов с типом xml). Для Android 3.2 адекватнее работал второй фильтр: <activity … <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="text/xml" /> <data android:mimeType="application/xhtml+xml" /> </intent-filter> <!-- Для 3.2 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="*/*" /> <data android:host="*" /> <data android:pathPattern=".*\\.xml" /> <data android:pathPattern=".*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.xml" /> </intent-filter> Регистрируем свой обработчик события для на событие смены состояния приложения: procedure TForm1.FormCreate(Sender: TObject); var ApplicationService: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, ApplicationService) then ApplicationService.SetApplicationEventHandler(ApplicationEventChanged); end; Оформляем обработчик. Получение файла можно перенести в Form1.onCreate, но я для экспериментов с activity делал тут: function TForm1.ApplicationEventChanged(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var intent : JIntent; fileFullPath : String; begin intent := SharedActivity.getIntent; // BecameActive if AAppEvent = TApplicationEvent.BecameActive then begin if Assigned(intent) and TJIntent.JavaClass.ACTION_VIEW.equals(intent.getAction) then begin fileFullPath := JStringToString(intent.getData.getPath); if FileExists(fileFullPath) then begin // обработка файла fileFullPath // ... end; end; end // завершаем Activity при переводе приложения в "Background" else if AAppEvent = TApplicationEvent.EnteredBackground then SharedActivity.finish; // Result := True; end; Хочу обратить внимание, что привел только сам принцип. Очень важно корректно завершить активность (при сворачивании приложения, отключении экрана и т.д. ), т.к. при повторном вызове активности будет вызываться последний из стека. И если его не закрывать будем получить предыдущий, не закрытый activity. А если за приложением зарегистрировано несколько Activity (приложение можно вызвать из ланчера или как в примере, для обработки файла по типу).... в общем тут есть с чем поиграться. Для желающих посмотреть поведение и последовательность выкладываю пример, который формирует лог обработки. Нужно закоментировать: else if AAppEvent = TApplicationEvent.EnteredBackground then SharedActivity.finish; И посмотреть что и когда приложение получает в SharedActivity и AAppEvent. Ссылка в тему: http://developer.android.com/guide/topics/manifest/activity-element.html# Что не получилось: 1) Некоторые программы отдают файл в схеме «content» (к примеру Gmail v5.1 отдает). Как в этом случае получить содержание файла не разобрался. Поэтому в фильтре ограничил вид контента "file" 2) Не смог добраться до стека Activity. Если приложение в памяти и повторно вызывается с новой activity - возможно вот тут это могло пригодиться. (activity ... android:launchMode="singleTop" в этом случае не помог). ADD: было обсуждение, кто как закрывает приложения на андроид, чтобы не оставалось в памяти. Если добавлять SharedActivity.finish приложение 100% убирается из памяти. Intent_Get-File.zip
    1 балл
  6. Добрый день, Руководство использования Конфигурация андроид приложения для работы с Google Maps Статья в блоге об использовании TMapView в iOS и Android приложения
    1 балл
  7. юзай Rest.Json. пишешь свой класс настроек, например: TSettings = class private fname: string; fpass : string; public property name: string read fname write fname; property pass: string read fass write fpass; end; // вытягиваешь json-строку из файла Settings:= TJson.JsonToObject<TSettings >( 'строка с json, которая из файла' ); // что-то поменял s:= TJson.ObjectToJsonString( Settings ); // сохранил json-строку в файл
    1 балл
  8. Пример по использованию JSON uses System.IOUtils, System.JSON; procedure TForm1.btLoadClick(Sender: TObject); var AOptions: TJSONObject; AGroup: TJSONObject; AParam: TJSONValue; begin if FileExists(FFileName) then begin AOptions := TJSONObject(TJSONObject.ParseJSONValue(TFile.ReadAllText(FFileName))); AGroup := TJSONObject(AOptions.GetValue('group1')); if AGroup <> nil then begin AParam := AGroup.GetValue('edit1'); if AParam <> nil then Edit1.Text := TJSONString(AParam).Value; AParam := AGroup.GetValue('edit2'); if AParam <> nil then Edit2.Text := TJSONNumber(AParam).Value; end; AGroup := TJSONObject(AOptions.GetValue('group2')); if AGroup <> nil then begin AParam := AGroup.GetValue('checkbox1'); if AParam <> nil then CheckBox1.IsChecked := AParam is TJSONTrue; end; end; end; procedure TForm1.btSaveClick(Sender: TObject); var AOptions: TJSONObject; AGroup: TJSONObject; AParam: TJSONValue; APair: TJSONPair; begin AOptions := TJSONObject.Create; AGroup := TJSONObject.Create; AGroup.AddPair('edit1', Edit1.Text); if Edit2.Text.Trim <> '' then AGroup.AddPair('edit2', TJSONNumber.Create(Edit2.Text)); AOptions.AddPair('group1', AGroup); AGroup := TJSONObject.Create; if CheckBox1.IsChecked then AGroup.AddPair('checkbox1', TJSONTrue.Create) else AGroup.AddPair('checkbox1', TJSONFalse.Create); AOptions.AddPair('group2', AGroup); TFile.WriteAllText(FFileName, AOptions.ToString); end; procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF ANDROID} //Если файл во внутреннем накопителе то GetDocumentsPath //Если файл на внешнем накопителе то GetSharedDocumentsPath FFileName := TPath.Combine(TPath.GetSharedDocumentsPath, 'Options.json'); {$ENDIF} {$IFDEF MSWINDOWS} FFileName := ExtractFilePath(ParamStr(0)) + 'Options.json'; {$ENDIF} end; Также почитай http://www.webdelphi.ru/2011/10/rabota-s-json-v-delphi-2010-xe2/ Primer.zip
    1 балл
  9. Между заставкой картинкой и показом моей программы проходит порядка 3 секунд и в этот момент чёрный экран. Картинка пропадает а форма еще не нарисована. Видно много компонентов накидал на табы поэтому долго грузится.
    1 балл
  10. Здравствуй. Увы, но сделать так, как ты хочешь, нельзя.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...