x11 Posted April 14, 2021 Share Posted April 14, 2021 Так как компонента типа "SlideShow" в UniGUI отсутствует, пришлось соорудить своего "франкенштейна" на базе основной панели, где layout = accordion, а внутри лежат несколько дочерних панелей с uniImage. По некоторым причинам нужно программным способом, т.е. отдельными кнопками (командами) листать дочерние панели с картинками. Как это можно сделать? Даже не знаю, в какую сторону копать. Спасибо. Link to comment Share on other sites More sharing options...
Sherzod Posted April 14, 2021 Share Posted April 14, 2021 На форуме были решения. Link to comment Share on other sites More sharing options...
x11 Posted April 14, 2021 Author Share Posted April 14, 2021 О, вроде нашел, попробую http://forums.unigui.com/index.php?/topic/10779-how-expandcollapse-accordion-panels-by-pressing-a-button/&do=findComment&comment=81982 спасибо Link to comment Share on other sites More sharing options...
x11 Posted April 14, 2021 Author Share Posted April 14, 2021 1 hour ago, Sherzod said: На форуме были решения. вопрос по теме http://forums.unigui.com/index.php?/topic/9429-panels-in-a-accordion-layout/&do=findComment&comment=48877 а как вместо uname отправить jsname? function afterrender(sender, eOpts) { var me=sender; me.items.items.forEach(function(item){ item.addListener('expand', function(){ ajaxRequest(me, '_expandorcollapse', ['uname='+me.layout.getExpanded()[0].uname]); }) }); } т.к. для кода UniSession.AddJS('Ext.onReady(function () {' + YourPanelJSName + '.expand()});'); требуется JSName Спасибо. Link to comment Share on other sites More sharing options...
Sherzod Posted April 14, 2021 Share Posted April 14, 2021 Попробуйте nm вместо uname. 1 Link to comment Share on other sites More sharing options...
x11 Posted April 14, 2021 Author Share Posted April 14, 2021 Все получилось. Спасибо. А еще вопрос, хотя и не совсем по теме: а layout типа accordion можно заставить разворачиваться по горизонтали, а не по вертикали? Т.е. с лева на право. Link to comment Share on other sites More sharing options...
x11 Posted April 14, 2021 Author Share Posted April 14, 2021 И еще вопрос. можно ли как-то заменить иконки + и - на другие? А то + и - это добавить/удалить, а не свернуть/развернуть. Спасибо. Link to comment Share on other sites More sharing options...
Sherzod Posted April 14, 2021 Share Posted April 14, 2021 3 hours ago, x11 said: И еще вопрос. можно ли как-то заменить иконки + и - на другие? Я проверю. 1 Link to comment Share on other sites More sharing options...
x11 Posted April 15, 2021 Author Share Posted April 15, 2021 Мне кажется, можно как-то через шрифты fontawesome, там есть шевроны Link to comment Share on other sites More sharing options...
x11 Posted April 15, 2021 Author Share Posted April 15, 2021 On 4/14/2021 at 11:42 AM, Sherzod said: На форуме были решения. Вопрос по коду function afterrender(sender, eOpts) { var me=sender; me.items.items.forEach(function(item){ item.addListener('expand', function(){ ajaxRequest(me, '_expandorcollapse', ['uname='+me.layout.getExpanded()[0].uname]); }) }); } а как быть, если панели добавляются в runtime? Пользователь нажимает "Добавить картинки", выбирает несколько и картинки грузятся на сервер и по количеству картинок программно создается такое же количество дочерних панелей с картинками. т.е. как ко вновь добавленным дочерним панелям прикрутить что-то вроде: addListener('expand', function(){ ajaxRequest(me, '_expandorcollapse', ['uname='+me.layout.getExpanded()[0].uname]); Спасибо. Link to comment Share on other sites More sharing options...
x11 Posted April 15, 2021 Author Share Posted April 15, 2021 Правильно ли я делаю? procedure TfrdParentEditObj.AddImage(const AStream: TStream; const FileName: string); ... begin ... ... pnlImage := TUniPanelPhotos.Create(pnlPhotos); pnlImage.JSInterface.JSAddListener('expand', 'function afterCreate(sender) { ' + 'var me = sender; ' + 'me.addListener(''expand'', ' + ' function(){ajaxRequest(me, ''_expandorcollapse'', [''uname=''+me.layout.getExpanded()[0].uname])});' + '}' ); ... ... что-то не так, т.к. не отправляется ajaxRequest Link to comment Share on other sites More sharing options...
Sherzod Posted April 15, 2021 Share Posted April 15, 2021 7 hours ago, x11 said: pnlImage.JSInterface.JSAddListener('expand', 'function afterCreate(sender) { ' + 'var me = sender; ' + 'me.addListener(''expand'', ' + ' function(){ajaxRequest(me, ''_expandorcollapse'', [''uname=''+me.layout.getExpanded()[0].uname])});' + '}' ); Попробуйте так: pnlImage.JSInterface.JSAddListener('expand', 'function (me) { ' + ' ajaxRequest(me, ''_expandorcollapse'', [''uname=''+me.layout.getExpanded()[0].uname]);' + '}' ); Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 я ж правильно понимаю, что Listener нужно добавлять к дочерним панелям с картинками? Или нужно добавлять к родительской панели? потому что пока не хочет работать, и ошибок в консоли нет Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 я добавил colsole.log(''123''); pnlImage.JSInterface.JSAddListener('expand', 'function (me) { ' + ' colsole.log(''123''); ajaxRequest(me, ''_expandorcollapse'', [''uname=''+me.layout.getExpanded()[0].uname]);' + '}' ); и в консоли ничего нет вот полный код добавления панелей с картинками: type TUniPanelPhotos = class(TUniPanel) public img: TuniImage; end; ... ... ... procedure TfrdParentEditObj.FileUploadMultiCompleted(Sender: TObject; Files: TUniFileInfoArray); begin // process files after all files are uploaded for var I := Low(Files) to High(Files) do if Assigned(Files[I].Stream) then AddImage(Files[I].Stream, Files[I].FileName); end; procedure TfrdParentEditObj.AddImage(const AStream: TStream; const FileName: string); Var ImgData: TImageData; sLocalPath, ADest, sURL: string; img: TUniImage; pnlImage: TUniPanelPhotos; begin // добавить фото к объекту sLocalPath := GetPhotoDirOfObject(fID.ToString, fCurrSuperType); if not DirectoryExists(sLocalPath) then ForceDirectories(sLocalPath); ADest := IncludeTrailingPathDelimiter(sLocalPath) + filename; Imaging.InitImage(ImgData); Imaging.LoadImageFromStream(AStream, ImgData); Imaging.SaveImageToFile(ADest, ImgData); //панель, на которой будет лежать картинка pnlImage := TUniPanelPhotos.Create(pnlPhotos); pnlImage.Name := constPnlPhotoImageName + (pnlPhotos.ControlCount + 1).ToString; pnlImage.Title := FileName; pnlImage.Parent := pnlPhotos; pnlImage.JSInterface.JSAddListener('expand', 'function (me) { ' + ' colsole.log(''123''); ajaxRequest(me, ''_expandorcollapse'', [''uname=''+me.layout.getExpanded()[0].uname]);' + '}' ); //картинка, которая будет лежать на панели img := TUniImage.Create(pnlImage); pnlImage.img := img; img.Parent := pnlImage; img.LayoutConfig.Width := 'auto'; img.LayoutConfig.Height := '100%'; if TFile.Exists(ADest) then begin sURL := GetPhotoUrlOfObject(fID.ToString, fCurrSuperType); img.Url := sURL + FileName + GetNoCacheString; img.Hint := img.Url; pnlImage.Hint := FileName; UniSession.AddJS('Ext.onReady(function () {' + pnlImage.JsName + '.expand()});');//раскрываем последнюю добавленную fActivePhotoPanelName := pnlImage.Name; end; Imaging.FreeImage(ImgData); end; Link to comment Share on other sites More sharing options...
Sherzod Posted April 16, 2021 Share Posted April 16, 2021 5 minutes ago, x11 said: я ж правильно понимаю, что Listener нужно добавлять к дочерним панелям с картинками? Или нужно добавлять к родительской панели? потому что пока не хочет работать, и ошибок в консоли нет Да, Тогда попробуйте такой код: pnlImage.JSInterface.JSAddListener('afterrender', 'function (sender, eOpts)'+ '{ '+ ' var me=sender; '+ ' me.items.items.forEach(function(item){'+ ' item.addListener("expand", function(){'+ ' ajaxRequest(me, "_expandorcollapse", ["uname="+me.layout.getExpanded()[0].uname]);'+ ' })'+ ' }); '+ '} ' ); Либо используйте: ClientEvents Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 4 minutes ago, Sherzod said: Тогда попробуйте такой код: нет, не работает 4 minutes ago, Sherzod said: Либо используйте: ClientEvents как именно, подскажите, пожалуйста Link to comment Share on other sites More sharing options...
Sherzod Posted April 16, 2021 Share Posted April 16, 2021 5 minutes ago, x11 said: как именно, подскажите, пожалуйста Попробуйте: ... pnlImage.ClientEvents.ExtEvents.Values['afterrender'] := 'function afterrender(sender, eOpts)'+ '{ '+ ' var me=sender; '+ ' me.items.items.forEach(function(item){'+ ' item.addListener("expand", function(){'+ ' ajaxRequest(me, "_expandorcollapse", ["uname="+me.layout.getExpanded()[0].uname]);'+ ' })'+ ' }); '+ '} ' Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 16 minutes ago, Sherzod said: Да, не совсем понял код "function afterrender(sender, eOpts)'+" нужно к родительской панели добавлять или к каждой дочерней? Link to comment Share on other sites More sharing options...
Sherzod Posted April 16, 2021 Share Posted April 16, 2021 Just now, x11 said: нужно к родительской панели Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 добавил colsole.log(''123''); нет, не работает, никаких сообщений в консоли нет procedure TfrdParentEditObj.FileUploadMultiCompleted(Sender: TObject; Files: TUniFileInfoArray); begin inherited; // process files after all files are uploaded for var I := Low(Files) to High(Files) do if Assigned(Files[I].Stream) then AddImage(Files[I].Stream, Files[I].FileName); pnlPhotos.ClientEvents.ExtEvents.Values['afterrender'] := 'function afterrender(sender, eOpts)'+ '{ colsole.log(''123''); '+ ' var me=sender; '+ ' me.items.items.forEach(function(item){'+ ' item.addListener("expand", function(){'+ ' ajaxRequest(me, "_expandorcollapse", ["uname="+me.layout.getExpanded()[0].uname]); colsole.log(''123'');'+ ' })'+ ' }); '+ '} '; end; pnlPhotos - это родительская панель что еще может быть не так? Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 такое впечатление, что при открытом фрейме, когда загружаешь картинки, код "pnlPhotos.ClientEvents.ExtEvents.Values['afterrender'] :=" в браузер не попадает из бэкэнда Link to comment Share on other sites More sharing options...
Sherzod Posted April 16, 2021 Share Posted April 16, 2021 8 minutes ago, x11 said: pnlPhotos. Назначаете имя? Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 pnlPhotos лежит на фрейме пустая и имя не меняется. пользователь нажимает Добавить фото, выбирает 1 или несколько и нажимает загрузить срабатывает код, описанный выше: procedure TfrdParentEditObj.FileUploadMultiCompleted(Sender: TObject; Files: TUniFileInfoArray); begin inherited; // process files after all files are uploaded for var I := Low(Files) to High(Files) do if Assigned(Files[I].Stream) then AddImage(Files[I].Stream, Files[I].FileName); //добавляем событие pnlPhotos.ClientEvents.ExtEvents.Values['afterrender'] := 'function afterrender(sender, eOpts)'+ '{ colsole.log(''123''); '+ ' var me=sender; '+ ' me.items.items.forEach(function(item){'+ ' item.addListener("expand", function(){'+ ' ajaxRequest(me, "_expandorcollapse", ["uname="+me.layout.getExpanded()[0].uname]); colsole.log(''123'');'+ ' })'+ ' }); '+ '} '; end; а здесь видно, что имена дочерних панелей генерируются вот так: pnlImage1, pnlImage2, pnlImage3 //панель, на которой будет лежать картинка pnlImage := TUniPanelPhotos.Create(pnlPhotos); pnlImage.Name := constPnlPhotoImageName + (pnlPhotos.ControlCount + 1).ToString; Link to comment Share on other sites More sharing options...
Sherzod Posted April 16, 2021 Share Posted April 16, 2021 1 minute ago, x11 said: colsole.log(''123''); Выводится? Link to comment Share on other sites More sharing options...
x11 Posted April 16, 2021 Author Share Posted April 16, 2021 нет, вообще ничего Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now