Аналог LockWindowUpdate в лазарусе ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аналог LockWindowUpdate в лазарусе ?

Сообщение MaratIsk » 16.03.2013 11:26:09

собственно сабж
MaratIsk
постоялец
 
Сообщения: 121
Зарегистрирован: 20.08.2009 18:15:20

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 26.11.2013 11:52:24

Попробую поставить вопрос по другому: для Lunix схожая процедура?
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение pda » 26.11.2013 19:42:05

Думаю, если и есть, то искать надо в тулкитах. А вам с какой целью? Насколько мне известно, большинство тех, кто пользуется этой функцией делает это не правильно и всё равно не достигает цели.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 27.11.2013 13:18:18

Цель этой функции - чисто декоративная, "заморозить" форму на период выполнения различных операций, которые изменяют содержимое этой формы в период своей работы. В Windows я своей цели достиг :D . Но хотелось бы что то универсальное...
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение pda » 27.11.2013 23:56:26

Как было написано по ссылке - вы достигли своей цели только в частном случае. Тормоза, связанные с отрисовкой (которая не отображается) никуда не делись. Лучше посмотрите на предмет .BeginUpdate/.EndUpdate методов компонентов и более правильной организации работы приложения.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 28.11.2013 08:30:08

1. Как прикрутить .BeginUpdate/.EndUpdate к TForm?
2. или 1. Мне надо кроссплатформенное решение.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение pda » 28.11.2013 14:55:27

.BeginUpdate/.EndUpdate прикручиваются не к форме. Они уже есть у TStrings и, следовательно, во всех местах, где они используются. Собственно, к TForm прикручивать ничего и не надо. У вас проблема, как я понимаю, с тем, что она часто перерисовывается. Ну тут совет только доктора из анекдота: "Так не делайте так". Т.е. сначала считаете всё, что вам надо обновить, потом одним махом обновляете.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 28.11.2013 15:49:19

У меня проблема с DataSource, точнее с DBGrid.
Ну, в принципе, интернет тоже молчит по данному вопросу (точнее, тоже советует отображать готовые данные).
К счастью, жизнь разнообразней. Не всегда подходят общие решения.
pda, Спасибо за помощь.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение pda » 28.11.2013 20:21:48

У TDataSet и потомков (всякие *Query) должны быть методы .DisableControls/.EnableControls, которые позволяют проводить операции с набором данных, без обновления экрана. Только потом вернуться надо на старую запись при помощи .Bookmark или .BookmarkStr. Правда я никогда не проверял, как это работает в FPC/Lazarus. :) Но, может и работает уже.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 29.11.2013 10:30:08

У меня, прикольней: я вообще отключаю базу, что бы сделать backup (backup делает внешняя программа из пакета базы). А т.к. программа состоит из одной формы, отсюда и нюансы. Я уже говорил, что блокировка формы - чисто декоративная функция. Просто хотел разобраться с моментом, так на всякий случай, на будущее. Может попозже что то появиться для подобных целей.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение pda » 29.11.2013 22:46:05

На такой случай я бы не пожалел сделать диалоговую форму с сообщением "идёт резервное копирование" и прогрессбаром. Если прогресс снять с внешней утилиты невозможно (и не получается считать объём нового архивного файла), то просто переливающимся.

Блокировать интерфейс не комильфо. Пользователь может решить, что программа повисла, если она перестала реагировать и не успокаевает его. :) Простого универсального решения вашего случая нет, потому что тулкиты справедливо полагают, что это - работа приложения, а стандартные db компоненты на такой фокус не рассчитаны.

Однако, если бы мне кровь из носу надо было воспроизвести такой эффект, я бы сделал следущее:
1. Попробовал бы установить свойство .Enabled главной формы в False. В Windows, в Delphi это приводило к тому, что форма становилась неактивной, но компоненты на ней продолжали выглядеть активными.
2. Потом я бы создал своего потомка TDataSource (или покопался бы в его событиях) и в нём попытался бы заблокировать рассылку уведомления "набор данных отключен" (не помню на память, как он называется). И тогда бы компоненты были бы не доступны для пользователя и продолжали бы думать, что база ещё подключена.
3. После подключения вернул бы текущую запись (но, боюсь здесь Bookmark может не сработать, придётся искать по значению ключевого поля) и только потом разрешил бы отправку сообщений через DataSource.

Это, конечно, тоже хак, но у него больше шансов стать кроссплатформенным решением.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 02.12.2013 09:17:42

У меня давно (как только понял, что средствами Lazarus ничего не получиться) крутиться дурацкая мысль, сделать "фотку" формы, и наложить ее на реальную. Выберу свободную минутку, попробую это выкурить. :D
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: Аналог LockWindowUpdate в лазарусе ?

Сообщение Ustas » 04.12.2013 09:47:31

Доломал...
Кому интересно (а может кто и улучшит мою писанину), кусок:

Код: Выделить всё
// ******************************//
// * блокировка изменения формы *//
// ******************************//
unit myLockWindow;

{$mode objfpc}

interface

uses
  Classes, SysUtils, Graphics, Forms, ExtCtrls, LCLType, LCLIntf, Controls;

function  myLockWindowOn(Form: TForm): Boolean;
procedure myLockWindowOff;

implementation

var
  Bitmap: TBitmap;
  Panel: TPanel;
  Image: TImage;

// получение "фотки" формы и отрисовка изображения
function myLockWindowOn(Form: TForm): Boolean;
var
  ScreenDC: HDC;
begin
  Result := True;
  try
    Bitmap := TBitmap.Create;
    Bitmap.Width := Form.Width;
    Bitmap.Height := Form.Height;
    ScreenDC := GetDC(Form.Handle);
    try
      Bitmap.LoadFromDevice(ScreenDC);
    finally
      ReleaseDC(0, ScreenDC);
    end;
    Panel := TPanel.Create(Form);
    Panel.Visible := False;
    Panel.Parent := Form;
    Image := TImage.Create(Form);
    Image.Parent := Panel;
    Image.Picture.Bitmap := Bitmap;
    Image.Left := 0;
    Image.Top := 0;
    Image.Width := Form.Width;
    Image.Height := Form.Height;
    Panel.BringToFront;
    Panel.Align := alClient;
    Panel.Visible := True;
  except
    Result := False;
    Bitmap.Free;
    Bitmap := nil;
    Image.Free;
    Image := nil;
    Panel.Free;
    Panel := nil;
    raise;
  end;
end;

// закрытие рисунка
procedure myLockWindowOff;
begin
  if Panel <> nil then
    begin
      Panel.SendToBack;
      Panel.Visible := False;
      Bitmap.Free;
      Bitmap := nil;
      Image.Free;
      Image := nil;
      Panel.Free;
      Panel := nil;
    end;
end;

end.

Пробовал по Windows (пока нет возможности попробовать под Lunix). Есть смаргивание при отключении Panel.
Ну а так... вроде нормально.
Ustas
постоялец
 
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 232

Рейтинг@Mail.ru