dnekrasov

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

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

  • Посещение

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

    32

dnekrasov стал победителем дня 15 ноября

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

1 Подписчик

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

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

Информация

  • Пол
    Мужчина
  • Город
    Минск

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

1 209 просмотров профиля
  1. Вряд ли это проблема FMX. Создайте новый проект, киньте мемо и попробуйте поскроллить - я уверен, что такой загрузки ЦПУ не будет. Непонятно что Вы имеете ввиду. Всё это очень просто настраивается или стилем или на самой форме. По-моему, единственная Ваша проблема - это мида конвертер. По собственному опыту перевода могу сказать, что если создавать формы вручную и переносить в них логику, то всё получается довольно просто и проблем особых не возникает. Да и на MacOS практически всё работает без проблем. Сначала опишите конкретную проблему (желательно с кусками кода), а после этого вы получите дельные консультации и, заметьте, совершенно бесплатно. А пользуясь поиском по форуму - Вы найдёте решение подавляющего числа проблем, которые у Вас возникнут.
  2. Вообще-то они относятся к RTL и не имеет значение где их используешь - в VCL или FMX. А генерики и анонимные методы появились еще в Delphi 2010, когда об FMX ещё и речи не шло.
  3. dnekrasov

    Перехват сообщений в Windows

    Попробуйте ещё так сделать: if not FSet and (Msg.WParam = IMN_SETCANDIDATEPOS) then begin FSet := True; Imc:=ImmGetContext(FMXHandleToHWND(Handle)); // ImmGetCandidateWindow(Imc,0,@ImeCandidateFormProperties); ImeCandidateFormProperties.dwIndex:=0; ImeCandidateFormProperties.dwStyle:=CFS_CANDIDATEPOS; ImeCandidateFormProperties.ptCurrentPos.X:=100; ImeCandidateFormProperties.ptCurrentPos.Y:=100; ImeCandidateFormProperties.rcArea:=Rect(0,0,100,100); Msg.Result := LResult(ImmSetCandidateWindow(Imc,@ImeCandidateFormProperties)); ImmReleaseContext(FMXHandleToHWND(Handle),Imc); FSet := False; end; где FSet это глобальное поле типа Boolean. Намного меньше раз заходит в процедуру и более правильно отрабатывает - нет рекурсии вызова.
  4. dnekrasov

    Перехват сообщений в Windows

    Проверил - всё прекрасно работает
  5. dnekrasov

    Перехват сообщений в Windows

    Сложно что-то посоветовать, когда не можешь повторить ошибку... Попробуйте задать ImeCandidateFormProperties.dwIndex и ImeCandidateFormProperties.rcArea. Зачем вообще вызывать ImmGetCandidateWindow(Imc,0,@ImeCandidateFormProperties)? Попробуйте поиграться со значением ImeCandidateFormProperties.dwStyle
  6. dnekrasov

    Перехват сообщений в Windows

    Попробовал... Не понял что такое LookUp.Handle - заменил на просто Handle и вызываю только если Msg.WParam = IMN_SETCANDIDATEPOS. Всё работает без ошибок. Вот мой код procedure TMainForm.WMIMENotify(var Msg: TMessage); var Imc: HIMC; ImeCandidateFormProperties: TCandidateForm; begin if Msg.WParam = IMN_SETCANDIDATEPOS then begin Imc:=ImmGetContext(FMXHandleToHWND(Handle)); ImmGetCandidateWindow(Imc,0,@ImeCandidateFormProperties); ImeCandidateFormProperties.dwStyle:=CFS_CANDIDATEPOS; ImeCandidateFormProperties.ptCurrentPos.X := 100; ImeCandidateFormProperties.ptCurrentPos.Y := 100; ImmSetCandidateWindow(Imc,@ImeCandidateFormProperties); ImmReleaseContext(FMXHandleToHWND(Handle),Imc); end; end;
  7. dnekrasov

    Перехват сообщений в Windows

    Именно перенос в CreateHandle и решает проблему, описанную @kami
  8. dnekrasov

    Перехват сообщений в Windows

    Ну это нормально - теперь все сообщения окну обрабатываются в NewWndProc А вот это странно - я этот механизм использую еще начиная с XE4 и везде отрабатывал без проблем. Единственное, что мог бы посоветовать - попробуйте перенести переопределение WndProc в CreateHandle. WinHook.zip UPD Поднял старые проекты - именно в CreateHandle я это и делал.
  9. dnekrasov

    Перехват сообщений в Windows

    За счет строчки MainForm.Dispatch(Mess);
  10. dnekrasov

    Перехват сообщений в Windows

    Делаем как обычно, если надо переопределить какое-то событие окна interface uses {$IFDEF MSWINDOWS} Winapi.Windows, Winapi.Messages, FMX.Platform.Win, {$ENDIF} System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private procedure CreateHandle; override; {$IFDEF MSWINDOWS} procedure WMIMENotify(var Msg: TMessage); message WM_IME_NOTIFY; {$ENDIF} public end; var MainForm: TMainForm; implementation {$R *.fmx} {$IFDEF MSWINDOWS} var OldWndProc: Pointer = nil; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var Mess : TMessage; begin case Msg of WM_IME_NOTIFY: begin Mess.Msg := Msg; Mess.WParam := wParam; Mess.lParam := lParam; Mess.Result := 0; MainForm.Dispatch(Mess); Result := Mess.Result; end; else Result := CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; end; {$ENDIF} { TMainForm } procedure TMainForm.CreateHandle; begin inherited CreateHandle; {$IFDEF MSWINDOWS} OldWndProc:= Pointer(SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, Integer(@NewWndProc))); {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMainForm.WMIMENotify(var Msg: TMessage); begin {что-то делаем} end; {$ENDIF}
  11. Ещё как работает, во всяком случае под винду. Но именно курсора (cur) а не изображения (bmp). CustomCursor.zip
  12. dnekrasov

    TAlphaTrackBar - Настройка цвета.

    Примерно так: var cl: TAlphaColor; begin cl := Rectangle1.Fill.Color; TAlphaColorRec(cl).A := Round(AlphaTrackBar1.Value * 255); Rectangle1.Fill.Color := cl; end;
  13. В файле проекта, до Application.Initialize вставьте GlobalUseDirect2D := False
  14. Да. После изменения масштаба отображаться начинает вроде нормально, даже без перезагрузки приложения, а вот многие API-шные функции, относящиеся к работе с масштабом возвращают старые значения.