-
Постов
394 -
Зарегистрирован
-
Посещение
-
Победитель дней
45
Сообщения, опубликованные AngryOwl
-
-
-
6 минут назад, Равиль Зарипов (ZuBy) сказал:
У TBitmap есть такой метод, посмотрите его
function TBitmap.EqualsBitmap(const Bitmap: TBitmap): Boolean; var MyMap, BitmapMap: TBitmapData; I: Integer; begin if IsEmpty or Bitmap.IsEmpty then begin Result := IsEmpty and Bitmap.IsEmpty; Exit; end; Result := (Width = Bitmap.Width) and (Height = Bitmap.Height) and (PixelFormat = Bitmap.PixelFormat); if Result then begin if Map(TMapAccess.Read, MyMap) then try if Bitmap.Map(TMapAccess.Read, BitmapMap) then try for I := 0 to Height - 1 do if not CompareMem(MyMap.GetScanline(I), BitmapMap.GetScanline(I), MyMap.BytesPerLine) then begin Result := False; Exit; end; finally Bitmap.Unmap(BitmapMap); end; finally Unmap(MyMap); end; end; end;
Интересно!
Т.е., как я понимаю, идея такова - перед тем как начать сравнивать (искать "пустой" битмап), создаем прототип "пустого" битмапа (нужного размера, так как знаем - с чем надо будет сравнивать), а дальше уже каждое изображение сравниваем с данным прототипом?
Гуд. Попробую. Спасибо!
-
1 минуту назад, enatechno сказал:
Полностью согласен. panelstyle - это и есть только один TRectangle. StyleEditor не позволяет его сделать Visible=false. Но можно менять Opacity. Если нужна невидимая панель, то лучше использовать обычный TLayout, который вообще не использует стиль.
Работа с background в TGroupbox зависит от платформы. Посмотрите в редакторе стилей на дефолтный groupboxstyle:
- для платформы Windows: текст, используемый для заголовка группы, расположен на объекте background. Если Вы будете менять видимость или прозрачность background, то текст тоже будет невидимым/прозрачным.
- для платформы Android: текст расположен на отдельном layout. В этом случае изменение видимости/прозрачности background не влияет на отображение текста заголовка.Согласен.
Я, например, делаю либо свой стиль для нужного компонента, либо делаю копию (например от стиля Android), если хочу чтобы выглядело абсолютно одинаково везде.
Можно оставить родной стиль для TPanel, сделав свой стиль, типа panelopacitystyle (и потом задав его вашим панелям, которым требуется именно прозрачность), в котором вы можете изголяться со стилем как вашей душе будет угодно. Заполнять панели чем угодно, хоть картинками... При этом, в чем прелесть, - можно программно менять стиль из приложения при необходимости (например, - реакция на какие-либо события).
-
3 часа назад, Rusland сказал:
enatechno, есть Panel, зашел в Edit Default Style, сделал Rectangle Visible=false, сохранил. Панель не стала прозрачной. Снова захожу в Edit Default Style - у Rectangle Visible=true. Почему?
Если не ошибаюсь, то у стандартного стиля для Panel - TRectangle - это и есть весь стиль ))) Потому и не может быть Visible=False )
Так уберите у него заливку, сделав ее прозрачной. И все.
-
12 минут назад, Равиль Зарипов (ZuBy) сказал:
1) Какие размеры у битмапа?
2) Как и кто заполняет или не заполняет Bitmap
1. Размеры: 320*240, 640*480, 640*360 и др.
2. Заполняет битмапы декодер (в потоках формируется битмап, который копируется, в итоге, в конечный битмап, который и нужно проверить). НЕ заполняться он не может, в нем всегда есть изображение. Другой вопрос, что весь битмап может быть абсолютно "пустым"-черным.
-
2 часа назад, ENRGY сказал:
А зачем вам подряд все пиксели перебирать. Можно по диагонали перебрать к примеру 20-30 пикселей (5%-10% из всех пикселей из этой диагонали-линии).
Я об этом думал. Однако, возможно есть другое решение? Более "правильное"...
Может можно как-то быстро обработать фрагмент памяти, в котором находится битмап, а не бегать циклом по пикселям, сравнивая цвета.
Потому и задал такой вопрос - возможно кто-то знает как это сделать.
-
Привет, друзья!
Подскажите - как, с максимально возможной скоростью, определить отсутствие изображения как такового в TBitmap?
Т.е. - есть TBitmap. Он либо заполнен изображением (картинка), либо он - абсолютно черный прямоугольник.
Каким способом можно узнать - что в нем именно изображение? Т.е. - НЕ абсолютно черный прямоугольник...
И определить это нужно "мгновенно" (условно выражаясь).
Заранее всем благодарен за участие!
P.S. Варианты типа того что ниже - не предлагать)) Хотелось бы что-то "побыстрее"! Еще раз спасибо!
function IsBitmapEmpty(Bmp: TBitmap): Boolean; var X, Y : Integer; BmpData: TBitmapData; yAddr : Integer; AlphaCount : integer; begin Result := False; try AlphaCount := 0; Bmp.Map(TMapAccess.Read, BmpData); for Y := 0 to Bmp.Height div 2 do begin YAddr := Y * Bmp.Height; for X := 0 to Bmp.Width - 1 do if (PAlphaColorArray(BmpData.Data)^[YAddr + X] <> TAlphaColorRec.Null) and (PAlphaColorArray(BmpData.Data)^[YAddr + X] <> TAlphaColorRec.Black) then begin inc(AlphaCount); Break; end; if AlphaCount > 0 then Break; end; finally Bmp.Unmap(BmpData); Result := AlphaCount = 0; end; end;
-
1 минуту назад, Menkos1 сказал:
я уже писал, просто создаем пустую форму и на ней одну кнопку для теста - на этом все, нету никаких стилей, нету никаких дебагеров и прочего
Еще раз повторю - не крупный проект а пустая/чистая созданная форма.!
"Пустая и чистая" форма - вовсе не "пустая". В FMX приложении есть ресурсы. Откройте приложение в редакторе ресурсов (например Restorator 2007 или любой другой) и вы увидите содержимое бинарника. Так-что "пустая/чистая форма" - это в VCL, в FMX иначе.
-
2 минуты назад, Menkos1 сказал:
я до сих пор не понял.
и каким образом XE3 - работает все отлично и запускается моментально.
а на XE6 и XE10.1 с задержкой в 2 секунды.
Какой стиль используется в XE3 и в 6-10 ?
Если свой не подгружаете, то, думаю, - по умолчанию. Какой объем бинарника получается при компиляции Release в XE3, и какой в 10?
Думаю дело может быть в ресурсах, используемых приложением.
-
Флуд...
Нужно понимать разницу между VCL и FMX. Этого достаточно будет чтобы ответить на Ваш вопрос.
-
40 минут назад, AlexShaman сказал:
Создаю файл в Paint (для теста), сохраняю в bmp 32bit 1680x373
tmpIcon.PixelFormat := vcl.Graphics.TPixelFormat.pf32bit;
tmpIcon.Width := 1680;
tmpIcon.Height:= 373;
Какие еще надо установить значения до
tmpIcon.LoadFromStream(tmpStream); ?
Вас не смущает "размер" вашей "иконки"?
Вы в нее решили фотку запилить? Сделайте для теста 32*32
-
Ну первое что в голову приходит - а какой формат вы грузите? Догадываюсь что "bmp", но я про его формат (бит/цвет, сжатие и т.д.).
-
Мне это видится примерно так:
Отключите автоматическое создание форм.
Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.
Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).
На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма
и скройте Splash-форму.
З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!
-
3 часа назад, kami сказал:
Нет, не пойдет. Потому что DoOnCloseInfo по прежнему вызывается из внутренностей TButton.Click. Если ваш код отрабатывает на Windows - это ваша недоработка, а не показатель правильности. Причины я изложил выше. А на мобильных платформах с фреймом визуально просто ничего не произойдет. Причины опять-таки изложил выше.
И в таком виде тоже не пойдет.
Потому что Synchronize и Queue, будучи вызванными из главного потока, моментально передают управление в метод, а не дожидаются очередного витка выборки сообщений у Application. В таком виде вы просто добавляете несколько вложенных вызовов, увеличивая занятость стека. Не меняя при этом концепцию работы.
Согласен!
-
3 минуты назад, kami сказал:
так не пойдет
На Windows - получим тот же AV, ибо по нажатию на кнопку вызовется DoOnCloseInfo, по завершению которой фрейма уже не будет. А во внутренностях TControl по завершению вызова OnClick еще идет обращение к себе.
На мобильной платформе - ничего не случится, потому что ARC и фрейм еще присутствует у своего родителя, простое за nil-ивание ссылки ничего не даст.
Правильный выход - непосредственно в обработчике кнопки сделать fr.Release;
Именно так и пойдет! И под виндой и в других платформах )
Во-первых - DoOnCloseInfo лишь вызовет обработчик этого события в главной форме.
Разве что - только добавить синхронизацию
procedure TframeInfo.DoOnCloseInfo; begin if Assigned(fOnCloseInfo) then TThread.Synchronize(nil, procedure begin fOnCloseInfo(Self); end); end;
-
у фрейма:
private fOnCloseInfo : TNotifyEvent; protected procedure DoOnCloseInfo; dynamic; public { Public declarations } /// <summary> Обработчик события закрытия фрейма </summary> property OnCloseInfo : TNotifyEvent read fOnCloseInfo write fOnCloseInfo; end; procedure TframeInfo.DoOnCloseInfo; begin // Если обработчик назначен, то запускаем его. if Assigned(fOnCloseInfo) then fOnCloseInfo(Self); end;
при инициализации фрейма (не важно где и как - когда создается):
frameInfo.OnCloseInfo := fmMain.DoOnCloseInfo;
при нажатии на кнопку:
DoOnCloseInfo;
в главной (или любой другой форме, которая будет отрабатывать нажатие кнопки во фрейме):
// можно в любой секции, смотря что нам нужно procedure DoOnCloseInfo(Sender: TObject); procedure TfmMain.DoOnCloseInfo(Sender: TObject); begin if Assigned(frameInfo) then FreeAndNil(frameInfo); end;
типа так...
-
При нажатии на кнопку отправить сообщение главной форме, а в обработчике этого сообщения, на который главная форма (условно, можно вообще любую форму) подписана - удалять соответственно этот фрейм.
-
Самое простое решение ("на коленке"):
uses ... {$IFDEF MSWINDOWS} System.Win.ComObj, Winapi.ShlObj, {$ENDIF} ... //------------------------------------------------- type TTaskBarState = record name : string; value : byte; end; TFMXTaskBar = class(TPersistent) private fTaskBarList : ITaskBarList3; fTaskBarState : integer; fTaskBarProgress : integer; fAlertState : Boolean; procedure setTaskBarState(newState:integer); procedure setTaskBarProgress(newValue : integer); procedure setAlertState(const Value: Boolean); protected public property AlertState: Boolean read fAlertState write setAlertState; property TaskBarState : integer read fTaskBarState write setTaskBarState; property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress; constructor Create; destructor Destroy; override; end; //------------------------------------------------- const taskStates : array [0..4] of TTaskBarState = ( (name: 'TBPF_NOPROGRESS'; value: TBPF_NOPROGRESS), (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE), (name: 'TBPF_NORMAL'; value: TBPF_NORMAL), (name: 'TBPF_ERROR'; value: TBPF_ERROR), (name: 'TBPF_PAUSED'; value: TBPF_PAUSED)); //------------------------------------------------- var MainTaskBar: TFMXTaskBar; //------------------------------------------------- { TFMXTaskBar } constructor TFMXTaskBar.Create; var tbList : ITaskBarList; hr : HRESULT; begin tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList; hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList); if hr <> S_OK then begin fTaskBarList := nil; tbList._Release; end; end; destructor TFMXTaskBar.Destroy; begin inherited; end; procedure TFMXTaskBar.setAlertState(const Value: Boolean); begin if assigned(fTaskBarList) then if fAlertState <> Value then begin fAlertState := Value; if Value then begin setTaskBarState(3); // TBPF_ERROR setTaskBarProgress(100); end else begin setTaskBarState(0); setTaskBarProgress(0); end; end; end; procedure TFMXTaskBar.setTaskBarProgress(newValue: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100); end; procedure TFMXTaskBar.setTaskBarState(newState: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value); end; //------------------------------------------------- initialization MainTaskBar := TFMXTaskBar.Create; finalization if Assigned(MainTaskBar) then FreeAndNil(MainTaskBar);
-
Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.
Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".
Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.
Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?
-
В Designmode разместите кнопки "как видите" их на форме (как они должны быть расположены), а потом левой кнопке поставьте Align = None и Anchors[akLeft,akBottom], а правой Align = None и Anchors[akRight,akBottom]. Думаю, что этого будет достаточно.
P.S. Ну и как все будет закончено с их расположением, поставьте им Locked = True (дабы не сместить их ненароком)
-
Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
-
6 минут назад, Равиль Зарипов (ZuBy) сказал:
я тут посидел немного, сделал костыль. особо не заморачивался
- копируем в проект и открываем FMX.Forms.pas
- Ctrl+F -> procedure TCommonCustomForm.SetShowHint(const Value: Boolean);
procedure TCommonCustomForm.SetShowHint(const Value: Boolean); begin FShowHint := Value; ReleaseLastHinted; // ZuBy *** if (not(csDesigning in ComponentState)) then begin FreeAndNil(FSharedHint); FSharedHint := THint.CreateNewInstance(Handle); end; // *** ZuBy end;
- сохраняем
- в событии OnCreate, OnShow пишем
ShowHint := true;
- Готово!
Работает!
А то, что это "костыль" - пофигу! Если бы он был одним единственным... А так - это решение вполне устраивает!
Спасибо!
-
1 минуту назад, Vitaldj сказал:
Не только BorderStyle, но еще что то. А что, я так и не выяснил. Потому что в моем проекте, нет BorderStyle в none, но хинты так и не отображаются!
Думаю, что еще и свойство Transparency, при определенных условиях.
-
Друзья, привет!
Вопрос так и остался актуальным. В случае, если свойства формы BorderStyle = None, то Hint'ы не отображаются!
Собственно это больше вопрос к нашим гуру. Что делать и как быть?
TVideoCaptureDevice, трансляция в потоке
в Компоненты
Опубликовано
Добрый!
Есть. Можно использовать сторонние библиотеки и модули, но цена у них приличная, а можно самому сделать. Вот на счет "самому" - будет непросто))) Очень непросто)