-
Постов
1 204 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Активность репутации
-
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
-
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; Ну если чисто синтаксически - то как то так
-----------
О, уже ответили, сорян, не видел
-
Rusland отреагировална Равиль Зарипов (ZuBy) в Отловить двойное нажатие кнопки Back...
что то типа
глобальная back_pressed = 0; //uses DateUtils if (back_pressed + 2000) > MilliSecondOfTheDay(now) then Close else ShowMessage('Нажмите еще раз для выхода'); back_pressed := MilliSecondOfTheDay(now);
-
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-формат для дальнейшей печати.
-
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;
-
Rusland отреагировална rareMax в Акция: Delphi 10.1 Berlin Starter Named БЕСПЛАТНО
Пасаны - хватай ее: https://www.embarcadero.com/ru/products/delphi/starter/promotional-download
В след за плюсами начали раздавать делфи стартер. Функционал урезан до жути, но возможно вам много и не нужно?
-
Rusland отреагировална Error в SearchBox в ListView
По идее кромка принадлежит TEdit, попробуйте изменить стиль у TEdit на прозрачный (edit.StyleLookup = 'transparentedit')
-
Rusland получил реакцию от enatechno в Стиль на разных версиях Windows
Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
-
Rusland получил реакцию от sinuke в Стиль на разных версиях Windows
Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
-
-
Rusland отреагировална Камышев Александр в Пробежать по компонентам на Layout
Align = Scale - удачный выбор, в oldschool Delphi и CBuilder такого не было, в Anchors выставляли руками масштабирование.
Кстати, если кнопки надо изменять только в ширину, то это в Anchors
-
Rusland отреагировална POV в Пробежать по компонентам на Layout
Накидал компоненты на форму как тебе нравится и задал всем это свойство.
При изменении размеров формы всё пропорционально масштабируется.
-
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;
-
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... но иногда приходится юзать остальной функционал листвью: хидеры-шмидеры, имейджи и т.д. но это уже другой вопрос
-
Rusland отреагировална zairkz в Не работает IFMXPhoneDialerService?
uses
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.App,
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge,
Androidapi.JNI.Provider;
-
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;
-
Rusland отреагировална Камышев Александр в Failed to load libssl.so
По всему не установлены SDK Intel x86, соответственно проблема не в них.
Анекдот. При головных болях Врач пациенту: бросай курить, Пациент: я не курю, Врач: попробуй закурить.
1. поискать libssl под х86, пишут что они где-то уже есть в системе у GT.
2. попробовать обновить библиотеки SDK для x86, т.е. если нельзя удалить х86 то надо их поставить
применить метод научного тыка
-
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 - поэтому и ошибка).
-
-
Rusland отреагировална RapsodRF в Утечка памяти при использовании эффекта
Найдено решение. Может кому-то пригодится.
Вот тут представлены четыре разных алгоритма размытия http://blog.ivank.net/fastest-gaussian-blur.html
Работает быстро и утечки теперь не наблюдается, то что и надо было сделать))
Так что всем спасибо!
Пользуйтесь! ;-)
-
-
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. И старайтесь пользоваться поиском. Здесь это уже обсуждалось.
-
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;
-
Rusland отреагировална Камышев Александр в строка из массива шестнадцатиричных чисел
вот все злые, пристали к программеру, наговорили всякого,
человек хочет тупо массив данных в HEX просматривать, что от него уходит...
IntToHex используй, вот код на си:
AnsiString s; for ( unsigned int i = 0; i < size; i++ ) s += IntToHex( ( (unsigned __int8)(data[i] ), 2 ) + " "; на выходе строка HEXов через пробел
-