Перейти к содержанию
Fire Monkey от А до Я

dnekrasov

Пользователи
  • Постов

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

  • Посещение

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

    52

Активность репутации

  1. Like
    dnekrasov получил реакцию от krapotkin в Как рассчитать Baseline для выводимого текста?   
    Проблема не в расчете базовой линии, а в том как рисуется текст на GDI+ и Direct2D. У шрифта есть еще свойство LineGap - это предлагаемое расстояние между строками. Как я понял, GDI+ не учитывает его при выводе первой строки, а Direct2D - учитывает. Т.е. при выводе текста на Direct2D он смещается на TTextMetric.tmExternalLeading.
    Чтоб увидеть это - достаточно в Вашем примере поменять шрифт "Times New Roman" на какой-нибудь, где LineGap=0 (например "Tahoma", "Verdana" или "Segoe UI").
  2. Like
    dnekrasov отреагировална x11 в FMXComponents   
    Может, кому пригодится, здесь набор open-sourced  компонент для FMX
    https://github.com/zhaoyipeng/FMXComponents
     
  3. Like
    dnekrasov получил реакцию от Brovin Yaroslav в Скорость рисования на канве   
    Я в данном случае использую TPathData и Canvas.DrawPath. График из 1024 точек 10 раз в секунду перерисовывается без проблем
    var i: Integer; Path: TPathData; begin Path := TPathData.Create; try Path.MoveTo(PointList[0]); for i := 1 to PointList.Count - 1 do Path.LineTo(PointList[i]); end; Canvas.DrawPath(Path, 1); finally FreeAndNil(Path) end;  
  4. Thanks
    dnekrasov отреагировална kami в Разница в вызовах Synchronize   
    Разница есть. И она не только в вызове Synchronize, но и Queue.
    Указание потока в качестве источника метода синхронизации позволяет вам впоследствии сделать TThread.RemoveQueuedEvents(myThread) перед его удалением.
    Вызов RemoveQueuedEvents необходим, если в синхронизируемых методах может идти обращение к полям и методам уничтожаемого потока. Потому что с удалением потока то, что подлежало синхронизации, никуда не пропадет, а раз поток уже не существует - у вас вылезет AV на ровном месте. Или же ваш код испортит чью-то память, что еще труднее отловить.
  5. Like
    dnekrasov отреагировална rareMax в Рисует за пределами канвы   
    Для контрола еще можешь  отключить такое поведение: 
     
    ClipChildren := True;  
  6. Like
    dnekrasov получил реакцию от Rusland в Indy IRC   
    var Data: TIdMultiPartFormDataStream; msResponse: TMemoryStream; sResponse: String; bts: TBytes; ... msResponse := TMemoryStream.Create; try FIdHTTP.Post([URL], Data, msResponse); SetLength(bts, msResponse.Size); msResponse.Position := 0; msResponse.Read(bts[0], msResponse.Size); sResponse := TEncoding.UTF8.GetString(bts); finally FreeAndNil(msResponse); end; Так я работаю с IdHTTP. Я думаю, что-то на подобии этого нужно и Вам реализовать
  7. Like
    dnekrasov получил реакцию от YurMak в Сканирование папок   
    Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
  8. Like
    dnekrasov получил реакцию от rakhmet в Топ мобильных приложений   
    Официальное название: AlReader Официальный сайт: http://www.alreader.com/ (но лучше сюда - http://4pda.ru/forum/index.php?showtopic=340035) Платформы: Android, Windows, WinMobile, Windows CE
  9. Like
    dnekrasov отреагировална AngryOwl в Конфликт Hint и BorderStyle   
    Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
    Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
    Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
    Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
    Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
  10. Like
    dnekrasov получил реакцию от rakhmet в Круглая кнопка   
    Попробовал реализовать стилем - никаких проблем не возникло:
    object TEllipse StyleName = 'ButtonEllipseStyle' Align = Center Size.Width = 256.000000000000000000 Size.Height = 191.000000000000000000 Size.PlatformDefault = False object TColorAnimation Duration = 0.500000000000000000 Inverse = True PropertyName = 'Fill.Color' StartValue = x00808080 StopValue = xAF808080 Trigger = 'IsMouseOver=true' TriggerInverse = 'IsMouseOver=false' end end
     
    UPD!
    Мммда... Насчет проблем я поторопился...
    Для того чтобы отследить клик по кнопке надо переопределить клик для TEllipse в стиле:
    procedure TForm1.btnTestApplyStyleLookup(Sender: TObject); var el: TEllipse; begin if TStyledControl(btnTest).FindStyleResource<TEllipse>('ButtonEllipseStyle', el) then el.OnClick := btnTestClick; end;  
  11. Like
    dnekrasov получил реакцию от Anatoliy в Круглая кнопка   
    Попробовал реализовать стилем - никаких проблем не возникло:
    object TEllipse StyleName = 'ButtonEllipseStyle' Align = Center Size.Width = 256.000000000000000000 Size.Height = 191.000000000000000000 Size.PlatformDefault = False object TColorAnimation Duration = 0.500000000000000000 Inverse = True PropertyName = 'Fill.Color' StartValue = x00808080 StopValue = xAF808080 Trigger = 'IsMouseOver=true' TriggerInverse = 'IsMouseOver=false' end end
     
    UPD!
    Мммда... Насчет проблем я поторопился...
    Для того чтобы отследить клик по кнопке надо переопределить клик для TEllipse в стиле:
    procedure TForm1.btnTestApplyStyleLookup(Sender: TObject); var el: TEllipse; begin if TStyledControl(btnTest).FindStyleResource<TEllipse>('ButtonEllipseStyle', el) then el.OnClick := btnTestClick; end;  
  12. Like
    dnekrasov получил реакцию от Rusland в Незначительная проблемка, но в глаза бросается   
    В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
  13. Like
    dnekrasov получил реакцию от Равиль Зарипов (ZuBy) в Незначительная проблемка, но в глаза бросается   
    В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
  14. Like
    dnekrasov получил реакцию от Alex7wrt в Незначительная проблемка, но в глаза бросается   
    В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
  15. Like
    dnekrasov получил реакцию от Anatoliy в Сканирование папок   
    Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
  16. Like
    dnekrasov получил реакцию от rareMax в Изменить цвет пикспля на bitmape image   
    var   bmd: TBitmapData;   bmp: TBitmap; c, c1: TAlphaColor; x, y: Integer; ... bmp.Map(TMapAccess.ReadWrite, bmd);   try    c1 := bmd.GetPixel(x, y);    bmd.SetPixel(x, y, c); finally     bmp.Unmap(bmd);   end;  
  17. Like
    dnekrasov получил реакцию от afors в Как скрыть иконку на панели задач?   
    Winapi.Windows и FMX.Platform.Win
  18. Like
    dnekrasov получил реакцию от Anatoliy в Как скрыть иконку на панели задач?   
    Winapi.Windows и FMX.Platform.Win
  19. Like
    dnekrasov отреагировална Alex7wrt в 9-Patch PNG FMX Generator   
    Сделал небольшую программу-генератор 9-patch заставок. 
    Достаточно выбрать цвет фона, логотип и его видимый размер, и программа сгенерирует 9-patch для всех необходимых  в FMX размеров.

    Примеры
    Рисунок:

    Полученные 9-Patch png:

    Рисунок:

    Полученные 9-Patch png:

     
    Исходники: 9Patch Generator.zip
     
  20. Like
    dnekrasov получил реакцию от rareMax в Использование своего шрифта под Windows   
    В Berlin и Tokyo AddFontResource и RemoveFontResource прекрасно отрабатывают, только вызывать их надо до Application.Run.
    Кстати, лучше использовать  AddFontResourceEx и RemoveFontResourceEx с флагом FR_NOT_ENUM - тогда надобность в SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) отпадает.
  21. Like
    dnekrasov получил реакцию от #WAMACO в Поменять местами итемы в ListView   
    А можно ещё так:
    ListView1.Items[0].Index := 1; ListView1.Items[1].Index := 0; ListView1.Items.Sort(TComparer<TListViewItem>.Construct( function(const ALeft, ARight: TListViewItem): Integer begin Result := ALeft.Index - ARight.Index; end)); Поменять-то поменяет, только на сколько обоснован вызов Sort в этой ситуации - решать Вам.
  22. Like
    dnekrasov получил реакцию от Равиль Зарипов (ZuBy) в Поменять местами итемы в ListView   
    А можно ещё так:
    ListView1.Items[0].Index := 1; ListView1.Items[1].Index := 0; ListView1.Items.Sort(TComparer<TListViewItem>.Construct( function(const ALeft, ARight: TListViewItem): Integer begin Result := ALeft.Index - ARight.Index; end)); Поменять-то поменяет, только на сколько обоснован вызов Sort в этой ситуации - решать Вам.
  23. Like
    dnekrasov получил реакцию от sinuke в Поменять местами итемы в ListView   
    А можно ещё так:
    ListView1.Items[0].Index := 1; ListView1.Items[1].Index := 0; ListView1.Items.Sort(TComparer<TListViewItem>.Construct( function(const ALeft, ARight: TListViewItem): Integer begin Result := ALeft.Index - ARight.Index; end)); Поменять-то поменяет, только на сколько обоснован вызов Sort в этой ситуации - решать Вам.
  24. Like
    dnekrasov отреагировална Вячеслав в 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
  25. Like
    dnekrasov отреагировална marsden в Доступ к Yandex.Disk   
    Понимаю, что опоздал почти на два года, но все же, для истории и новичков )))
×
×
  • Создать...