Конференция "Базы" » обновление dbgrid [D7, IB6.x]
 
  • Богдан (16.06.09 05:12) [0]
    как получить данные в дбгрид, так чтобы они при загрузке программы отображались сразу
  • Sirus (16.06.09 08:04) [1]
    Если компоненты доступа к данным находятся на отдельном TDataModule, то в событии OnCreate главной формы, иначе в onShow: Открыть базу и датасет.
    Привязка DBGrid -> DataSource -> DataSet
  • MsGuns © (16.06.09 08:59) [2]
    >Sirus   (16.06.09 08:04) [1]
    >Если компоненты доступа к данным находятся на отдельном TDataModule, то в событии >OnCreate главной формы, иначе в onShow: Открыть базу и датасет.

    Датамодуль тут не играет рояли
    Если в событии OnShow, то будет эффект "белых" окон.
    Предпочтительнее в OnActivate с флажком.
    Например,

    procedure TForm1.FormActivate..
    begin
      if Tag=0 then
          ... Открытие датасета
      Tag := 0;
    end;
    end;
  • Ega23 © (16.06.09 09:06) [3]

    > Предпочтительнее в OnActivate с флажком.


    Это очень спорный вопрос, что тут предпочтительнее.
    Лично я такие вещи в OnCreate ставлю. Либо в инициализации фрейма (последнее время на фреймах GUI предпочитаю строить). Но точно не на OnFormShow или OnFormActivate
  • MsGuns © (16.06.09 09:20) [4]
    Угу, и при запуске проги юзер наблюдает скатерть или фрагменты будущего окна :)
    Особенно если нет соединения или запрос выполняется достаточно долго.
  • Ega23 © (16.06.09 09:31) [5]

    > Угу, и при запуске проги юзер наблюдает скатерть или фрагменты
    > будущего окна :)


    У меня не наблюдает. Что я делаю не так?
  • ANB (16.06.09 10:00) [6]

    > У меня не наблюдает. Что я делаю не так?

    Не пишешь запросы, которые работают по 5-16 часов.
    Я пишу, посему у меня всегда кнопочка "обновить" прицеплена.
    :)
  • Ega23 © (16.06.09 10:04) [7]

    > Я пишу, посему у меня всегда кнопочка "обновить" прицеплена.


    Блин, ну ты же не цепляешь их на FormCreate :)
  • sniknik © (16.06.09 10:47) [8]
    > Не пишешь запросы, которые работают по 5-16 часов.
    если открывать такой в OnCreate то это приведет только к тому, что форма откроется через 5-16 часов с полностью заполненным гридом.
    никаких "скатертей или фрагментов будущего окна" не будет.
  • MsGuns © (16.06.09 11:15) [9]
    >никаких "скатертей или фрагментов будущего окна" не будет.

    Смотря какие компоненты доступа и как используются
  • sniknik © (16.06.09 11:31) [10]
    есть компоненты которые умудряются рисовать на форме при отсутствии оной?
    чудесные наверное компоненты. Хотабыч делал.
  • MsGuns © (16.06.09 11:38) [11]
    Рисуют, конечно, не компоненты. Они просто дают "дышать" основному потоку :)
  • sniknik © (16.06.09 11:43) [12]
    > Они просто дают "дышать" основному потоку :)
    ну и что? создание не завершилось, следующих за ним событий типа шоу/активейта не будет.

    проверь, накидай сделай кучу компонент себе на форму и пропиши код в онгрейт типа

    procedure TForm1.FormCreate(Sender: TObject);
    var
     i: integer;
    begin
     for i := 1 to 100 do begin
       Sleep(50);
       Application.ProcessMessages;
     end;
    end;



    можешь поставить там не 100 а 1000 например, и жди до посинения.
  • sniknik © (16.06.09 11:47) [13]
    для показательности можеш еще вот это добавить
    procedure TForm1.FormShow(Sender: TObject);
    begin
     ShowMessage('Show');
    end;

    procedure TForm1.FormActivate(Sender: TObject);
    begin
     ShowMessage('Activate');
    end;

  • Ega23 © (16.06.09 12:07) [14]

    > можешь поставить там не 100 а 1000 например, и жди до посинения.


    1000 для посинения мало, бери 100000.
  • oldman © (16.06.09 14:45) [15]
    У меня DBGrid привязан к DataSource.
    DataSource правда привязан к Table
    И если TableName указан прямо и свойство Active=True, то при открытии окна сразу все видно.
    Так же, как и в дизайн-тайм.

    ЗЫ: Правда программа маленькая и использует только одну таблицу.
  • Игорь Шевченко © (16.06.09 15:03) [16]
    Я при длинных запросах делаю так:

    const
     UM_RETRIEVEDATA = WM_APP+666;

    type
     TfFoo = class(TForm)
       procedure FormShow(Sender: TObject);
      procedure FormCreate(Sender: TObject);
     strict private
       procedure UmRetrieveData (var Message: TMessage); message UM_RETRIEVEDATA;
     end;

    procedure TfFoo.FormCreate(Sender: TObject);
    begin
     ...
     панельзаставки.BoundsRect := контролсданными.BoundsRect;
     панельзаставки.BringToFront;
    end;

    procedure TfFoo.FormShow(Sender: TObject);
    begin
     PostMessage(Handle, UM_RETRIEVEDATA, 0, 0);
    end;

    procedure TfFoo.UmRetrieveData(var Message: TMessage);
    begin
     Update;
     Application.ProcessMessages;
     Screen.Cursor := crSQLWait;
     try
       открыть запрос с данными;
     finally
       Screen.Cursor := crDefault;
     end;
     контролсданными.BringToFront;
    end;

    на месте того контрола, где показываются данные запроса, помещаю панельзаставки с заголовоком "fetching data, please wait"
  • Ega23 © (17.06.09 12:54) [17]

    > Игорь Шевченко ©   (16.06.09 15:03) [16]


    Интересный вариант. Возьму на заметку.
  • Игорь Шевченко © (17.06.09 14:57) [18]
    Ega23 ©   (17.06.09 12:54) [17]

    Как альтернатива - выполнять запрос в отдельном потоке (тоже, кстати, работает), но кода писать больше.
  • Ega23 © (17.06.09 14:59) [19]

    > Как альтернатива - выполнять запрос в отдельном потоке (тоже,
    >  кстати, работает), но кода писать больше.


    Не, отдельный поток - это не для нас. :)
    На самом деле довольно слабо могу себе представить клиента под БД, который запросы в отдельном потоке фигачит. Ну разве что, когда быкап делает.
  • Игорь Шевченко © (17.06.09 15:29) [20]

    > На самом деле довольно слабо могу себе представить клиента
    > под БД, который запросы в отдельном потоке фигачит


    Э...у меня полно таких случаев. Например, на главной странице проекта настроить графиков по текущему состоянию, или показать какие-то события, которые могут подтолкнуть пользователя на какие-то действия, а могут и не подтолкнуть. Суть в чем - если пользователь уходит с главной страницы, то потоки благополучно заполняют себе промежуточные dataset'ы, благо небольшие, захочет - обратно вернется и увидит данные, не захочет, выберет другие задачи - ну что же, не сложилось. Заставлять его ждать, пока не выберутся все данные негуманно - может, он программу с другой целью открыл ? Разумеется, это все настраивается, можно отказаться от таких запросов, но выглядит симпатично.
  • Ega23 © (17.06.09 15:53) [21]

    > Разумеется, это все настраивается, можно отказаться от таких
    > запросов, но выглядит симпатично.


    Да не, я не спорю. Если это аналитика и рекордсеты приходят действительно небольшие (а вот сами запросы - очень тяжёлые), то пуркуа бы и не па.
    У меня, просто, несколько другой срез задач.
  • Anatoly Podgoretsky © (18.06.09 07:11) [22]

    > можешь поставить там не 100 а 1000 например, и жди до посинения.

    За 50 секунд не успеет остыть.
  • имя (19.08.09 14:18) [23]
    Удалено модератором
  • имя (01.12.09 12:31) [24]
    Удалено модератором
  • имя (01.12.09 12:31) [25]
    Удалено модератором
 
Конференция "Базы" » обновление dbgrid [D7, IB6.x]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]