Jump to content

x11

uniGUI Subscriber
  • Posts

    2822
  • Joined

  • Last visited

  • Days Won

    13

Everything posted by x11

  1. А можно подробнее? Может есть пример?
  2. Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.
  3. У вас там что, одна настройка на всех пользователей?
  4. Зачем, если пользователь ничего не менял? 1. Ненужная нагрузка на сервер БД. 2. Засоряет ненужными данными БД. 3. Ненужная нагрузка на HTTP-сервер. 4. Ненужная нагрузка в общем, на весь сервер. Ладно, я понимаю, если приложение с 1-2 таблицами для 1-2 пользователей, а если 100-200 таблиц и 10-50-100-500 пользователей? Я тоже так раньше делал, но потом перешел на более рациональную модель. Оптимизировать приложение нужно стараться уже на стадии разработки, а не когда оно начнет тормозить.
  5. Я не могу понять, чем отличаются свойства 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 Например, для сохранения и восстановления настроек столбцов. Ну или в других случаях что и для чего правильно использовать? Спасибо
  6. Предисловие. Есть события, которые касаются изменения внешнего вида сетки TUniDBGrid, т.е. когда пользователь столбцы перемещает (меняет местами), меняет размер, прячет или показывает. И после изменения программист должен предоставить пользователю возможность сохранить настройки сетки. Я так и делаю - показываю кнопку Сохранить настройки таблицы. Да, можно кнопку "Сохранить настройки" держать всё время видимой, но зачем нагружать интерфейс и показывать пользователю кнопку, которой он пользуется раз в месяц? Поэтому я показываю кнопку "Сохранить настройки таблицы" только, если пользователь изменил настройки таблицы. Теперь вопрос. У сетки есть события ColumnMove, ColumnResize, но нету события ColumnVisiblity. Т.е. программист не знает, что пользователь скрыл/показал какой-то столбец. Как узнать, что пользователь скрыл или показал столбец? Хотелось бы, чтобы разработчики фрейморка добавили событие, которое отвечает за показ и за скрытие столбца. Или какое-то одно единое событие, например, ColumnChange, которое будет срабатывать во всех этих трех случаях: Move, Resize, Visiblity. Спасибо.
  7. 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;
  8. В Firefox я много раз щелкаю по треугольнику - реакции нет вообще.
  9. Firefox, win 10 x64 В Opera и Chrome такой проблемы не обнаружил
  10. 5. Не знаю, записывать ли это в проблемы/ошибки. Но всё равно напишу здесь. Это, скорей, неудобство, а не ошибка. Столбцов у меня очень много. И меню на экран не вмещается. Приходится прокручивать. И вот проблема в том, что колесо мышки не работает для прокрутки. А вот эти кнопочки очень маленькие, неудобно попадать по ним мышкой. И неудобно тянуться то вверх экрана, то вниз экрана.
  11. 4. Включил тему Material. Все стало ОЧЕНЬ крупное. Но это не самая большая проблема. Теперь кнопки в заголовках всех таблиц частично не кликабельны, т.е. нет реакции на щелчок мышки, если щелкать по треугольнику. А если щелкать выше или ниже треугольника, то меню выпадает. Такая же проблему и у темы triton. Возможно и у других тем тоже есть. А пользователь будет щелкать именно на треугольник.
  12. Ок, понял. Спасибо за быстрый ответ. Вопрос вдогонку: а почему вы тогда не скроете подобные настройки из Диспетчера свойств?
  13. А можно это сделать с помощью 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. А сеток у меня будет много.
  14. 3. Во время работы приложения в браузере нет столбца-индикатора. Проверяю свойства Options - индикатор включен.
  15. 2. Вот ещё проблема. Если курсор мышки подвести к заголовку через привязанный к столбцу элемент фильтра (Combobox), то кнопка с выпадающим меню не появляется. Я понимаю, что это может быть проблема ExtJS. Но вы наверное имеете доступ к технической поддержке, к авторам этого фрейморка. Сообщите им, может они исправят эту проблему.
  16. Я так полагаю, проблема в том, что каждый раз пересоздается DataSet было cdsSessions.CreateDataSet; cdsSessions.EmptyDataSet; стало cdsSessions.Open; cdsSessions.EmptyDataSet; т.е. CreateDataSet; теперь только один раз при открытии фрейма. Но это не решило проблему.
  17. Не получается закрыть это меню, пока не переоткроешь фрейм.
  18. Ок, как временное решение можно и так. А какое свойство TUniDBGrid отвечает за отображение меню "Столбцы"? Чтобы скрыть это меню, чтобы список столбцов не грузился по 50 раз. У меня, например, в приложении очень много столбцов (приложение по работе с разного рода объявлениями, где много-много параметров).
  19. Я заметил несколько ошибок. Чтобы не создавать несколько похожих тем, скину их сюда. 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; После обновления исчезает меню "Столбцы"
  20. Я имею ввиду, чтобы сделать вот так:
  21. Вопрос по TUniDBGrid. У каждой колонки есть в заголовке кнопка, где выпадает меню с пунктами сортировки и "Столбцы". Непонятно зачем реализовано так, у каждого столбца есть меню "Столбцы". Почему бы это меню не перенести в одну единственную кнопку над столбцом Индикатор? Я уверен, это разгрузит форму и уменьшит передачу данных между клиентом и сервером, что положительно отразится на производительности и сервера, и клиента. Особенно, если в приложении очень много столбцов. Если это возможно, подскажите, как это реализовать. Спасибо.
  22. x11

    TUniComboTrigger

    Можно заодно и справку подправить. http://www.unigui.com/doc/online_help/api/uniComboBox_TUniComboTrigger.html
  23. x11

    TUniComboTrigger

    Странно, но в ChangeLog ни единого упоминания
×
×
  • Create New...