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

Rusland

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

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

  • Посещение

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

    26

Активность репутации

  1. Like
    Rusland отреагировална XXXXXX в Gif File   
    Здравствуйте. Есть один вариант с использованием TBitmapListAnimation:
    Кидаем обычный TImage на форму. Под TImage создаём TBitmapListAnimation.
    Структура должна выглядеть так:
    В свойствах TBitmapListAnimation: AnimationBitmap - загружаем ленту картинок. Например: Для коротких Gif -ок можно использовать онлайн конверторы:
    http://ezgif.com/split - разделение Gif на отдельные фреймы (картинки)
    http://www.photojoiner.net/merge-photos/editor/# - соединение нескольких картинок в одну (соединяет до 8 штук)
    AnimationCount - сколько раздельных картинок в нашей объеденённой по горизонтали (в нашем слечае 8) AnimationRowCount - сколько рядов в нашей картинке (в нашем случае 1) Enabled = True Duration - указываем промежуток времени, которое должна занимать гифка (в секундах). PropertyName - прописываем Bitmap  
  2. Like
    Rusland отреагировална rareMax в Отловить двойное нажатие кнопки Back...   
    Type TSomeClass = Class Private Class Var back_pressed:int64; public Procedure onBackPressed();Override; End; TSomeClass.onBackPressed(); Begin if (TSomeClass.back_pressed + 2000) > System.currentTimeMillis then Begin super.onBackPressed(); End else Begin Toast.makeText(getBaseContext(), 'Нажмите еще раз для выхода', Toast.LENGTH_SHORT).show(); End; TSomeClass.back_pressed := System.currentTimeMillis(); End; Ну если чисто синтаксически - то как то так
    -----------
    О, уже ответили, сорян, не видел
  3. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Отловить двойное нажатие кнопки Back...   
    что то типа
    глобальная back_pressed = 0; //uses DateUtils if (back_pressed + 2000) > MilliSecondOfTheDay(now) then Close else ShowMessage('Нажмите еще раз для выхода'); back_pressed := MilliSecondOfTheDay(now);  
  4. Like
    Rusland отреагировална sinuke в Учебное приложение "Слесарное дело"   
    Название: Слесарное дело
    Платформа: Android, Windows, macOS
    Устройство: ПК, смартфон, планшет
    Разрешение экрана: любое
    Ссылки на скачивание Windows-версии: https://yadi.sk/d/iIeC0OE8ukMoi
    Ссылка на скачивание macOS-версии: https://yadi.sk/d/wBpoFcKe3LgiKx
    Google Play: https://play.google.com/store/apps/details?id=com.sinukeapps.locksmithery
    Описание: Приложение представляет собой электронный конспект по слесарному делу, с помощью которого можно самостоятельно подготовится к занятиям. В него включены 16 тем, поделённые на блоки. Для каждой темы разработаны тесты для самоконтроля. В приложении имеется глоссарий для быстрого поиска по основным понятиям, а также возможность экспорта материалов в текстовый PDF-формат для дальнейшей печати.

  5. Like
    Rusland отреагировална Andrey Efimov в TEdit не понятное удаление последнего символа   
    Здравствуйте.
    Это баг, я сообщил о нём ещё в мае (RSP-14928 и RSP-14929), в тех. поддержке предложили временное решение (ответ ниже). (Тема В TEdit стирается предыдущий текст аналогичная).
    find FMX.Platform.Android.pas find procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); change code to: procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); var SelStart, SelEnd: Integer; begin if FCaretPosition <> Value then begin FCaretPosition := Value; CalculateSelectionBounds(SelStart, SelEnd); if (FTextView <> nil) and not FInternalUpdate then PlatformAndroid.SynchronizeOnUIThread( procedure begin //Fix By [龟山]Aone(1467948783) //https://quality.embarcadero.com/browse/RSP-14928 // if (SelEnd - SelStart) > 0 then // FTextView.setSelection(SelStart, SelEnd) // else FTextView.setCursorPosition(CaretPosition.X); end); end; end;  
     
  6. Like
    Rusland отреагировална rareMax в Акция: Delphi 10.1 Berlin Starter Named БЕСПЛАТНО   
    Пасаны - хватай ее: https://www.embarcadero.com/ru/products/delphi/starter/promotional-download
    В след за плюсами начали раздавать делфи стартер. Функционал урезан до жути, но возможно вам много и не нужно?
  7. Like
    Rusland отреагировална Error в SearchBox в ListView   
    По идее кромка принадлежит TEdit, попробуйте изменить стиль у TEdit на прозрачный (edit.StyleLookup = 'transparentedit')
  8. Like
    Rusland получил реакцию от enatechno в Стиль на разных версиях Windows   
    Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
  9. Like
    Rusland получил реакцию от sinuke в Стиль на разных версиях Windows   
    Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
  10. Like
    Rusland отреагировална POV в Пробежать по компонентам на Layout   
    А чем плох Align = Scale?
  11. Like
    Rusland отреагировална Камышев Александр в Пробежать по компонентам на Layout   
    Align = Scale - удачный выбор, в oldschool Delphi и CBuilder такого не было, в Anchors выставляли руками масштабирование.
    Кстати, если кнопки надо изменять только в ширину, то это в Anchors
  12. Like
    Rusland отреагировална POV в Пробежать по компонентам на Layout   
    Накидал компоненты на форму как тебе нравится и задал всем это свойство.
    При изменении размеров формы всё пропорционально масштабируется.
  13. Like
    Rusland отреагировална enatechno в Пробежать по компонентам на Layout   
    Родителем (Parent) является Layout. А Owner у Ваших контролов - форма. ComponentCount считается для Owner.
    Создавая кнопки в runtime можете задать:
    aButton := TButton.Create(Layout1); Layout1.Add(aButton); и тогда Layout1.ComponentCount уже не будет равно 0.

    Для перебора в Parent используйте ChildrenCount
     
    for i:=0 to Layout1.ChildrenCount-1 do begin if (Layout1.Children[i] is TButton) or (Layout1.Children[i] is TLabel) then if (TControl(Layout1.Children[i]).Visible) then TControl(Layout1.Children[i]).Width:=50; end;  
  14. Like
    Rusland отреагировална beklexx в Удаление записи из таблицы БД связанной с ListView   
    для заполнения листвью юзаю подобное решение
    procedure TFVisit.bListViewFill(LV: TListView; FDSource: TFDQuery; TextField, DetailField, TagField: string; IsClear: boolean); var i, index: integer; item: TListViewitem; begin if LV.Selected <> nil then index:= LV.Selected.Index else index:= -1; if FDSource.IsEmpty then begin // ShowMessage('Нет данных!'); LV.Items.Clear; exit; end; if IsClear then LV.Items.Clear; LV.BeginUpdate; try for i:= 1 to FDSource.RecordCount do begin FDSource.RecNo:= i; item:= LV.Items.Add; item.Text:= FDSource.FieldByName(TextField).AsString; item.Detail:= FDSource.FieldByName(DetailField).AsString; // item.Bitmap.Assign(...) item.Tag:= FDSource.FieldByName(TagField).AsInteger; end; finally LV.EndUpdate; end; if index = -1 then exit; if (LV.Items.Count >= index) then LV.ItemIndex:= index; end; ну и заполняю
    tbPriceList: TFDQuery; . . . tbPriceList.Open; //фильтрованный по необходимым условиям bListViewFill(ListView1, tbPriceList, 'Name', 'LCP_Qty', 'ProductId', True); tbPriceList.Close; Мне часто приходится работать с листвью где text, detail и tag... но иногда приходится юзать остальной функционал листвью: хидеры-шмидеры, имейджи и т.д. но это уже другой вопрос
  15. Like
    Rusland отреагировална zairkz в Не работает IFMXPhoneDialerService?   
    uses 
      Androidapi.Helpers,
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNI.App,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNIBridge,
      Androidapi.JNI.Provider;
     
  16. Like
    Rusland отреагировална zairkz в Не работает IFMXPhoneDialerService?   
    Вообщем так как андройд не поддерживает функцию определения соединения, сделал через журнал звонков
    В Андройде после звонка если было соединение, время звонка будет больше нуля.
    //PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;
    На Disconnected проверяю журнал звонков, так как бывает не успевает падать информация использую таймер с интервалом 1 секунда, ниже приведен код в нем или iOS соединения и все ок или андройд на дисконекте и пуск таймера.
    procedure TForm_Main.MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState); begin   case ACallState of     TCallState.Connected:       begin  {$IFDEF IOS} TThread.Synchronize(nil, ShowDialDialog); {$ENDIF}       end;     TCallState.Disconnected:       begin {$IFDEF ANDROID} TimerCallCheck.Enabled := true; {$ENDIF}         PhoneDialerService.OnCallStateChanged := nil;       end;   end; end; Пока не добавил такую архитектуру с ТТаском и Синхронизацией были иногда вылеты приложения
    procedure TForm_Main.TimerCallCheckTimer(Sender: TObject); begin   TimerCallCheck.Enabled := false;   TTask.Run(     procedure     var       Dur: Int64;     begin       Dur := CheckStat; //Функция проверки журнала       TThread.Synchronize(nil,         procedure         begin           if Dur = -1 then              TimerCallCheck.Enabled := true           else           begin             TimerCallCheck.Enabled := false;             if Dur > 0 then               ShowDialDialog; //Вызывается форма у меня в приложении           end;         end);     end); end;  
    function TForm_Main.CheckStat: Int64; var   cursor: JCursor;   Dtime, CallDuration: Int64;   JsortOrder, JSelection: String;   wJQueryParams: TJavaObjectArray<JString>; begin   Result := 0;   wJQueryParams := TJavaObjectArray<JString>.Create(4);   wJQueryParams[0] := TJCallLog_Calls.JavaClass.CACHED_NAME;   wJQueryParams[1] := TJCallLog_Calls.JavaClass.NUMBER;   wJQueryParams[2] := TJCallLog_Calls.JavaClass.DURATION;   wJQueryParams[3] := TJCallLog_Calls.JavaClass.DATE;   JsortOrder := 'date DESC LIMIT 1';   Dtime := (DateTimeToUnix(Now, true) - 360) * 1000;  //Последние пять минут   JSelection := 'number = "+77017017708" AND type = 2 AND date > ' + IntToStr(Dtime);   cursor := TAndroidHelper.Activity.getContentResolver.query(TJCallLog_Calls.JavaClass.CONTENT_URI, wJQueryParams,     StringToJString(JSelection), nil, StringToJString(JsortOrder));   if (cursor.getCount > 0) then   begin     while (cursor.moveToNext) do     begin       CallDuration := StrToInt64(JStringToString(cursor.getString(cursor.getColumnIndex(TJCallLog_Calls.JavaClass.DURATION))));       Result := CallDuration;     end;   end   else     Result := -1;   cursor.Close;   FreeAndNil(wJQueryParams); end;  
  17. Like
    Rusland отреагировална Камышев Александр в Failed to load libssl.so   
    По всему не установлены SDK Intel x86, соответственно проблема не в них. 
    Анекдот. При головных болях Врач пациенту: бросай курить, Пациент: я не курю, Врач: попробуй закурить.
    1. поискать libssl под х86,  пишут что они где-то уже есть в системе у GT.
    2. попробовать обновить библиотеки SDK для x86, т.е. если нельзя удалить х86 то надо их поставить
    применить метод научного тыка
  18. Like
    Rusland отреагировална enatechno в Создать в рантайме перетаскиваемый компонент   
    procedure TForm1.Label7Click(Sender: TObject); var Phase: TCalloutRectangle; begin Phase := crtPhase.Clone(ScrollBox1) as TCalloutRectangle; Phase.OnMouseDown := crtPhaseMouseDown; Phase.OnMouseMove := crtPhaseMouseMove; Phase.Parent := ScrollBox1; Phase.Position.X := crtPhase.Position.X + 10; Phase.Position.Y := crtPhase.Position.Y + 10; Phase.Visible := true; end; Замените у себя эту процедуру и удалите Button1 (как я и сказал выше, TButton не является TShape - поэтому и ошибка).
  19. Like
    Rusland отреагировална rareMax в Поиск утечек памяти   
    нет
     
  20. Like
    Rusland отреагировална RapsodRF в Утечка памяти при использовании эффекта   
    Найдено решение. Может кому-то пригодится.
    Вот тут представлены четыре разных алгоритма размытия http://blog.ivank.net/fastest-gaussian-blur.html
    Работает быстро и утечки теперь не наблюдается, то что и надо было сделать))
    Так что всем спасибо! 
    Пользуйтесь! ;-)
  21. Like
    Rusland получил реакцию от Kitty в Не работает IFMXPhoneDialerService?   
    В этой теме был пример 
  22. Like
    Rusland отреагировална AngryOwl в TSizeGrip компонент   
    type TForm2 = class(TForm) SizeGrip1: TSizeGrip; procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; private { Private declarations } public { Public declarations } end; ........... procedure TForm2.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin if AWidth > 800 then AWidth := 800; if AWidth < 300 then AWidth := 300; if AHeight > 600 then AHeight := 600; if AHeight < 200 then AHeight := 200; inherited SetBounds(ALeft, ATop, AWidth, AHeight); end; Пример проекта прилагаю
    SetBounds.zip
    P.S. И старайтесь пользоваться поиском. Здесь это уже обсуждалось.
  23. Like
    Rusland отреагировална beklexx в Удаление записи из таблицы БД связанной с ListView   
    попробуйте OnDeletingItem
    у меня к примеру такая конструкция норм работает: (правда Bind Visually не юзаю... а в таг каждого итема засовываю нужный ключ)
    procedure TFVisitPhotoComment.ListView1DeletingItem(Sender: TObject; AIndex: Integer; var ACanDelete: Boolean); begin ... ...'delete bla-bla-bla where Id = :Id'; ...ParamByName('Id').Value:= ListView1.items[AIndex].Tag; ... //не забываем ... ACanDelete := True; //ну или отмена удаления при необходимости ACanDelete := False; end;  
  24. Like
    Rusland отреагировална Камышев Александр в строка из массива шестнадцатиричных чисел   
    вот все злые, пристали к программеру, наговорили всякого,
    человек хочет тупо массив данных в HEX просматривать, что от него уходит...
    IntToHex используй, вот код на си:
    AnsiString s; for ( unsigned int i = 0; i < size; i++ ) s += IntToHex( ( (unsigned __int8)(data[i] ), 2 ) + " "; на выходе строка HEXов через пробел
  25. Like
    Rusland отреагировална MAD_EVAL в Скриншот   
    Есть метод. TControl.MakeScreenshot
×
×
  • Создать...