-
Постов
394 -
Зарегистрирован
-
Посещение
-
Победитель дней
45
Активность репутации
-
AngryOwl отреагировална rakhmet в Определение кнопок
Решил так:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = vkMenu then ... end;
-
AngryOwl отреагировална Error в Перспективы RAD
Мое решение, все тоже - жду год, смотрю что происходит. Сейчас я стараюсь "доводить" свои наработки в OpenSource и выкладывать в бесплатном или нет варианте, делиться опытом, который есть в виде статей и заметок, чтобы оно не сгинуло если что...
-
AngryOwl отреагировална Brovin Yaroslav в Перспективы RAD
Читать интересно
Наверное вернулся только при том, что я действительно буду понимать, что компания выбрала правильный путь развития и очень сильно заинтересована в этом
-
AngryOwl получил реакцию от Ingalime в [ListBox] загрузка картинок
1. Создайте свой стиль для ListBoxItem, например 'listboxitemMystyle', скопировав стандартный и переобозвав его. В своем стиле Итемов просто сделайте невидимым Detail. Или, что еще лучше, - храните Ваши ссылки в TagString Итема.
2. В Style Designer, при редактировании Вашего listboxitemMystyle, вставьте TImage задайте ему необходимые свойства: выравнивание, размеры, отступы и т.д. (не забудьте сделать "растягивание" или что там Вам требуется - просто проверьте в дизайнере). И задайте Вашему TImage имя, например, 'myimagestyle'.
3. При загрузке изображения я бы рекомендовал сначала загрузить изображение в созданный TBitmap, а потом уже грузить его в наш 'myimagestyle'. А самое оптимальное решение - загрузка изображений в "контейнер", в фоновом режиме, а при окончании загрузки, по событию, - отрисовка уже в самом итеме. В любом случае - сначала в битмап, а потом этот битмап в Итем. Иначе, вероятность того что битмап отрисуется в вашем случае - практически нулевая.
4. Далее, при создании итемов:
procedure ContactList_AddItem(Sender: TObject); var newItem : TListBoxItem; newBitmap : TBitmap; begin newItem := TListBoxItem.Create(nil); newItem.StyleLooup := 'listboxitemMystyle'; // хотя будет проще не писать этого, а прописать в ListBox1.DefaultItemStyles.ItemStyle newItem.Text := 'текст'; newItem.TagString := тут может быть Ваша ссылка newBitmap := TBitmap.Create; newBitmap.LoadFrom ....... // грузим картинку newItem.TagObject := newBitmap; newItem.OnApplyStyleLookup := MyItemApplyStyle; ListBox1.AddObject(newItem); end; procedure MyItemApplyStyle(Sender: TObject); var LI : TListBoxItem; tmpBitmap : TBitmap; begin LI := Sender as TListBoxItem; if Assigned(LI) then try LI.BeginUpdate; tmpBitmap := LI.TagObject as TBitmap; if Assigned(tmpBitmap) then LI.StylesData['myimagestyle.bitmap'] := tmpBitmap; // тут вообще можно обновлять все что угодно в этом Итеме finally LI.EndUpdate; end; end; Собственно все.
Сорри если что не понятно - писал "от руки", без проверки. Но вроде все просто.
-
AngryOwl отреагировална Error в [Статья] VCL, избавляемся от мерцания, раз и навсегда
Ссылка: https://habrahabr.ru/post/318876/
Автор: Error
Описание:
Delphi и C++Builder разработчики, использующие VCL не по наслышке знают о вездесущей проблеме мерцания контролов.
Мерцание происходит при перерисовке, вследствие того, что сначала отрисовываеться фон компонента, и только потом сам компонент.
И если в случае с наследниками от TWinControl частичным решением проблемы является установка свойства DoubleBuffered в True, что заставляет контрол отрисовываться в буфере(однако DoubleBuffered работает тоже не идеально, к прим.: контрол перестает быть прозрачным), то в случае с TGraphicControl решение с DoubleBuffered просто невозможно, из-за отсутствия у TGraphicControl окна, установка же DoubleBuffered в True у родителя не помогает, из-за того что отрисовка вложенных TGraphicControl-ов происходит уже после прорисовки родителя в буфере.
Обычно остается только одно — смириться с мерцанием, и максимально упростить отрисовку для минимизации эффекта, или использовать по возможности исключительно TWinControl-ы, что не всегда возможно и удобно.
Однажды намучившись с мерцанием, я не выдержал и решил решить эту проблему, раз и навсегда!
...
-
AngryOwl получил реакцию от Равиль Зарипов (ZuBy) в Мультиязычность в приложении
Я вот тут (с примерами) тоже предлагал свое "видение" этого вопроса.
-
AngryOwl отреагировална Brovin Yaroslav в Описание TfgRegularPolygon
Описание
Назначение: Компонент предназначен для отображения правильного многоугольника. Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\RegularPolygonDemo\RegularPolygonDemo.dproj Возможности
Округление к физическим пикселям - TfgRegularPolygon.AlignToPixels Количество сторон - TfgRegularPolygon.SidesCount Настройка цвета границы - TfgRegularPolygon.Stroke Настройка заливки - TfgRegularPolygon.Fill
-
AngryOwl отреагировална Brovin Yaroslav в Описание TfgRatingBar
Описание
Назначение: Компонент предназначен для отображения и ввода голоса. Поддерживает стилизацию. Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\RatingBarDemo\RatingBarDemo.dproj
Возможности
Стилизация через указание двух картинок отображающих голос и пустой голос Общее количество "звезд" - TfgRatingBar.TotalCount Текущее значение голоса - TfgRatingBar.Rating Возможность указывать дробное значение голоса Возможность указать шаг изменения голоса TfgRatingBar.StepSize Поддержка Tint эффекта - TfgRatingBar.TintColor Автоматический размер - TfgRatingBar.AutoSize Режим только отображения - TfgRatingBar.ReadOnly Событие окончательного изменения рейтинга (отжатие пальца от экрана или кнопки мышки) - TfgRatingBar.OnChange Событие в процессе изменения рейтинга - TfgRatingBar.OnChanging
-
AngryOwl получил реакцию от Rusland в Мультиязычность в приложении
Я вот тут (с примерами) тоже предлагал свое "видение" этого вопроса.
-
AngryOwl получил реакцию от Steepe_Hare в Мультиязычность в андроиде
[janovskis] "а если текст состоит из нескольких кусков каждый из которых должен бытъ переведен отдельно?"
ну так просто создайте в файлах перевода строки (типа):
в lang.ru
1000=Страна:
1001=Россия
1002=Англия
в lang.en
1000=Country:
1001=Russia
1002=England
а в программе пишите (допустим компонент на который надо вывести надпись label1 = TLabel):
label1 := Format('%s %s', [GetValue(1000, 'Страна:'), GetValue(1001, 'Россия')]); // ну или другой код страны ...
// ну можно чуть проще)) label1 := Format('%s %s', [GetValue(1000), GetValue(1001)]);
и все...
З.Ы. и никакой "четкой привязки"... любые тексты, выводить можно куда угодно и как угодно...
-
AngryOwl отреагировална Brovin Yaroslav в Описание TfgRectangle
Описание
Назначение: Компонент предназначен для отображения прямоугольника. Главное отличие от стандартного TRectangle - это возможность округления позиции и размера прямоугольника для избежания размытия границ. Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\ShapesDemo\ShapesDemo.dproj Возможности
Одной из проблем графических примитивов в FMX - это размытие границ, вызванное отсутствием привязки изображения к физическим пикселям экрана. Поэтому любое смещении координат прямоугольника на дробную часть приводит к размытию границы. Это хорошо видно на скриншоте ниже (Граница самого нижнего прямоугольника размыта, по сравнению с прямоугольниками выше)
Округление к физическим пикселям - TfgRectnalge.AlignToPixels Настройка отображения углов - TfgRectangle.Corners Настройка закругления внешних углов - Corners.RadiusX, Corners.RadiusY Настройка способа вывода угла - Corners.CornerType Указание какие углы выводить - Corners.Corners Настройка цвета границы - TfgRectangle.Stroke Настройка заливки - TfgRectangle.Fill
-
AngryOwl отреагировална Brovin Yaroslav в Описание TfgImageList
Первый набросок компонента, позволяющего организовать централизованное хранение графических ресурсов для всех платформ.
Основные особенности:
Спроектирован для использования одного экземпляра изображения во многих компонентах. Позволяет хранить все графические ресурсы любых размеров. В будущем не будет грузить картинки в память, если они не используются. А будет подгружать их из файла по мере необходимости. Тем самым будет значительно экономиться память. Хранение именованных графических ресурсов, а не по индексу. Это позволяет отразить в названии назначение картинки. Использование папок. Группировка изображений по смыслу для удобства работы с ними. Возможность загрузки разных картинок для разных устройств, или же загрузить один набор картинок для всех устройств. Удобная и быстрая загрузка изображений путем перетаскивания Хранение отступов изображения. Наглядное отображение картинки в свойствах компонентах. При изменении имени картинки, в компонентах используемых картинку идет автоматическое обновление имени картинки. В стандартном TImageList, из-за индексной структуру все картинки съезжают и при удалении картинки, компонент начинает отображать уже другую картинку.
-
AngryOwl получил реакцию от egorea1999 в [ListBox] загрузка картинок
1. Создайте свой стиль для ListBoxItem, например 'listboxitemMystyle', скопировав стандартный и переобозвав его. В своем стиле Итемов просто сделайте невидимым Detail. Или, что еще лучше, - храните Ваши ссылки в TagString Итема.
2. В Style Designer, при редактировании Вашего listboxitemMystyle, вставьте TImage задайте ему необходимые свойства: выравнивание, размеры, отступы и т.д. (не забудьте сделать "растягивание" или что там Вам требуется - просто проверьте в дизайнере). И задайте Вашему TImage имя, например, 'myimagestyle'.
3. При загрузке изображения я бы рекомендовал сначала загрузить изображение в созданный TBitmap, а потом уже грузить его в наш 'myimagestyle'. А самое оптимальное решение - загрузка изображений в "контейнер", в фоновом режиме, а при окончании загрузки, по событию, - отрисовка уже в самом итеме. В любом случае - сначала в битмап, а потом этот битмап в Итем. Иначе, вероятность того что битмап отрисуется в вашем случае - практически нулевая.
4. Далее, при создании итемов:
procedure ContactList_AddItem(Sender: TObject); var newItem : TListBoxItem; newBitmap : TBitmap; begin newItem := TListBoxItem.Create(nil); newItem.StyleLooup := 'listboxitemMystyle'; // хотя будет проще не писать этого, а прописать в ListBox1.DefaultItemStyles.ItemStyle newItem.Text := 'текст'; newItem.TagString := тут может быть Ваша ссылка newBitmap := TBitmap.Create; newBitmap.LoadFrom ....... // грузим картинку newItem.TagObject := newBitmap; newItem.OnApplyStyleLookup := MyItemApplyStyle; ListBox1.AddObject(newItem); end; procedure MyItemApplyStyle(Sender: TObject); var LI : TListBoxItem; tmpBitmap : TBitmap; begin LI := Sender as TListBoxItem; if Assigned(LI) then try LI.BeginUpdate; tmpBitmap := LI.TagObject as TBitmap; if Assigned(tmpBitmap) then LI.StylesData['myimagestyle.bitmap'] := tmpBitmap; // тут вообще можно обновлять все что угодно в этом Итеме finally LI.EndUpdate; end; end; Собственно все.
Сорри если что не понятно - писал "от руки", без проверки. Но вроде все просто.
-
AngryOwl получил реакцию от Kitty в [ListBox] загрузка картинок
1. Создайте свой стиль для ListBoxItem, например 'listboxitemMystyle', скопировав стандартный и переобозвав его. В своем стиле Итемов просто сделайте невидимым Detail. Или, что еще лучше, - храните Ваши ссылки в TagString Итема.
2. В Style Designer, при редактировании Вашего listboxitemMystyle, вставьте TImage задайте ему необходимые свойства: выравнивание, размеры, отступы и т.д. (не забудьте сделать "растягивание" или что там Вам требуется - просто проверьте в дизайнере). И задайте Вашему TImage имя, например, 'myimagestyle'.
3. При загрузке изображения я бы рекомендовал сначала загрузить изображение в созданный TBitmap, а потом уже грузить его в наш 'myimagestyle'. А самое оптимальное решение - загрузка изображений в "контейнер", в фоновом режиме, а при окончании загрузки, по событию, - отрисовка уже в самом итеме. В любом случае - сначала в битмап, а потом этот битмап в Итем. Иначе, вероятность того что битмап отрисуется в вашем случае - практически нулевая.
4. Далее, при создании итемов:
procedure ContactList_AddItem(Sender: TObject); var newItem : TListBoxItem; newBitmap : TBitmap; begin newItem := TListBoxItem.Create(nil); newItem.StyleLooup := 'listboxitemMystyle'; // хотя будет проще не писать этого, а прописать в ListBox1.DefaultItemStyles.ItemStyle newItem.Text := 'текст'; newItem.TagString := тут может быть Ваша ссылка newBitmap := TBitmap.Create; newBitmap.LoadFrom ....... // грузим картинку newItem.TagObject := newBitmap; newItem.OnApplyStyleLookup := MyItemApplyStyle; ListBox1.AddObject(newItem); end; procedure MyItemApplyStyle(Sender: TObject); var LI : TListBoxItem; tmpBitmap : TBitmap; begin LI := Sender as TListBoxItem; if Assigned(LI) then try LI.BeginUpdate; tmpBitmap := LI.TagObject as TBitmap; if Assigned(tmpBitmap) then LI.StylesData['myimagestyle.bitmap'] := tmpBitmap; // тут вообще можно обновлять все что угодно в этом Итеме finally LI.EndUpdate; end; end; Собственно все.
Сорри если что не понятно - писал "от руки", без проверки. Но вроде все просто.
-
AngryOwl получил реакцию от Rusland в С Наступающим Новым Годом!
Присоединяюсь!
Желаю всем здоровья, благополучия и успехов в работе и личной жизни!
С наступающим Новым Годом!
-
AngryOwl получил реакцию от Rusland в [ListBox] загрузка картинок
Я [ZuBy] уважаю! Но не слушайте его, в данном случае! ))))
Я с ним не согласен. Точнее - не совсем.
У TListBox есть ряд свои преимуществ! Причем, зачастую, довольно существенных. Которые никакие TListView не перекрывают. По крайне мере пока.
Во-первых - если речь идет о Винде, то это возможность плавного скроллинга. Чего нет у TListView. Не знаю кому как из разрабов, а рядового пользователя это часто бесит - прокрутка "рывками".
Во-вторых - TListBox и его TListBoxItem'ы все же намного проще "рисовать". В смысле - создание своего шаблона пока еще намного проще чем у TListView. Вы можете для TListBox очень просто создавать свои элементы списка.
Несмотря на то, что TListBox существенно "тормознее" TListView, часто его скорости вполне достаточно.
Все, разумеется, зависит от Ваших конечных целей.
А что касается картинок в Итемах TListBox, то нужно просто переопределить ApplyStyle.
Создайте свою процедуру, например ItemApplyStyle;
Присвойте, при создании Итема, свой обработчик. Например
newItem.OnApplyStyleLookup := ItemApplyStyle;
А в ItemApplyStyle сделайте обновление картинки. Типа так:
procedure TContactActions.ItemApplyStyle(Sender: TObject); var StyleObject: TFmxObject; lbx : TListBox; LI : TListBoxItem; begin LI := Sender as TListBoxItem; LI.BeginUpdate; try StyleObject := LI.FindStyleResource('picture') as TCircle; if Assigned(StyleObject) then begin TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.BeginScene(); try TCircle(StyleObject).Fill.Bitmap.Bitmap := ____тут_ваш_битмап__; finally TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.EndScene; end; end; finally LI.EndUpdate; end; end; Разумеется, все проверки и прочее - это уж Вы сами. И в моем примере это TCircle, а у Вас что - сами решите.
Ну и можно для краткости (если там просто TImage) не писать все через StyleObject, а покороче, через StylesData['_имя_.bitmap'] и т.д.
Ну и что на Delphi - не обессудьте! ) Смысл тут простой.
Думаю, что в целом идея ясна.
-
AngryOwl получил реакцию от Kitty в [ListBox] загрузка картинок
Под Андроид, все зависит от того - какая именно задача стоит? Цели этого "списка". Исходя из моего опыта, в некоторых случаях не обойтись без TListView (это не значит, что нельзя TListBox, просто у него ряд своих ограничений, и не только по скорости. Например - не очень "адекватная" работа с Touch. В смысле - прокрутка пальцем списка у TListBox не очень оптимизирована...)
Поэтому - если Ваш список имеет не сложные элементы - я бы порекомендовал бы, наверное, переделать его на TListView. Покажите, или более подробно объясните - какие вообще элементы в каждом Итеме? Какие события обрабатываются? Прокрутка, нажатия, и т.д. В каждом Итеме картинки в каком виде? Их размер и положение? Они прямоугольные? И т.д.
Чем больше деталей Вы предоставите - тем что-то более конкретное можно советовать в Вашем случае. Или даже помочь с кодом (в смысле - с примером реализации).
Списки контактов в своей программе я делал - для Винды и Мака - TListBox, а для Андроида - TListView. И разница в коде - была всего в 4 десятка строк в общей сложности.
Повторюсь - у каждого из этих компонентов есть свои преимущества и свои недостатки. Например: TListView - скорость работы, TListBox - более "гибкий" в плане создания любого Итема.
-
AngryOwl получил реакцию от zairkz в С Наступающим Новым Годом!
Присоединяюсь!
Желаю всем здоровья, благополучия и успехов в работе и личной жизни!
С наступающим Новым Годом!
-
AngryOwl отреагировална krapotkin в Кодировка строки. Delphi -> PHP Передача строки-кириллицы через IdHTTP1.Get
предполагаю, что строка из делфи уходит в юникоде. хотя за инди не скажу точно. используйте THttpClient для определенности
так что все преобразования - на стороне сервера
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в VK API и Delphi
У меня на гите есть пример TRestLight и здесь на форуме тоже, через TRestClient, воспользуйтесь поиском
-
AngryOwl получил реакцию от Равиль Зарипов (ZuBy) в С Наступающим Новым Годом!
Присоединяюсь!
Желаю всем здоровья, благополучия и успехов в работе и личной жизни!
С наступающим Новым Годом!
-
AngryOwl получил реакцию от Kitty в [ListBox] загрузка картинок
Да еклмн - да хоть 100 элементов, хоть 500 - каждый со своей картинкой! Пишите аккуратно и грамотно - и "да прибудет с Вами "сила" (с)
Ничего не тормозит, не глючит, все рисуется замечательно (что касается TListBox)!
Я уже показывал пример. там речь не об этом, но везде TListBox - и в списке контактов и в сообщениях. Потому-что они намнооооого сложнее того (те итемы, с которыми я работаю), что видно. И их реализация на TListView возможна, но она сложнее на порядок.
И еще момент! Скажите - как у Вас называется (в стиле) тот элемент в TListBoxItem, в котором содержится картинка? Не Icon ли случаем? Не помню точно какое название там по умолчанию, а смотреть сейчас лень, но сделайте свое наименование этого TImage, например 'myiconstyle' или еще как, и обновляйте через свой обработчик OnApplyStyleLookup.
З.Ы. И я так понимаю - Вы делаете приложение именно под Win?
З.З.Ы. И ничего переделывать не надо. Просто дайте скрин, или фрагмент скрина вашего приложения, если такое возможно. Визуально увидеть "проблему" - многого стоит. А если сделаете видео - совсем будет ясно. Хотя я и так понимаю - в чем у Вас проблема. И предложенное мной решение - работает.
Не знаю - что там говорил Ярослав, но применение OnApplyStyleLookup - очень простое! Куда проще-то?
-
AngryOwl получил реакцию от Kitty в [ListBox] загрузка картинок
Битмап нужно где-то хранить.
При вызове OnApplyStyleLookup просто обновляйте его. Как в моем примере. Только в Вашем случае это будет TImage (как понимаю).
var StyleObject: TFmxObject; ........ StyleObject := FindStyleResource('picturechat') as TImage; if Assigned(StyleObject) then try TImage(StyleObject).Visible := // TRUE/FALSE TImage(StyleObject).OnClick := // Ваш обработчик, если надо if not MBitmap.IsEmpty then try if not GlobalUseGPUCanvas then TImage(StyleObject).Bitmap.Canvas.BeginScene; TImage(StyleObject).Bitmap := MBitmap; // ваш битмап finally if not GlobalUseGPUCanvas then TImage(StyleObject).Bitmap.Canvas.EndScene; end; finally end; типа того.
'picturechat' - ваша картинка в стиле Итема
а хранить изображения можно как контейнерах, так и читать из файлов (все достаточно быстро по скорости!)
а вот с подгрузкой из инета - не знаю - Вам самим решать. Оптимально, думаю, загружать в контейнер, предварительно изменив размер до минимально необходимого.
P.S. Забыл про StylesData
можно так:
вместо всего что написано выше, записать просто
StylesData['picturechat.bitmap'] := MBitmap;
-
AngryOwl получил реакцию от Kitty в С Наступающим Новым Годом!
Присоединяюсь!
Желаю всем здоровья, благополучия и успехов в работе и личной жизни!
С наступающим Новым Годом!
-
AngryOwl получил реакцию от Andrey Efimov в С Наступающим Новым Годом!
Присоединяюсь!
Желаю всем здоровья, благополучия и успехов в работе и личной жизни!
С наступающим Новым Годом!