AlexG

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

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

  • Посещение

  • Days Won

    38

AlexG last won the day on 4 января

AlexG had the most liked content!

1 подписчик

О AlexG

  • Звание
    Продвинутый пользователь
  • День рождения

Контакты

  • Сайт
    http://www.sphere-live.com
  • Skype
    sphere-live.com

Информация

  • Пол
    Мужчина

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

769 просмотров профиля
  1. Именно так и пойдет! И под виндой и в других платформах ) Во-первых - DoOnCloseInfo лишь вызовет обработчик этого события в главной форме. Разве что - только добавить синхронизацию procedure TframeInfo.DoOnCloseInfo; begin if Assigned(fOnCloseInfo) then TThread.Synchronize(nil, procedure begin fOnCloseInfo(Self); end); end;
  2. у фрейма: private fOnCloseInfo : TNotifyEvent; protected procedure DoOnCloseInfo; dynamic; public { Public declarations } /// <summary> Обработчик события закрытия фрейма </summary> property OnCloseInfo : TNotifyEvent read fOnCloseInfo write fOnCloseInfo; end; procedure TframeInfo.DoOnCloseInfo; begin // Если обработчик назначен, то запускаем его. if Assigned(fOnCloseInfo) then fOnCloseInfo(Self); end; при инициализации фрейма (не важно где и как - когда создается): frameInfo.OnCloseInfo := fmMain.DoOnCloseInfo; при нажатии на кнопку: DoOnCloseInfo; в главной (или любой другой форме, которая будет отрабатывать нажатие кнопки во фрейме): // можно в любой секции, смотря что нам нужно procedure DoOnCloseInfo(Sender: TObject); procedure TfmMain.DoOnCloseInfo(Sender: TObject); begin if Assigned(frameInfo) then FreeAndNil(frameInfo); end; типа так...
  3. При нажатии на кнопку отправить сообщение главной форме, а в обработчике этого сообщения, на который главная форма (условно, можно вообще любую форму) подписана - удалять соответственно этот фрейм.
  4. Самое простое решение ("на коленке"): uses ... {$IFDEF MSWINDOWS} System.Win.ComObj, Winapi.ShlObj, {$ENDIF} ... //------------------------------------------------- type TTaskBarState = record name : string; value : byte; end; TFMXTaskBar = class(TPersistent) private fTaskBarList : ITaskBarList3; fTaskBarState : integer; fTaskBarProgress : integer; fAlertState : Boolean; procedure setTaskBarState(newState:integer); procedure setTaskBarProgress(newValue : integer); procedure setAlertState(const Value: Boolean); protected public property AlertState: Boolean read fAlertState write setAlertState; property TaskBarState : integer read fTaskBarState write setTaskBarState; property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress; constructor Create; destructor Destroy; override; end; //------------------------------------------------- const taskStates : array [0..4] of TTaskBarState = ( (name: 'TBPF_NOPROGRESS'; value: TBPF_NOPROGRESS), (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE), (name: 'TBPF_NORMAL'; value: TBPF_NORMAL), (name: 'TBPF_ERROR'; value: TBPF_ERROR), (name: 'TBPF_PAUSED'; value: TBPF_PAUSED)); //------------------------------------------------- var MainTaskBar: TFMXTaskBar; //------------------------------------------------- { TFMXTaskBar } constructor TFMXTaskBar.Create; var tbList : ITaskBarList; hr : HRESULT; begin tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList; hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList); if hr <> S_OK then begin fTaskBarList := nil; tbList._Release; end; end; destructor TFMXTaskBar.Destroy; begin inherited; end; procedure TFMXTaskBar.setAlertState(const Value: Boolean); begin if assigned(fTaskBarList) then if fAlertState <> Value then begin fAlertState := Value; if Value then begin setTaskBarState(3); // TBPF_ERROR setTaskBarProgress(100); end else begin setTaskBarState(0); setTaskBarProgress(0); end; end; end; procedure TFMXTaskBar.setTaskBarProgress(newValue: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100); end; procedure TFMXTaskBar.setTaskBarState(newState: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value); end; //------------------------------------------------- initialization MainTaskBar := TFMXTaskBar.Create; finalization if Assigned(MainTaskBar) then FreeAndNil(MainTaskBar);
  5. Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д. Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками". Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения. Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?
  6. В Designmode разместите кнопки "как видите" их на форме (как они должны быть расположены), а потом левой кнопке поставьте Align = None и Anchors[akLeft,akBottom], а правой Align = None и Anchors[akRight,akBottom]. Думаю, что этого будет достаточно. P.S. Ну и как все будет закончено с их расположением, поставьте им Locked = True (дабы не сместить их ненароком)
  7. Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз! Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ... Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio. Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE. Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
  8. Работает! А то, что это "костыль" - пофигу! Если бы он был одним единственным... А так - это решение вполне устраивает! Спасибо!
  9. Думаю, что еще и свойство Transparency, при определенных условиях.
  10. Друзья, привет! Вопрос так и остался актуальным. В случае, если свойства формы BorderStyle = None, то Hint'ы не отображаются! Собственно это больше вопрос к нашим гуру. Что делать и как быть?
  11. Можно. Используйте события не OnClick или OnItemClick и т.д., а событие OnMouseUp у самого TListBox. Типа так: procedure TfmMain.lbxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var LI : TListBoxItem; p : TPointF; begin if Assigned(Sender as TListBox) then begin LI := TListBox(Sender).ItemByPoint(X, Y); if Assigned(LI as TListBoxItem) then begin LI.IsSelected := True; TTask.Run(procedure begin if Button = TMouseButton.mbLeft then Do_какая-то_процедура(LI.Index) // просто пример else if Button = TMouseButton.mbRight then TThread.Synchronize(nil, procedure begin p := MessageEvent.GetMousePos; PopupMenu1.Popup(p.X, p.Y); // для вызова контекстного меню выделенного ListBoxItem end); end); end; end; end; P.S. Отмечу, что использовал TTask и TThread.Synchronize далеко не случайно! Во-первых TTask.Run запустит ваш обработчик нажатия на выделенный элемент в отдельном потоке, что не будет "тормозить" "выделение" самого ListBoxItem и вообще), а во-вторых - "внутри" вызванного потока сделал синхронизацию с основным потоком, при выводе контекстного меню для ListBoxItem, так как это гарантирует корректную работу с GUI в FMX.
  12. Вот читал, читал... Прям даже интересно стало))))) В итоге [Gingercat] написал все, что я думаю)) Жаль нельзя ДВА раза поставить, что мне коммент понравился))