-
Постов
317 -
Зарегистрирован
-
Посещение
-
Победитель дней
52
Активность репутации
-
dnekrasov получил реакцию от krapotkin в Как рассчитать Baseline для выводимого текста?
Проблема не в расчете базовой линии, а в том как рисуется текст на GDI+ и Direct2D. У шрифта есть еще свойство LineGap - это предлагаемое расстояние между строками. Как я понял, GDI+ не учитывает его при выводе первой строки, а Direct2D - учитывает. Т.е. при выводе текста на Direct2D он смещается на TTextMetric.tmExternalLeading.
Чтоб увидеть это - достаточно в Вашем примере поменять шрифт "Times New Roman" на какой-нибудь, где LineGap=0 (например "Tahoma", "Verdana" или "Segoe UI").
-
dnekrasov отреагировална x11 в FMXComponents
Может, кому пригодится, здесь набор open-sourced компонент для FMX
https://github.com/zhaoyipeng/FMXComponents
-
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;
-
dnekrasov отреагировална kami в Разница в вызовах Synchronize
Разница есть. И она не только в вызове Synchronize, но и Queue.
Указание потока в качестве источника метода синхронизации позволяет вам впоследствии сделать TThread.RemoveQueuedEvents(myThread) перед его удалением.
Вызов RemoveQueuedEvents необходим, если в синхронизируемых методах может идти обращение к полям и методам уничтожаемого потока. Потому что с удалением потока то, что подлежало синхронизации, никуда не пропадет, а раз поток уже не существует - у вас вылезет AV на ровном месте. Или же ваш код испортит чью-то память, что еще труднее отловить.
-
dnekrasov отреагировална rareMax в Рисует за пределами канвы
Для контрола еще можешь отключить такое поведение:
ClipChildren := True;
-
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. Я думаю, что-то на подобии этого нужно и Вам реализовать
-
dnekrasov получил реакцию от YurMak в Сканирование папок
Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
-
dnekrasov получил реакцию от rakhmet в Топ мобильных приложений
Официальное название: AlReader Официальный сайт: http://www.alreader.com/ (но лучше сюда - http://4pda.ru/forum/index.php?showtopic=340035) Платформы: Android, Windows, WinMobile, Windows CE -
dnekrasov отреагировална AngryOwl в Конфликт Hint и BorderStyle
Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
-
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;
-
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;
-
dnekrasov получил реакцию от Rusland в Незначительная проблемка, но в глаза бросается
В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
-
dnekrasov получил реакцию от Равиль Зарипов (ZuBy) в Незначительная проблемка, но в глаза бросается
В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
-
dnekrasov получил реакцию от Alex7wrt в Незначительная проблемка, но в глаза бросается
В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
-
dnekrasov получил реакцию от Anatoliy в Сканирование папок
Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
-
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;
-
dnekrasov получил реакцию от afors в Как скрыть иконку на панели задач?
Winapi.Windows и FMX.Platform.Win
-
dnekrasov получил реакцию от Anatoliy в Как скрыть иконку на панели задач?
Winapi.Windows и FMX.Platform.Win
-
dnekrasov отреагировална Alex7wrt в 9-Patch PNG FMX Generator
Сделал небольшую программу-генератор 9-patch заставок.
Достаточно выбрать цвет фона, логотип и его видимый размер, и программа сгенерирует 9-patch для всех необходимых в FMX размеров.
Примеры
Рисунок:
Полученные 9-Patch png:
Рисунок:
Полученные 9-Patch png:
Исходники: 9Patch Generator.zip
-
dnekrasov получил реакцию от rareMax в Использование своего шрифта под Windows
В Berlin и Tokyo AddFontResource и RemoveFontResource прекрасно отрабатывают, только вызывать их надо до Application.Run.
Кстати, лучше использовать AddFontResourceEx и RemoveFontResourceEx с флагом FR_NOT_ENUM - тогда надобность в SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) отпадает.
-
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 в этой ситуации - решать Вам.
-
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 в этой ситуации - решать Вам.
-
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 в этой ситуации - решать Вам.
-
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
-
dnekrasov отреагировална marsden в Доступ к Yandex.Disk
Понимаю, что опоздал почти на два года, но все же, для истории и новичков )))