mmover

Пользователи
  • Публикаций

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

  • Посещение

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

    4

mmover стал победителем дня 17 июня

mmover имел наиболее популярный контент!

Информация о mmover

  • Звание
    Пользователь

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Можно перехватить событие изменения позиции. Только обязательно нужно сохранить предыдущий обработчик для его принудительного вызова. Вот грубый пример : var SavePositionOnChange : TNotifyEvent; procedure TForm2.FormShow(Sender: TObject); begin SavePositionOnChange := Button4.Position.OnChange ; Button4.Position.OnChange := ButtonPositionChange; end; procedure TForm2.ButtonPositionChange(Sender: TObject); begin { делаем что нужно .... } if Assigned(SavePositionOnChange) then SavePositionOnChange(Sender) end;
  2. Пришел на ум такой вариант : procedure TForm2.FormShow(Sender: TObject); var i : Integer; B : TButton ; begin ScrollBox1.BeginUpdate; for i := 1 to 10 do begin B := TButton.Create(Self) ; B.Parent := ScrollBox1; B.Height := 50; B.Align := TAlignLayout.Top ; B.Tag := Random(50); B.Text := 'Button '+IntToStr(B.Tag); end; ScrollBox1.EndUpdate; end; procedure TForm2.ButtonSortClick(Sender: TObject); var L : TList<Tcontrol>; i : Integer; begin L := TList<Tcontrol>.Create; for i := 0 to ScrollBox1.Content.ControlsCount-1 do L.Add(ScrollBox1.Content.Controls[i]); L.Sort(TComparer<TControl>.Construct( function(const Left, Right: TControl) : Integer begin Result := CompareValue(Left.Tag,Right.Tag); end)); for i := 0 to L.Count-1 do begin L[i].Align := TAlignLayout.None; L[i].Position.Y := i* L[i].Height; L[i].Align := TAlignLayout.Top; end; ScrollBox1.RealignContent; L.Free; end;
  3. Судя по картинкам, вот эта библиотека умеет : https://github.com/Zeus64/alcinoe
  4. mmover

    HueTrackBar

    procedure TForm2.HueTrackBar1Change(Sender: TObject); begin Rectangle1.Fill.Color := HSLtoRGB(HueTrackBar1.Value,1,0.5); end;
  5. В стиле подправить координаты для SourceLink (уменьшить прямоугольник, что бы в него не попадала рамка)
  6. mmover

    Свои кнопки в заголовке окна

    Примерно так : MyCaptionButton.StylesData['ButtonStyle.OnClick'] := TValue.From<TNotifyEvent>(ButtonClick);
  7. mmover

    ListBox1.ScrollToItem(Item);

    Попробуйте так : procedure TForm1.Process; Const N=100; var I,Index:Integer; Item:TListBoxItem; begin for I := 1 to N do begin Item:=TListBoxItem.Create(ListBox1); Item.Text:=IntToStr(I); ListBox1.AddObject(Item); end; ListBox1.ApplyStyleLookup; // (создаст ContentLayout) ListBox1.ScrollToItem(Item); end;
  8. Меняется с помощью стиля. Например: procedure TForm2.Button1Click(Sender: TObject); begin ComboBox1.ListBox.DefaultItemStyles.ItemStyle := 'ListBoxItemMyStyle' ; ComboBox1.NeedStyleLookup; end;
  9. У TMS есть компонент с похожим функционалом - TTMSFMXHotSpotImage. На картинку накладываются произвольные регионы с возможностью обработки событий.
  10. type THackCustomComboBox = class(TCustomComboBox) public property Popup; end; ...... begin THackCustomComboBox(ComboBox1).Popup.IsOpen := False; end;
  11. Может быть эта информация поможет : http://riversoftavg.com/blogs/index.php/2016/01/17/colorful-text-with-fmx/
  12. mmover

    Ручная анимация прокрутки списка

    Вот, накидал класс который может помочь. unit UAnimHelper; interface uses System.Classes, System.SysUtils, FMX.Types; type TAnimateStep = reference to procedure(Value : Single); TAnimateHelper = class private type TAniInst = class(TFmxObject) private FValue : Single; FStepProc : TAnimateStep; FStopProc : TProc; procedure SetValue(Value : Single); procedure DoAniFinished(Sender: TObject); public constructor Create(AStepProc : TAnimateStep; AStopProc : TProc); published property Value : Single read FValue write SetValue; end; public class procedure DoAnimate(Root : IRoot; // без указания формы анимация работать не будет Duration, FromValue, ToValue : Single; AType: TAnimationType; AInterpolation: TInterpolationType; StepProc : TAnimateStep; StopProc : TProc = nil); end; implementation uses FMX.Ani; constructor TAnimateHelper.TAniInst.Create(AStepProc : TAnimateStep; AStopProc : TProc); begin inherited Create(nil); FStepProc := AStepProc; FStopProc := AStopProc; end; procedure TAnimateHelper.TAniInst.SetValue(Value : Single); begin if Assigned(FStepProc) then FStepProc(Value); end; procedure TAnimateHelper.TAniInst.DoAniFinished(Sender: TObject); begin if Assigned(FStopProc) then FStopProc(); TThread.ForceQueue(nil, procedure begin TAnimation(Sender).TagObject.DisposeOf; end); end; class procedure TAnimateHelper.DoAnimate(Root : IRoot; Duration, FromValue, ToValue : Single; AType: TAnimationType; AInterpolation: TInterpolationType; StepProc : TAnimateStep; StopProc : TProc = nil); var AniInst : TAniInst; Animation: TFloatAnimation; begin AniInst := TAniInst.Create(StepProc,StopProc); AniInst.FValue := FromValue; Animation := TFloatAnimation.Create(nil); Animation.TagObject := AniInst; Animation.Parent := AniInst; Animation.SetRoot(Root); Animation.AnimationType := AType; Animation.Interpolation := AInterpolation; Animation.OnFinish := AniInst.DoAniFinished; Animation.Duration := Duration; Animation.PropertyName := 'Value'; Animation.StartFromCurrent := True; Animation.StopValue := ToValue; Animation.Start; end; end. Пример использования : procedure TForm1.Button3Click(Sender: TObject); begin TAnimateHelper.DoAnimate(Self, 1.2, ListBox1.ViewportPosition.Y , 400, TAnimationType.&In, TInterpolationType.Circular, procedure(Value : Single) begin ListBox1.ViewportPosition := PointF(0,Value); end); end;
  13. mmover

    Окончание скроллинга в ListBox

    Стандартным способом никак (или я плохо искал) Получилось не очень, но работает. (на форме только два ListBox-а) ......... type THackListBox = class(TListBox) public property VScrollBar; end; THackScrollBar = class(TScrollBar) public property Track; end; procedure TForm1.FormShow(Sender: TObject); var i : Integer ; begin for i := 0 to 50 do ListBox1.Items.Add('Item '+ IntToStr(i)); for i := 0 to 50 do ListBox2.Items.Add('Item '+ IntToStr(i)); ListBox1.OnVScrollChange := ListBoxVScrollChange; ListBox2.OnVScrollChange := ListBoxVScrollChange; end; procedure TForm1.EndScrollListBox(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var ListB : TCustomListBox; C : TFmxObject; begin if Sender is TThumb then if TThumb(Sender).IsPressed then begin ListB := nil; C := TFmxObject(Sender); while C <> nil do begin C := C.Parent; if (C <> nil) and (C is TCustomListBox) then begin ListB := C as TCustomListBox; break; end; end; if ListB <> nil then ShowMessage('End tracking scroll Listbox. Name : '+ ListB.Name); end; end; procedure TForm1.ListBoxVScrollChange(Sender: TObject); begin if Sender is TListBox then if not Assigned(THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp) then THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp := EndScrollListBox; end;
  14. mmover

    Узнать дату Android приложения

    Как то так : .... var PackageInfo: JPackageInfo; PackageManager: JPackageManager; Activity: JActivity; begin Activity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz); PackageManager := Activity.getPackageManager; PackageInfo := PackageManager.getPackageInfo(Activity.getPackageName, TJPackageManager.JavaClass.GET_CONFIGURATIONS); Result := PackageInfo.lastUpdateTime; end;
  15. mmover

    Memory TreeView

    Самое простое : https://github.com/davidberneda/GenericTree Сам не пробовал, но давно использую похожую конструкцию.