Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.08.2013, 14:28
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Отображение процесс соединения

Как отобразить процесс соединения ADOConnection, а то пользователи нервничать начинают,
пока программа соединяется с сервером и загружает таблицы из удалённой БД.
Ответить с цитированием
  #2  
Старый 25.08.2013, 14:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

TProgressBar, TAnimate
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 25.08.2013, 15:12
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от NumLock
TProgressBar, TAnimate

Какие компоненты использовать, я знаю. Мне идея нужна.
Пока в голову пришла только одна:

Код:
ADOConn.Connected := true;
Progressbar.position := 20;
Application.ProcessMessages;
ADOTable1.Open;
Progressbar.position := 20;
Application.ProcessMessages;
...

4ре таблицы + само соединение. А если ещё будут таблицы... Покрасивее ничего нет?
Ответить с цитированием
  #4  
Старый 26.08.2013, 14:38
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от Uniq!
4ре таблицы + само соединение. А если ещё будут таблицы... Покрасивее ничего нет?
Ну так если время соединения изначально неизвестно, так ничего красивее и не получится. Обычно в таких случаях используется не прогрессбар, а анимация какая-нибудь, которая показывает что программа не зависла.
__________________
Google в помощь
Ответить с цитированием
  #5  
Старый 26.08.2013, 20:20
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Если во время запуска программы выполняются какие-то потенциально перечисляемые действия, вроде ADOTable1.Open из приведенного примера, их имена можно их выводить в заставке, как это делает Delphi или Photoshop.

Поскольку в соседней теме автор просил помощи в борьбе с быдлокодом, сразу скажу, что так как на примере писать не нужно. Должна быть некая общая процедура, выводящая "Загружается %s" в окне заставки. Вызов этой процедуры должен стоять в событии BeforeOpen, в AfterOpen можно поставить очистку строки. Причем, если у означенных компонентов нет своих обработчиков данных событий, обработчик должен быть один на все таблицы сразу. Если же у некоторых свой обработчик есть, добавляем в него вызов процедуры статуса (именно для этого нам и понадобилась процедура). Для остальных компонентов обработчик будет по-прежнему один общий.

В качестве имен можно выводить имя компонента или значащую часть имени, убрав префиксы/постфиксы "ADO", если есть. Заодно будет повод назвать компоненты по-нормальному, а не ADOTable1, ADOTable2. Если же хочется совсем по-человечески, придется завести таблицу подстановки, в которой имя компонента соответствует читабельному наименованию. Красота требует жертв.

Под таблицей подстановки подразумевается не столько таблица БД, сколько типизированная константа массивового типа в самой программе. Я бы сделал именно так.
Ответить с цитированием
  #6  
Старый 01.09.2013, 21:06
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Freeman
... как это делает Delphi или Photoshop.
Отказ от прогрессбара - адекватное решение.

Цитата:
Сообщение от Freeman
Поскольку в соседней теме автор просил помощи в борьбе с быдлокодом
Подкиньте ссылочку. Не могу найти эту "тему".

Цитата:
Сообщение от Freeman
BeforeOpen, в AfterOpen можно поставить очистку строки.
Всё остальное косметика. А компоненты всегда обзываю адекватно. Просто пример писал на скорую руку.

И ещё, пожалуйста, подскажите небыдлокодерский вариант создания Экрана загрузки приложения.
Думал сделать (дополнительную) форму, на OnShow которой, загрузить все таблицы. Но где вызвать её рождение ума не приложу.

Последний раз редактировалось Uniq!, 01.09.2013 в 22:24.
Ответить с цитированием
  #7  
Старый 02.09.2013, 02:58
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Uniq!
Подкиньте ссылочку. Не могу найти эту "тему".
Ну как же, та самая, "факельная".

Цитата:
Сообщение от Uniq!
Думал сделать (дополнительную) форму, на OnShow которой, загрузить все таблицы. Но где вызвать её рождение ума не приложу.
На самом деле должно быть наоборот. Программа выполняет основные действия, которые, если нужно отображаются где-либо в интерфейсе. По-умному это зовется неинтерактивный процесс или неинтерактивное выполнение -- пользователь не может вмешаться в него. Ему в противоположность бывает интерактивный процесс или диалог, когда все пляшет вокруг интерфейса.

Нужно обычным порядком создать форму, разместить на ней необходимые компоненты, а потом предусмотреть публичный метод:
Код:
type
  TSplashForm = class(TForm)
    ProgressLabel: TLabel;
    ...
  public
    procedure ShowProgressFor(const LoadingItem: string);
  end;

var
  SplashForm: TSplashForm;

resourcestring
  sLoadingItem = 'Загрузка %s...';

procedure TSplashForm.ShowProgressFor(const LoadingItem: string);
begin
  if LoadingItem <> '' then
    ProgressLabel.Caption := Format(sLoadingItem, [LoadingItem]);
  else
    ProgressLabel.Catpion := '';
  ProgressLabel.Update;
end;
Соответственно, у DataSet-ов вызывать:
Код:
procedure DataSetBeforeOpen(DataSet: TDataSet);
begin
  if SplashForm <> nil then
    SplashForm.ShowProgressFor(DataSet.Name);
end;

procedure DataSetAfterOpen(DataSet: TDataSet);
begin
  if SplashForm <> nil then
    SplashForm.ShowProgressFor('');
end;

Получается ровно так, как писал в предыдущем сообщении. Возможно, вместо TLabel для ProgressLabel лучше использовать TStaticText, чтобы перерисовывалась только его область, а не вся форма. Такое поведение предполагаю, по коду VCL не смотрел.
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Uniq! (02.09.2013)
  #8  
Старый 02.09.2013, 08:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Freeman
...
Получается ровно так, как писал в предыдущем сообщении. Возможно, вместо TLabel для ProgressLabel лучше использовать TStaticText, чтобы перерисовывалась только его область, а не вся форма. Такое поведение предполагаю, по коду VCL не смотрел.

вообще, такая форма называется "Splash-screen".
по сути - обычная форма, но без единого интерактивного контрола (кнопки и т.д.), т.е. юзеру там просто нечего кликать.
создается в файле проекта перед автоматическим созданием главной формы, уничтожается перез запуском цикла обработки сообщений (Application.Run). Вообще, погугли, примеров куча как такое делать.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Uniq! (02.09.2013)
  #9  
Старый 03.09.2013, 12:31
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Код:
procedure TForm1.FormActivate(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to ADOConnection1.DataSetCount - 1 do
  begin
    ADOConnection1.DataSets[i].Open;
    Caption := Format('Загружаю %s', [ADOConnection1.DataSets[i].Name]);
    Sleep(1000);
  end;
end;

Мне понравилось то, что можно перебрать все привязанные к ADOConnection DataSet'ы.

Sleep() для наглядности (в реальном приложении его нет)
Ответить с цитированием
  #10  
Старый 03.09.2013, 14:55
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Да, с ADOConnection решение удачное, но навешивание кода на FormActivate меня напрягает. FormShow и FormActivate -- интерактивные события, и выполнять внутри них пакетные действия, не связанные непосредственно с отображением или активацией формы логически неверно и чревато факапами в будущем.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:52.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025