ну и кому хочется сделать Ballon, а не прямоугольник
копируем в проект и открываем FMX.Controls.Win.pas
Ctrl+F -> constructor TWindowsHint.Create(const AHandle: TWindowHandle);
FToolTipHandle := CreateWindowEx(0, TOOLTIPS_CLASS, nil, WS_POPUP or TTS_ALWAYSTIP or TTS_BALLOON,
0, 0, 300, 300, FNativeControlHandle, 0, hInstance, nil);
TTS_BALLON - сделает закругленные подсказки со стрелкой
сохраняем
Готово!
я тут посидел немного, сделал костыль. особо не заморачивался
копируем в проект и открываем FMX.Forms.pas
Ctrl+F -> procedure TCommonCustomForm.SetShowHint(const Value: Boolean);
procedure TCommonCustomForm.SetShowHint(const Value: Boolean);
begin
FShowHint := Value;
ReleaseLastHinted;
// ZuBy ***
if (not(csDesigning in ComponentState)) then
begin
FreeAndNil(FSharedHint);
FSharedHint := THint.CreateNewInstance(Handle);
end;
// *** ZuBy
end;
сохраняем
в событии OnCreate, OnShow пишем
ShowHint := true;
Готово!
1) окрыть project.dpr (меню.Project.View Source)
добавить
uses
FMX.Types,
......
begin
//отключить использование канвы D2D
GlobalUseDirect2D:= false;
Application.Initialize;
....
end.
2) В главной форме приложения перекрыть OnFormCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
Quality:=TCanvasQuality.HighPerformance;
....
end;
Теперь PaintBox на форме в PaintBox1Paint рисует прямые в 1 пиксел, но без
сглаживания.
Ответы есть, конечно.
Но Вам нужно их задавать отдельно. Внимательно читать, и, главное, с уважением относиться ко всем участникам. У большинства из нас просто нет времени, и стараемся отвечать кратко, только когда есть свободная минутка и знаем ответ.
По поводу TWebBrowser - дождитесь ответа. Я, к сожалению, не могу ничего сказать, не пробовал.
Что касается перемещения формы за любой элемент:
- во-первых элемент, за который будете перемещать, должен иметь свойство HitTest = True
- во вторых, в обработчике события этого элемента OnMouseDown ставьте StartWindowDrag
- и в-третьих, чтобы менять размер формы, при этом не имея рамок и имея вид как был описан выше - разместите на форме элемент TSizeGrip
Друзья!
Поздравляю вас всех с Новым Годом!
Желаю всем вам здоровья, счатья и благополучия в наступившем 2016 году!
Пожелаю всем нам успехов в наших делах, проектах, разработках!
Чтобы все у нас с вами сложилось)
Отдельно хочу поздравить Бровина Ярослава и Ефимова Андрея!
Пожелать Вам, ребята, и Вашим близким, успехов и благополучия!
Еще раз - с Новым Годом!
p.s. Надеюсь не забанят за то, что "не в тему" )))
Перемещение контрола можно сделать двумя способами:
Используя обычный набор событий OnMouseDown, OnMouseMove, OnMouseUp.
Использовать для перемещения жесты.
1. Реализация с использованием событий мыши
Эти события реализованы для всех платформ. В том числе они эмулируются на мобильных платформ, где понятия мыши, как такового нету. Это означает, что их можно использовать для реализации перетаскивания контрола. Это можно сделать, например, следующим образом:
а) Создаем форму и кидаем на нее картинку. Я назвал ее DraggableImage.
б) Заводим два поля.
TForm5 = class(TForm)
DraggableImage: TImage;
procedure DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
procedure FormCreate(Sender: TObject);
procedure DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
private
FStartPos: TPointF;
FPressed: Boolean;
end;
FStartPos - начальная локальная позиция мыши внутри нашего контрола (картинки), когда пользователь зажал кнопку мышки или опустил палец на экран.
FPressed - флаг для сигнализирования, что пользователь опустил палец (зажал кнопку мыши) на нашу картинку и до текущего момента не снял с экрана.
в) В конструкторе формы для перетаскиваемого контрола ОБЯЗАТЕЛЬНО задаем AutoCapture = True. Это позволит контролу генерировать события перемещения мыши, даже если курсор мыши ушел за локальные границы контрола.
procedure TForm5.FormCreate(Sender: TObject);
begin
DraggableImage.AutoCapture := True;
end;
г) В момент нажатия на картинку сохраняем локальную позицию мыши и задаем флаг FPressed = True
procedure TForm5.DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
FPressed := True;
FStartPos := TPointF.Create(X, Y);
end;
д) В момент отпускания кнопки мыши или убирания пальца с экрана сбрасываем флаг FPressed:
procedure TForm5.DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
FPressed := False;
end;
е) И собственно меняем позицию картинки, когда мы ведем мышкой по картинке:
procedure TForm5.DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
var
MoveVector: TVector;
begin
if FPressed then
begin
// Вычисляем локальное смещение относительно первоначальной позиции
MoveVector := TVector.Create(X - FStartPos.X, Y - FStartPos.Y, 0);
// Вычисляем смещение в координатах формы, чтобы учесть изменение
// координат при смещении родительских контролов
MoveVector := DraggableImage.LocalToAbsoluteVector(MoveVector);
if DraggableImage.ParentControl <> nil then
MoveVector := DraggableImage.ParentControl.AbsoluteToLocalVector(MoveVector);
// Перемещаем картинку на вычисленный вектор
// Для RAD Studio XE5
DraggableImage.Position.Point := DraggableImage.Position.Point + MoveVector.ToPointF;
// Для новых версий
// DraggableImage.Position.Point := DraggableImage.Position.Point + TPointF(MoveVector);
end;
end;
Этот кусок стоит прокомментировать, чтобы корректно выполнить перетаскивание контролу обязательно нужно вычислять смещение в абсолютных координатах формы. Причина в том, что если контрол повернут или входит один в другой, то нужно учитывать смещения всей цепочки родительских контролов до формы. Поэтому мы вначале вычисляем смещение в локальных координатах, затем вычисляем его в абсолютных координатах формы. А затем обратно переводим в локальные координаты родительского контрола. После чего изменяем позицию контрола на вычисленное смещение.
Такой подход используется, в частности, в контроле TSelection, который так же можно перемещать мышкой или пальцем.
P.S. Чтобы лучше понять это, нарисуйте на листке бумаги положения контрола и попробуйте вручную выполнить этот алгоритм с преобразованием координат.
Собственно говоря, такой подход отлично работает везде и не требует использования системы жестов.
2. Реализация с использованием жестов
Этот способ будет работать только на мобильных платформах, поскольку нужный жест Pan (если я правильно помню) не поддерживается под Windows. Поэтому в целом, первый вариант является универсальным и лучшим решением.