Jump to content

Ошибки в TUniDBGrid


x11

Recommended Posts

Я заметил несколько ошибок. Чтобы не создавать несколько похожих тем, скину их сюда.

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;

 

После обновления исчезает меню "Столбцы"

2.gif

Link to comment
Share on other sites

 

Я так полагаю, проблема в том, что каждый раз пересоздается DataSet

было

cdsSessions.CreateDataSet;

cdsSessions.EmptyDataSet;

 

стало

cdsSessions.Open;
cdsSessions.EmptyDataSet;

т.е. CreateDataSet; теперь только один раз при открытии фрейма.

Но это не решило проблему.

 

Link to comment
Share on other sites

2.

Вот ещё проблема. Если курсор мышки подвести к заголовку через привязанный к столбцу элемент фильтра (Combobox), то кнопка с выпадающим меню не появляется.

Я понимаю, что это может быть проблема ExtJS. Но вы наверное имеете доступ к технической поддержке, к авторам этого фрейморка. Сообщите им, может они исправят эту проблему.

3.gif

Link to comment
Share on other sites

3.

Во время работы приложения в браузере нет столбца-индикатора. Проверяю свойства Options - индикатор включен.Screenshot_4.jpg.0c90f9cefc083c5a31a831182f0f0f15.jpg

 

Screenshot_3.jpg

Link to comment
Share on other sites

21 minutes ago, x11 said:

Во время работы приложения в браузере нет столбца-индикатора. Проверяю свойства Options - индикатор включен.

Да к сожалению, dgIndicator не поддерживается в ExtJS.

Но Вы можете использовать примерно такой подход:

Или же использовать опцию dgRowNumbers... 

Link to comment
Share on other sites

2 minutes ago, Sherzod said:

Да к сожалению, dgIndicator не поддерживается в ExtJS.

Ок, понял. Спасибо за быстрый ответ.

Вопрос  вдогонку: а почему вы тогда не скроете подобные настройки из Диспетчера свойств?

Link to comment
Share on other sites

8 minutes ago, x11 said:

Вопрос  вдогонку: а почему вы тогда не скроете подобные настройки из Диспетчера свойств?

Я открою запрос в портале поддержки.

  • Like 1
Link to comment
Share on other sites

4.

Включил тему Material. Все стало ОЧЕНЬ крупное. Но это не самая большая проблема.

Теперь кнопки в заголовках всех таблиц частично не кликабельны, т.е. нет реакции на щелчок мышки, если щелкать по треугольнику.

А если щелкать выше или ниже треугольника, то меню выпадает.

Такая же проблему и у темы triton. Возможно и у других тем тоже есть.

А пользователь будет щелкать именно на треугольник.

Screenshot_7.jpg

Link to comment
Share on other sites

5.

Не знаю, записывать ли это в проблемы/ошибки. Но всё равно напишу здесь. Это, скорей, неудобство, а не ошибка.

Столбцов у меня очень много. И меню на экран не вмещается. Приходится прокручивать.

И вот проблема в том, что колесо мышки не работает для прокрутки.

А вот эти кнопочки очень маленькие, неудобно попадать по ним мышкой. И неудобно тянуться то вверх экрана, то вниз экрана.

Screenshot_8.jpg

Link to comment
Share on other sites

10 minutes ago, x11 said:

Теперь кнопки в заголовках всех таблиц частично не кликабельны, т.е. нет реакции на щелчок мышки, если щелкать по треугольнику.

Какой браузер используете?

Link to comment
Share on other sites

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;

 

 

Link to comment
Share on other sites

  • 3 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...