kami
-
Постов
643 -
Зарегистрирован
-
Посещение
-
Победитель дней
41
Активность репутации
-
kami получил реакцию от Dinkin в Развертка на Mac
Если XCode 8 (что, собственно, и должно было произойти при обновлении) то работать не будет. Для 8 хкода нужен 10.1 берлин
-
kami получил реакцию от Dinkin в Развертка на Mac
А вот это имхо странно. Если SDK подтянулось, то компилятор вообще не лезет на мак. Хотя, с учетом XCode8 - да, ошибки могут пойти любые, ибо SDK не тот...
-
kami получил реакцию от krapotkin в Пример работы с TObjectList
Не буду разводить холивар, тем более что with или не with имеет кучу обсуждений, в которых высказывались и именитые разработчики. Скажем так - использование with делает код не явным (например - в классе, где используется эта конструкция с with тоже есть метод SaveToFile или свойство Text) и плохо читается сторонним разработчиком. Но - каждый решает для себя.
-
kami получил реакцию от Rusland в Пример работы с TObjectList
Не буду разводить холивар, тем более что with или не with имеет кучу обсуждений, в которых высказывались и именитые разработчики. Скажем так - использование with делает код не явным (например - в классе, где используется эта конструкция с with тоже есть метод SaveToFile или свойство Text) и плохо читается сторонним разработчиком. Но - каждый решает для себя.
-
kami отреагировална Равиль Зарипов (ZuBy) в Пример работы с TObjectList
если вам не понятен этот код
For i:=0 to List.Count-1 do with List.Items[i] do begin Position.Y:=Position.Y+0.5; end; то его можно переписать следующим образом
for i:=0 to List.Count-1 do List.Items[i].Position.Y := List.Items[i].Position.Y+0.5;
UPDATE: http://delphicode.org/delphi/with.htm
-
kami отреагировална krapotkin в Механизмы синхронизации потоков в Android?
http://docwiki.embarcadero.com/Libraries/Seattle/en/System.SyncObjs
например, критические секции, или менее известный
http://docwiki.embarcadero.com/Libraries/XE5/en/System.SysUtils.TMultiReadExclusiveWriteSynchronizer
-
kami получил реакцию от MrAnderson в argument out of range Listview(Баг ?)
точно не правильно.
1. Создавать TNetHTTPClient нужно в execute потока, а не использовать лежащий на форме.
2. Работать с визуальными объектами нельзя из execute, об этом 100500 раз предупреждали.
Посему, правильно с технической точки зрения (упустим пока архитектуру) будет:
1. в execute создать сетевой компонент и выполнить запрос.
2. Распарсить запрос
3. Передать результаты в основной поток и уже в нем работать с ListView.
Полезно для правильного написания вынести код потока в отдельный модуль. Который НИЧЕГО не должен знать о модуле формы. Поток должен иметь событие, через которое он передает результаты своей работы куда надо. Само собой - вызывать это событие нужно в основном потоке, используя средства синхронизации. Форма при создании потока назначает ему обработчик события и выполняет в нем необходимые действия.
-
kami получил реакцию от Rusland в argument out of range Listview(Баг ?)
точно не правильно.
1. Создавать TNetHTTPClient нужно в execute потока, а не использовать лежащий на форме.
2. Работать с визуальными объектами нельзя из execute, об этом 100500 раз предупреждали.
Посему, правильно с технической точки зрения (упустим пока архитектуру) будет:
1. в execute создать сетевой компонент и выполнить запрос.
2. Распарсить запрос
3. Передать результаты в основной поток и уже в нем работать с ListView.
Полезно для правильного написания вынести код потока в отдельный модуль. Который НИЧЕГО не должен знать о модуле формы. Поток должен иметь событие, через которое он передает результаты своей работы куда надо. Само собой - вызывать это событие нужно в основном потоке, используя средства синхронизации. Форма при создании потока назначает ему обработчик события и выполняет в нем необходимые действия.
-
kami получил реакцию от Просто Проги в argument out of range Listview(Баг ?)
точно не правильно.
1. Создавать TNetHTTPClient нужно в execute потока, а не использовать лежащий на форме.
2. Работать с визуальными объектами нельзя из execute, об этом 100500 раз предупреждали.
Посему, правильно с технической точки зрения (упустим пока архитектуру) будет:
1. в execute создать сетевой компонент и выполнить запрос.
2. Распарсить запрос
3. Передать результаты в основной поток и уже в нем работать с ListView.
Полезно для правильного написания вынести код потока в отдельный модуль. Который НИЧЕГО не должен знать о модуле формы. Поток должен иметь событие, через которое он передает результаты своей работы куда надо. Само собой - вызывать это событие нужно в основном потоке, используя средства синхронизации. Форма при создании потока назначает ему обработчик события и выполняет в нем необходимые действия.
-
kami получил реакцию от Andrey Efimov в argument out of range Listview(Баг ?)
точно не правильно.
1. Создавать TNetHTTPClient нужно в execute потока, а не использовать лежащий на форме.
2. Работать с визуальными объектами нельзя из execute, об этом 100500 раз предупреждали.
Посему, правильно с технической точки зрения (упустим пока архитектуру) будет:
1. в execute создать сетевой компонент и выполнить запрос.
2. Распарсить запрос
3. Передать результаты в основной поток и уже в нем работать с ListView.
Полезно для правильного написания вынести код потока в отдельный модуль. Который НИЧЕГО не должен знать о модуле формы. Поток должен иметь событие, через которое он передает результаты своей работы куда надо. Само собой - вызывать это событие нужно в основном потоке, используя средства синхронизации. Форма при создании потока назначает ему обработчик события и выполняет в нем необходимые действия.
-
kami получил реакцию от Rusland в Проверка свойств-методов объектов
Не претендую на самое лаконичное решение, но проверку можно организовать так:
var tmp: TNotifyEvent; // понятно, что тут должен быть нужный тип события, лень смотреть, что там с OnKeyDown begin tmp:=myProc; if (TMethod(OnActivate).Code = TMethod(tmp).Code) and (TMethod(OnActivate).Data = TMethod(tmp).Data) then ;// именно myProc - обработчик события OnActivate
-
kami получил реакцию от enatechno в Паттерн Наблюдатель
Так куда уж подробнее
Всё, что может меняться - должно иметь интерфейс подписки. Все заинтересованные объекты должны подписываться и отписываться. А уж реализация и передаваемая информация - это детали.
У меня, например, в качестве события об уведомлении используется вот такое:
type TNotificationAction = (naAdd, naChange, naDelete); TNotificationEvent<T> = procedure(Sender: TObject; Action: TNotificationAction; const Param: T) of object; Можете глянуть в исходники FMX, фраза для поиска - FreeNotification
-
kami получил реакцию от Ufomaster в Паттерн Наблюдатель
Так куда уж подробнее
Всё, что может меняться - должно иметь интерфейс подписки. Все заинтересованные объекты должны подписываться и отписываться. А уж реализация и передаваемая информация - это детали.
У меня, например, в качестве события об уведомлении используется вот такое:
type TNotificationAction = (naAdd, naChange, naDelete); TNotificationEvent<T> = procedure(Sender: TObject; Action: TNotificationAction; const Param: T) of object; Можете глянуть в исходники FMX, фраза для поиска - FreeNotification
-
kami получил реакцию от Равиль Зарипов (ZuBy) в Паттерн Наблюдатель
Так куда уж подробнее
Всё, что может меняться - должно иметь интерфейс подписки. Все заинтересованные объекты должны подписываться и отписываться. А уж реализация и передаваемая информация - это детали.
У меня, например, в качестве события об уведомлении используется вот такое:
type TNotificationAction = (naAdd, naChange, naDelete); TNotificationEvent<T> = procedure(Sender: TObject; Action: TNotificationAction; const Param: T) of object; Можете глянуть в исходники FMX, фраза для поиска - FreeNotification
-
kami получил реакцию от Равиль Зарипов (ZuBy) в Паттерн Наблюдатель
https://github.com/jimmckeeth/DelphiPatterns
-
kami получил реакцию от Равиль Зарипов (ZuBy) в Развертка на Mac
Если XCode 8 (что, собственно, и должно было произойти при обновлении) то работать не будет. Для 8 хкода нужен 10.1 берлин
-
-
kami получил реакцию от Kitty в TMS Pack for FireMonkey
Ничего в нем отличного нет. У меня подписка на эти компоненты, со всей ответственностью заявляю - TMS веббраузер - всего лишь надстройка над штатными нативными реализациями из FMX начиная с версии 3.0. До этого они использовали на мобильных платформах - реализацию из FMX (не уверен в этом утверждении, давненько было), на десктопе - хромиум.
Причем ввиду того, что в FMX есть некоторые привязки к стандартному веббраузеру, многое из того, что штатно работает с TWebBrowser, не хочет работать с TMSWebBrowser. В качестве примера - вы не можете разместить TMSWebBrowser на закладке табконтрола. Вернее, можете, но результат вас не обрадует.
-
kami получил реакцию от Brovin Yaroslav в TBitmap и экономия памяти
Не совсем. То есть - технически правильно, но идеологически - нет.
Проведем мысленный эксперимент: что случится, если на BeginScene возникнет исключение? Правильно, битмап не будет уничтожен, потому что этот код не выполнялся внутри Try. Поэтому, если заниматься буквоедством, то код должен выглядывать так:
MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]); try Image1.Bitmap.Canvas.BeginScene; try Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20); finally Image1.Bitmap.Canvas.EndScene; end; finally myBitmap.Free; end; -
kami получил реакцию от Steepe_Hare в TBitmap и экономия памяти
Не совсем. То есть - технически правильно, но идеологически - нет.
Проведем мысленный эксперимент: что случится, если на BeginScene возникнет исключение? Правильно, битмап не будет уничтожен, потому что этот код не выполнялся внутри Try. Поэтому, если заниматься буквоедством, то код должен выглядывать так:
MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]); try Image1.Bitmap.Canvas.BeginScene; try Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20); finally Image1.Bitmap.Canvas.EndScene; end; finally myBitmap.Free; end; -
kami получил реакцию от Равиль Зарипов (ZuBy) в TBitmap и экономия памяти
Не совсем. То есть - технически правильно, но идеологически - нет.
Проведем мысленный эксперимент: что случится, если на BeginScene возникнет исключение? Правильно, битмап не будет уничтожен, потому что этот код не выполнялся внутри Try. Поэтому, если заниматься буквоедством, то код должен выглядывать так:
MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]); try Image1.Bitmap.Canvas.BeginScene; try Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20); finally Image1.Bitmap.Canvas.EndScene; end; finally myBitmap.Free; end; -
kami отреагировална Andrey Efimov в Тест функционала форума - Спойлер
Добавили кнопку "Спойлер" в редактор форума. Теперь можно прятать большие картинки/текст под спойлер.
-
kami получил реакцию от Andrey Efimov в Методы шифрования delphi
всё классно, за исключением:
2,3,6 - исключительно под win.
5 - судя по комментариям в исходниках - тоже только win.
4 - мормоты и не позиционировались как кросс-платформенные.
Итого остается только TurboPack / TurboPower LockBox (подозреваю, что это одно и то же).
-
-
kami получил реакцию от Rusland в Методы шифрования delphi
всё классно, за исключением:
2,3,6 - исключительно под win.
5 - судя по комментариям в исходниках - тоже только win.
4 - мормоты и не позиционировались как кросс-платформенные.
Итого остается только TurboPack / TurboPower LockBox (подозреваю, что это одно и то же).