ну и кому хочется сделать 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;
Готово!
Ссылка: http://yaroslavbrovin.ru/object_life_cycle_in_delphi_part_1_windows_osx-ru/
Автор: Ярослав Бровин
С появлением мобильных платформ в мире Delphi, произошли серьезные изменения в жизненном цикле объектов. Послужившие причиной многих проблем и вопросов, а как правильно кроссплатформенно удалять объекты. В этой статье детально рассматриваем жизненный цикл объектов на разных платформах и даём ответы на важные вопросы, которые могут побеспокоить даже опытных Delphi разработчиков.
В Designmode разместите кнопки "как видите" их на форме (как они должны быть расположены), а потом левой кнопке поставьте Align = None и Anchors[akLeft,akBottom], а правой Align = None и Anchors[akRight,akBottom]. Думаю, что этого будет достаточно.
P.S. Ну и как все будет закончено с их расположением, поставьте им Locked = True (дабы не сместить их ненароком)
Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
Ну, если не хотите попробовать мою демку и посмотреть класс, то давайте изменю ваш код:
procedure Vibr;
//Процедура вибрации
var
Vibrator: JVibrator;
begin
Vibrator := TJVibrator.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE));
if Vibrator.hasVibrator() then
Vibrator.vibrate(2000);
end;
доступ к сервису вибрации нужно получать у Context'a.
Если всё равно падает, то смотрите логи, через monitor.bat (находится примерно тут: C:\Android\sdk\tools, у вас путь до sdk может быть другим).
uses
FMX.Utils;
procedure TForm7.Button1Click(Sender: TObject);
var
gamecanvas: TBitmap;
i, j: integer;
bitData: TBitmapData;
p: PAlphaColorArray;
begin
gamecanvas := TBitmap.Create(256, 256);
try
if gamecanvas.Map(TMapAccess.ReadWrite, bitData) then
begin
for i := 0 to 255 do
begin
p := bitData.GetScanline(i);
for j := 0 to 255 do
p[j] := TAlphaColorF.Create(random(255) / 255, random(255) / 255, random(255) / 255, 1).ToAlphaColor;
end;
gamecanvas.Unmap(bitData);
self.Canvas.BeginScene();
self.Canvas.DrawBitmap(gamecanvas, gamecanvas.BoundsF, RectF(0, 0, 256, 256), 1);
self.Canvas.EndScene;
end;
finally
gamecanvas.Free;
end;
end;
Можно. Используйте события не 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.