Вячеслав
-
Постов
127 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Активность репутации
-
Вячеслав отреагировална Andrew в Смещается заголовок формы на Android Intel
Нашел и устранил последнюю проблему планшета Lenovo TAB S8-50LC (CPU Intel Atom). Не исключаю, что подобная проблема возникает и на других устройствах.
При изменении ориентации устройства картинка поворачивается моментально. Возможно поэтому в 9 случаях из 10 программа не успевала на это правильно реагировать и форма в портретной ориентации отображалась как альбомная и наоборот. В общем, это выглядело крайне неприятно:
Нужно в процедуре "TPlatformAndroid.HandleAndroidCmd(ACmd: Int32);" найти строки:
===============
APP_CMD_CONFIG_CHANGED:
begin
FContentRectMightHaveChanged := ContentRectChangeRefreshCount; // <<---- !!!!
FOrientationMightHaveChanged := True;
Include(FAppCmdStates, TAndroidAppCmdState.ConfigChanged);
end;
===============
и в отмеченной строке умножить ContentRectChangeRefreshCount на 3 или 4: FContentRectMightHaveChanged := ContentRectChangeRefreshCount * 4;
После этой поправки и исправлений от "Magnum Labs" (см. выше) форма отображается правильно, сколько планшет не крути. На скорость работы приложения это никак не отразилось. Проверялось также на нескольких аппаратах Samsung.
Если будет интересно, в следующий раз расскажу как устранить проблему ненужного появления NavigationBar если кликнуть по TMediaPlayerControl или TWebBrowser, а также странной анимации появления/скрытия указанных компонент при изменении их свойства Visible. Проблема с NavigationBar касается устройств, у которых имеется SoftKey.
-
Вячеслав отреагировална Tera в Семисегментный индикатор
Компоненты TSevSeg - семисегментный индикатор и TSeparator - разделитель.
Переписал компоненты с VCL. Может, кому пригодится. Пример использования:
Для разового использования можно просто подключить к проекту как модуль.
SevenSegment.zip
-
Вячеслав отреагировална Brovin Yaroslav в Анимированные выводит диаграмму (график)
Я бы просто взял бы буфер с двойной шириной. При появлении новой точки просто добавлял ее, а не перерисовывал весь буфер. Затем при выводе просто сдвигал бы битмап. При таком подходе точно будет работать на много быстрее.
-
Вячеслав отреагировална FIL в Как вывести (отрисовать) текст по произвольной дуге
Набросал пример отрисовки текста по дуге:
procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); const S: String = 'Пример отрисовки текста по заданной траектории (дуга)'; var i: Integer; A, Ao, R, TextLen: Single; Rect: TRectF; M1, M2: TMatrix; // uses System.Math.Vectors begin // if Canvas.BeginScene then begin Randomize; R := 400; Ao := DegToRad(150); // uses System.Math A := (Pi - Ao) / 2; Canvas.Font.Size := 32; Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.StrokeThickness := 3; Canvas.Fill.Color := TAlphaColors.Palegreen xor $80000000; Canvas.FillEllipse(TRectF.Create(0, 0, 2 * R, 2 * R), 1); TextLen := Canvas.TextWidth(S); if TextLen > R * Ao then Caption := 'АХТУНГ!'; // длина текста больше выделенной под него дуги (будет наложение букв) for i := 1 to S.Length do begin Rect.Left := 0; Rect.Top := R; Rect.Width := Canvas.TextWidth(S[i]); Rect.Height := Canvas.TextHeight(S[i]); A := A + Ao / (S.Length - 1); M1 := TMatrix.CreateTranslation(- Rect.CenterPoint.X, - Rect.CenterPoint.Y) * TMatrix.CreateRotation(A - A - Pi / 2) * TMatrix.CreateTranslation(Rect.CenterPoint.X, Rect.CenterPoint.Y); M2 := TMatrix.CreateTranslation(-R, -R) * TMatrix.CreateRotation(A) * TMatrix.CreateTranslation(R, R); Canvas.SetMatrix(M1 * M2); Canvas.Fill.Color := TAlphaColor(Random(MaxInt) or $FF000000); Canvas.FillText(Rect, S[i], False, 1, [{TFillTextFlag.RightToLeft}], TTextAlign.Leading, TTextAlign.Center); end; // Canvas.EndScene; end; end;
-
Вячеслав получил реакцию от zairkz в XE8 и Windows 10 Metro UI
Это не возможно осознать что вы, тут написали.
-
Вячеслав отреагировална Denis Vasilyev в Серия статей, как настроить Android, OS X, iOS Simulator, iOS с RAD Studio (Delphi, C++ Builder)
Серия статей с пошаговой инструкцией, как подключить и настроить Android, OS X, iOS Simulator, iOS для работы с RAD Studio.
Как настроить Android и RAD Studio XE7 (Delphi, C++ Builder)
http://habrahabr.ru/company/delphi/blog/253929/
Как настроить Mac OS X, iOS-симулятор и RAD Studio XE8 (Delphi, C++ Builder)
http://habrahabr.ru/company/delphi/blog/255721/
Как настроить iOS-устройство и RAD Studio XE8 (Delphi, C++ Builder)
http://habrahabr.ru/company/delphi/blog/265313/
-
Вячеслав отреагировална Равиль Зарипов (ZuBy) в TMapsEngine
Компонент TMapsEngine
Возможности
Нативный LocationSensor [ANDROID] Геокодинг/Реверс геокодинг через Google API, Yandex API, Here Maps API Построение маршрута через Google Distance API Расчет дистанции по прямой Совместим со стандартным компонентом TLocationSensor
Видео демонстрация
На видео видно как TMapView косячик с миллионом точек, приложение зависло при отрисовке, но с этим ничего не поделать.
Без синхронизации не возможно отрисовать все точки
Исходник
TMapsEngine_source.zip
TMapsEngine_Seattle_10.zip
Скачать APK (долго он там не пролежит, а форум не позволяет загрузить zip размером 7,4 мб )
-
Вячеслав отреагировална Brovin Yaroslav в [TfgRichEdit]- компонент редактирования текста с поддержкой форматирования
Работа продолжается.
Добавлена поддержка расскраски Delphi кода. Создана система, позволяющая самостоятельно обрабатывать блоки документа. Например, чтобы сделать разметку кода. Значительно проработаны отступы для блоков. Добавлены внешние и внутренние отступы. Исправлены многострочные списки. Теперь если элемент списка занимает больше одной строки, он отображается корректно. Добавлена поддержка закрашивания заднего фона.
Так же этот компонент уже интегрирован в будущую настольную версию клиента форума.
-
Вячеслав получил реакцию от Ingalime в com-порт FireMonkey
Авторство всецело не мое, только правки вносил, т.к. в разных версиях студии код вел себя по-разному.
Прощу прощения за то, что выкладываю в неудобной форме, просто из моего проекта сейчас это будет уже достаточно проблематично вытащить.
Код для использования:
На форме лежат Мемо, кнопки открытия/закрытия, эдит для отправляемых текстов и кнопка отправить. в паблике у формы добавляем объект GPort: TComPort; // ****************************************************************************** // ПРОЦЕДУРЫ РАБОТЫ С COM ПОРТОМ // открываем порт procedure TFormChannels.OpenPort(PortNum: Byte); begin GPort := TComPort.Create(PortNum, br9600); GPort.OnRead := FormChannels.OnRead; GFlagOpen := true; FormChannels.ButtonClosePort.Enabled := true; end; // закрываем порт procedure TFormChannels.ClosePort; begin GPort.Free; end; // отправляем в порт данные procedure TFormChannels.WritePort(strWrite: string); var arrBytes: array of Byte; i: Integer; begin if GFlagOpen = False then // проверяем, открыт ли порт OpenPort(strtoint(edtPort.Text)); // если нет, то открываем SetLength(arrBytes, Length(strWrite)); for i := Low(arrBytes) to High(arrBytes) do arrBytes[i] := Ord(strWrite[i + 1]); GPort.Write(arrBytes); arrBytes := nil; end; // читаем данные из порта procedure TFormChannels.OnRead(Sender: TObject; ReadBytes: array of Byte); var i: Integer; begin memRead1.Lines.BeginUpdate; for i := Low(ReadBytes) to High(ReadBytes) do begin if i > Low(ReadBytes) then memRead1.Text := memRead1.Text; // + '.'; memRead1.Text := memRead1.Text + char(ReadBytes[i]); end; // подчищаем заполняющийся Мемо if memRead1.Lines.Count > 5 then begin // memRead1.Clear; memRead1.Lines.Delete(0); memRead1.Lines.Delete(1); end; memRead1.Lines.EndUpdate; end; procedure TFormChannels.ButtonClosePortClick(Sender: TObject); begin ClosePort; end; // открываем порт кнопкой procedure TFormChannels.ButtonOpenPortClick(Sender: TObject); begin OpenPort(strtoint(edtPort.Text)); end; // отправляем в порт данные кнопкой procedure TFormChannels.btnWriteClick(Sender: TObject); begin WritePort(FormChannels.edtWrite.Text); end; // КОНЕЦ ПРОЦЕДУР РАБОТЫ С COM ПОРТОМ // ****************************************************************************** ComPort.zip
-
Вячеслав отреагировална Vitaldj в Нашел реализацию Hint в windows и macOS
Коллеги, нашел очень простую и действенную реализацию всплывающей подсказки - hint для windows и macOS. Проверил, работает! Кому надо, забирайте.
HS_FMXHints.zip
-
Вячеслав отреагировална Vladix в Можно ли добавить свой способ переключения в TSwitch?
Возникла задача добавить в компонент TSwitch надпись для включенного и выключенного состояния (например ON и OFF).
Изучив компонент в исходниках, обнаружил следующее:
в создании стиля компонента присутствуют подстили mask, ontext и offtext, видимо, разработчики предусмотрели этот случай.
В связи с этим вопрос - как минимальными усилиями оживить отображение и стилизацию текста? Если ответ будет с кодом, буду втройне благодарен.
-
Вячеслав отреагировална Равиль Зарипов (ZuBy) в Можно ли добавить свой способ переключения в TSwitch?
возможно ещё кому и понадобится
switch.zip
-
Вячеслав получил реакцию от Brovin Yaroslav в Tethering Передача звука
Не совсем уверен, но попробуйте копнуть в сторону инди-компонентов, использующих протокол UDP. Они могут терять пакеты при плохой связи, но у вас вай фай и проблем быть не должно.
-
Вячеслав отреагировална zairkz в Более быстрая альтернатива DrawBitmap
Попробуй движок Shadow Engine для Firemonkey, FPS впечатляет.
https://www.youtube.com/watch?v=w6lGasU61HQ
Gihub: https://github.com/dimsa/ShadowEngine
-
Вячеслав отреагировална kami в [TidHTTPServer] Почему при выводе запроса в TMemo из OnCommondGet выдается ошибка AV?
Попробовал разобраться, что же происходит во внутренностях idHTTPServer. Ну, что могу сказать - индейцы со времен D2010 далеко продвинулись в плане запутывания кода
Оберните приведенный код в Synchronize, в качестве первого параметра можно передать nil.
-
Вячеслав отреагировална xenon54 в Событие OnMouseUp у TTrackBar
Для XE7 можно сделать так:
TrackBar1.StylesData['hThumb.OnMouseUp'] := TValue.From<TMouseEvent>(form1.TrackBar1ThumbMouseUp); И не нужно таскать библиотеки с собой.
-
Вячеслав отреагировална xenon54 в TServerSocket TClientSocket в FireMonkey
Первый пост 2:39 ночи, второй 5:00, третий 6:50, не услышав ответа в такое время на немногочисленном форуме вы сделали вывод что никто не работает с сетью в ФМ, окей
-
Вячеслав отреагировална Brovin Yaroslav в Как Получить текст по TCP (Indy) в нужной кодировке?
Добрый день,
Теперь он в качестве параметра принимает объект другого класса, а именно интерфейса IIdTextEncoding, который описывает основные методы по работе с потоком.
Естественно, что этот интерфейс вам не нужно реализовывать, а нужно найти его реализацию для UTF8 кодировки.
Собственно смотрим в IdGlobal.pas и видим там глобальные процедуры по получению нужных реализаций в требуемых кодировках:
IdTextEncodingType = (encIndyDefault, encOSDefault, enc8Bit, encASCII, encUTF16BE, encUTF16LE, encUTF7, encUTF8); function IndyTextEncoding(AType: IdTextEncodingType): IIdTextEncoding; overload; function IndyTextEncoding(ACodepage: Word): IIdTextEncoding; overload; function IndyTextEncoding(const ACharSet: String): IIdTextEncoding; overload; {$IFDEF DOTNET} function IndyTextEncoding(AEncoding: System.Text.Encoding): IIdTextEncoding; overload; {$ENDIF} {$IFDEF HAS_TEncoding} function IndyTextEncoding(AEncoding: TEncoding): IIdTextEncoding; overload; {$ENDIF} function IndyTextEncoding_Default: IIdTextEncoding; function IndyTextEncoding_OSDefault: IIdTextEncoding; function IndyTextEncoding_8Bit: IIdTextEncoding; function IndyTextEncoding_ASCII: IIdTextEncoding; function IndyTextEncoding_UTF16BE: IIdTextEncoding; function IndyTextEncoding_UTF16LE: IIdTextEncoding; function IndyTextEncoding_UTF7: IIdTextEncoding; function IndyTextEncoding_UTF8: IIdTextEncoding; Тут либо используем конкретный метод IndyTextEncoding_UTF8, либо же используем вариант через:
IndyTextEncoding(IdTextEncodingType.encUTF8) -
Вячеслав получил реакцию от HarrisNuh в Смена родительского компонента для аниматора
Всем добрый день. Как правильно переопределить родителя для аниматора и тем самым использовать один аниматор для нескольких объектов?
Пытаюсь реализовать следующий принцип: на форме несколько прямоугольников и один аниматор. При клике по конкретному прямоугольнику он начинает менять координату. Вот чаcть кода:
procedure TForm2.MoveRect(Rect: TRectangle); begin //задаем родителя для аниматора Rect.AddObject(AniMoveRect); //Анимируем координату Y прямоугольника AniMoveRect.PropertyName:='Position.Y'; AniMoveRect.Inverse:=False; AniMoveRect.StopValue:=0; AniMoveRect.Start; end; procedure TForm2.RectangleClick(Sender: TObject); begin MoveRect(Sender as TRectangle); end; В итоге анимируется только один прямоугольник - тот, на который кликнули в первый раз. Не могу понять, в чем проблема.
Данную тему читал, но в ней, насколько я понял, речь идет об одновременном использовании аниматора для двух объектов.
AniRects.zip
-
Вячеслав отреагировална Brovin Yaroslav в Руководство о пользовательском интерфейсе программы
OSX
Windows 8 и выше
https://dev.windows.com/en-us/design
-
-
Вячеслав получил реакцию от HarrisNuh в [Windows] Можно ли получить Handle компонента в FMX?
Добрый день, друзья! Пытаюсь восстановить старый код, в котором использовался Handle у панели:
FVideoWindow.put_Owner(Panel.Handle); Теперь же у панели отсутствует хендл как таковой, и я все никак не разберусь, как этот момент следует обходить. Может, у кого-нибудь есть мысли на этот счет?
-
Вячеслав получил реакцию от AngryOwl в Исключение прямоугольной области при выборе случайного значения на двумерной сетке
Ну ладно, тогда вот вам кусочный рандом на примере одномерной задачи.
Область значений Х состоит из двух областей (I) и (III). При этом Х может принимать значение либо из первой области, либо из второй [строчка (1)]
Определяем переменную FLAG, которая может быть только или нулем, или единицей [строчка (2)].
Теперь через нее нетрудно выразить уравнение для Х [строчка (3)]
Сейчас под рукой нет Delphi, поэтому проверить не могу. Но идея, надеюсь, понятна.
-
Вячеслав отреагировална Brovin Yaroslav в Исключение прямоугольной области при выборе случайного значения на двумерной сетке
Еще есть вариант на одномерном примере.
Идея ввести параметр, который будет принимать случайное значение от 0 до суммы двух отрезков. Потом проверять, Если параметр попадает в первый отрезок по длине, то добавляем начальную координату отрезка. Если во второй, то добавляем начальную координату второй части.
-
Вячеслав получил реакцию от Brovin Yaroslav в Исключение прямоугольной области при выборе случайного значения на двумерной сетке
Ну ладно, тогда вот вам кусочный рандом на примере одномерной задачи.
Область значений Х состоит из двух областей (I) и (III). При этом Х может принимать значение либо из первой области, либо из второй [строчка (1)]
Определяем переменную FLAG, которая может быть только или нулем, или единицей [строчка (2)].
Теперь через нее нетрудно выразить уравнение для Х [строчка (3)]
Сейчас под рукой нет Delphi, поэтому проверить не могу. Но идея, надеюсь, понятна.