-
Posts
2822 -
Joined
-
Last visited
-
Days Won
13
Content Type
Profiles
Forums
Events
Everything posted by x11
-
А можно подробнее? Может есть пример?
-
Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.
-
Какой кошмар.
-
У вас там что, одна настройка на всех пользователей?
-
Зачем, если пользователь ничего не менял? 1. Ненужная нагрузка на сервер БД. 2. Засоряет ненужными данными БД. 3. Ненужная нагрузка на HTTP-сервер. 4. Ненужная нагрузка в общем, на весь сервер. Ладно, я понимаю, если приложение с 1-2 таблицами для 1-2 пользователей, а если 100-200 таблиц и 10-50-100-500 пользователей? Я тоже так раньше делал, но потом перешел на более рациональную модель. Оптимизировать приложение нужно стараться уже на стадии разработки, а не когда оно начнет тормозить.
-
Я не могу понять, чем отличаются свойства ColID и Index. В справке описания этих свойств не нашёл. http://www.unigui.com/doc/online_help/api/!!MEMBEROVERVIEW_uniDBGrid_TUniCustomDBGridColumn.html http://www.unigui.com/doc/online_help/api/!!MEMBEROVERVIEW_uniDBGrid_TUniDBGridColumn.html http://www.unigui.com/doc/online_help/api/!!MEMBERTYPE_Properties_uniDBGrid_TUniDBGridColumn.html Например, для сохранения и восстановления настроек столбцов. Ну или в других случаях что и для чего правильно использовать? Спасибо
-
Предисловие. Есть события, которые касаются изменения внешнего вида сетки TUniDBGrid, т.е. когда пользователь столбцы перемещает (меняет местами), меняет размер, прячет или показывает. И после изменения программист должен предоставить пользователю возможность сохранить настройки сетки. Я так и делаю - показываю кнопку Сохранить настройки таблицы. Да, можно кнопку "Сохранить настройки" держать всё время видимой, но зачем нагружать интерфейс и показывать пользователю кнопку, которой он пользуется раз в месяц? Поэтому я показываю кнопку "Сохранить настройки таблицы" только, если пользователь изменил настройки таблицы. Теперь вопрос. У сетки есть события ColumnMove, ColumnResize, но нету события ColumnVisiblity. Т.е. программист не знает, что пользователь скрыл/показал какой-то столбец. Как узнать, что пользователь скрыл или показал столбец? Хотелось бы, чтобы разработчики фрейморка добавили событие, которое отвечает за показ и за скрытие столбца. Или какое-то одно единое событие, например, ColumnChange, которое будет срабатывать во всех этих трех случаях: Move, Resize, Visiblity. Спасибо.
-
6. Проблема с колонками - они появляются не на своем месте, перекрывают друг друга. Использую субменю "Столбцы". Т.к. gif большая, то я не буду прикреплять ее, и дам ссылку (см. на самый левый столбец): https://app.box.com/s/syuzar7dig5c53zfsf0wrtbpbx1sa3mx Я подозреваю, что проблема возникает после того, как я сохраняю настройки столбцов (в базу), затем восстанавливаю при открытии фрейма. Использую JSON. Какая-то путаница, наверное, с индексами. Может я неправильное событие использую для восстановления свойств столбцов. Для восстановления использую событие UniFrameCreate. Вот процедура восстановления, может кто-то здесь найдет проблему. procedure TStoreRestore.RestoreGridJSON(const json: string; grid: TUniDBGrid); Var v: TJSONValue; O: TJSONObject; i, idx: integer; u: TUniBaseDBGridColumn; sName: string; arr: TJsonValue; begin if json.IsEmpty or not Assigned(grid) then exit; v := TJSONObject.ParseJSONValue(json); try if v is TJSONObject then o := TJSONObject(v) else exit; if o.Count <= 0 then exit; for I := 0 to pred(o.Count) do begin sName := o.Pairs[i].JsonString.Value; arr := o.Pairs[i].JsonValue; //ищем колонку по FieldName u := grid.ColumnByName(sName); if not Assigned(u) then Continue; // "ID":[0,55,true,false] if arr is TJSONArray then begin if TJSONArray(arr).Count < 4 then continue; // индекс колонки idx := TJSONNumber(TJSONArray(arr).Items[0]).AsInt; // колонок может быть меньше, чем данных в настройках if grid.Columns.Count -1 >= idx then u.Index := idx ; u.Width := TJSONNumber(TJSONArray(arr).Items[1]).AsInt; u.Visible := TJSONBool(TJSONArray(arr).Items[2]).AsBoolean; u.Expanded:= TJSONBool(TJSONArray(arr).Items[3]).AsBoolean; end; end;// for finally v.Free; end; end; Может быть ещё какое-то свойство нужно сохранять и восстанавливать, чтобы столбцы становились на свои места? На всякий случай добавлю и процедуру получения настроек столбцов: function TStoreRestore.GetGridAsJSON(grid: TUniDBGrid): string; Var O: TJSONObject; arrIdx: TJSONArray; i: integer; begin if not Assigned(grid) then exit; o := TJSONObject.Create; try for I := 0 to pred(grid.Columns.Count) do begin arrIdx := TJSONArray.Create; arrIdx.AddElement(TJSONNumber.Create(grid.Columns[i].ColID)); arrIdx.AddElement(TJSONNumber.Create(grid.Columns[i].Width)); arrIdx.AddElement(TJSONBool.Create(grid.Columns[i].Visible)); arrIdx.AddElement(TJSONBool.Create(grid.Columns[i].Expanded)); o.AddPair(TJSONPair.Create(grid.Columns[i].FieldName, arrIdx)); end; result := o.ToJSON; finally o.Free; end; end;
-
В Firefox я много раз щелкаю по треугольнику - реакции нет вообще.
-
Firefox, win 10 x64 В Opera и Chrome такой проблемы не обнаружил
-
5. Не знаю, записывать ли это в проблемы/ошибки. Но всё равно напишу здесь. Это, скорей, неудобство, а не ошибка. Столбцов у меня очень много. И меню на экран не вмещается. Приходится прокручивать. И вот проблема в том, что колесо мышки не работает для прокрутки. А вот эти кнопочки очень маленькие, неудобно попадать по ним мышкой. И неудобно тянуться то вверх экрана, то вниз экрана.
-
4. Включил тему Material. Все стало ОЧЕНЬ крупное. Но это не самая большая проблема. Теперь кнопки в заголовках всех таблиц частично не кликабельны, т.е. нет реакции на щелчок мышки, если щелкать по треугольнику. А если щелкать выше или ниже треугольника, то меню выпадает. Такая же проблему и у темы triton. Возможно и у других тем тоже есть. А пользователь будет щелкать именно на треугольник.
-
Ок, понял. Спасибо за быстрый ответ. Вопрос вдогонку: а почему вы тогда не скроете подобные настройки из Диспетчера свойств?
-
А можно это сделать с помощью TUniClientEvents? Почему я так хочу, отвечаю. При загрузке формы/фрейма я сделал так, что выполняется начальная процедура инициализации настроек сетки UniDBGrid из файла (файлов). Чтобы все сетки на всех фреймах выглядели похоже (одинаково), я выполняю такую процедуру: procedure dbgLoadBeforeInitJs(const dbg: TUniDBGrid); const constMultiColumnSortFileName = 'dbgBeforeInit.js'; Var sl: TStringList; sDbgFileName, sMultiColumnSortFileName, beforeInit: string; begin // config.multiColumnSort = true; sl := TStringList.Create; try //сперва грузим общий файл для всех сеток sMultiColumnSortFileName := IncludeTrailingPathDelimiter(UniServerModule.FilesFolderPath) + constMultiColumnSortFileName; if FileExists(sMultiColumnSortFileName) then begin sl.LoadFromFile(sMultiColumnSortFileName); beforeInit := dbg.ClientEvents.UniEvents.Values['beforeInit']; if beforeInit.IsEmpty then dbg.ClientEvents.UniEvents.Values['beforeInit'] := sl.Text else// если в событии beforeInit уже что-то есть dbg.ClientEvents.UniEvents.Values['beforeInit'] := beforeInit + sLineBreak + sl.Text end; sl.Clear; // теперь грузим файл для конкретной сетки, если он есть sDbgFileName := IncludeTrailingPathDelimiter(UniServerModule.FilesFolderPath) + dbg.Owner.Name + '.' + dbg.Name + '.js';// имя формы/фрейма + имя сетки if FileExists(sDbgFileName) then begin sl.LoadFromFile(sDbgFileName); beforeInit := dbg.ClientEvents.UniEvents.Values['beforeInit']; if beforeInit.IsEmpty then dbg.ClientEvents.UniEvents.Values['beforeInit'] := sl.Text else// если в событии beforeInit уже что-то есть dbg.ClientEvents.UniEvents.Values['beforeInit'] := beforeInit + sLineBreak + sl.Text end; finally sl.Free; end; end; А в файле написано вот так: В итоге мне не надо настраивать каждый раз новую сетку руками в designtime. А сеток у меня будет много.
-
3. Во время работы приложения в браузере нет столбца-индикатора. Проверяю свойства Options - индикатор включен.
-
2. Вот ещё проблема. Если курсор мышки подвести к заголовку через привязанный к столбцу элемент фильтра (Combobox), то кнопка с выпадающим меню не появляется. Я понимаю, что это может быть проблема ExtJS. Но вы наверное имеете доступ к технической поддержке, к авторам этого фрейморка. Сообщите им, может они исправят эту проблему.
-
Я так полагаю, проблема в том, что каждый раз пересоздается DataSet было cdsSessions.CreateDataSet; cdsSessions.EmptyDataSet; стало cdsSessions.Open; cdsSessions.EmptyDataSet; т.е. CreateDataSet; теперь только один раз при открытии фрейма. Но это не решило проблему.
-
-
Ок, как временное решение можно и так. А какое свойство TUniDBGrid отвечает за отображение меню "Столбцы"? Чтобы скрыть это меню, чтобы список столбцов не грузился по 50 раз. У меня, например, в приложении очень много столбцов (приложение по работе с разного рода объявлениями, где много-много параметров).
-
Я заметил несколько ошибок. Чтобы не создавать несколько похожих тем, скину их сюда. 1. Есть фрейм на котором лежит сетка и она автообновляется. Вернее, каждый раз пересоздается DataSet. Взял себе в приложение из вашего примера "монитор сессий". По таймеру срабатывает процедура, во ее код: procedure TfrdSessions.GetSessions; var S : TUniGUISessions; U : TUniGUISession; I : Integer; PageControl: TUniPageControl; TabSheet: TUniTabSheet; begin cdsSessions.DisableControls; dsSessions.DataSet := nil; if cdsSessions.Active then cdsSessions.Close; // если вкладка неактивна, то не обновляем данные if self.Owner is TUniTabSheet then begin TabSheet := TUniTabSheet(self.Owner); if not Assigned(TabSheet) then exit; if TabSheet.Parent is TUniPageControl then begin PageControl := TUniPageControl(TabSheet.Parent); if PageControl.ActivePage <> TabSheet then begin TabSheet.Caption := constSessionsMsgTabCaption; exit; end; end;// if TabSheet.Parent is TUniPageControl then S := UniServerModule.SessionManager.Sessions; S.Lock; // Using Lock on session manager should be used with extreme care. // We should keep the "Lock duration" as short as we can. Session Manager stops working until lock is released. // Excessive use of lock/unlock or keeping the lock active for a long period will make uniGUI server slow/unresponsive. try SetLength(ASessionList, S.SessionList.Count); // Here we do a fast copy of list to another array for later use. for I := 0 to Pred(S.SessionList.Count) do begin U := S.SessionList[I]; ASessionList[I].ASessionId := U.SessionId; ASessionList[I].AIP := U.RemoteIP; ASessionList[I].ALastTime := U.LastTimeStamp; ASessionList[I].UserAgent := U.UserAgent; if Assigned(U.UniMainModule) then // Check mainModule availability. Some sessions may not have a MainModule instance begin ASessionList[I].ALogin := TUniMainModule(U.UniMainModule).SessionUserName; // Access custom MainModule props; ASessionList[I].ActiveForm := TUniMainModule(U.UniMainModule).SessionActiveForm; ASessionList[I].DeviceInfo := TUniMainModule(U.UniMainModule).SessionDeviceType; end; end; finally S.Unlock; // ... and finally don't forget to release lock! end; //cdsSessions.DisableControls; try cdsSessions.CreateDataSet; cdsSessions.EmptyDataSet; for I := Low(ASessionList) to High(ASessionList) do begin cdsSessions.Append; cdsSessions.FieldByName('sessionid').AsString := ASessionList[I].ASessionId; cdsSessions.FieldByName('ip').AsString := ASessionList[I].AIP; cdsSessions.FieldByName('lasttime').AsDateTime := ASessionList[I].ALastTime; cdsSessions.FieldByName('Login').AsString := ASessionList[I].ALogin; cdsSessions.FieldByName('ActiveForm').AsString := ASessionList[I].ActiveForm; cdsSessions.FieldByName('DeviceInfo').AsString := ASessionList[I].DeviceInfo; cdsSessions.FieldByName('UserAgent').AsString := ASessionList[I].UserAgent; cdsSessions.Post; end; if Assigned(TabSheet) then TabSheet.Caption := constSessionsMsgTabCaption; finally SetLength(ASessionList, 0); dsSessions.DataSet := cdsSessions; cdsSessions.EnableControls; // HideMask; end; end; end; После обновления исчезает меню "Столбцы"
-
-
Вопрос по TUniDBGrid. У каждой колонки есть в заголовке кнопка, где выпадает меню с пунктами сортировки и "Столбцы". Непонятно зачем реализовано так, у каждого столбца есть меню "Столбцы". Почему бы это меню не перенести в одну единственную кнопку над столбцом Индикатор? Я уверен, это разгрузит форму и уменьшит передачу данных между клиентом и сервером, что положительно отразится на производительности и сервера, и клиента. Особенно, если в приложении очень много столбцов. Если это возможно, подскажите, как это реализовать. Спасибо.
-
Можно заодно и справку подправить. http://www.unigui.com/doc/online_help/api/uniComboBox_TUniComboTrigger.html
-
Странно, но в ChangeLog ни единого упоминания