![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Как отобразить процесс соединения ADOConnection, а то пользователи нервничать начинают,
пока программа соединяется с сервером и загружает таблицы из удалённой БД. |
|
#2
|
||||
|
||||
|
TProgressBar, TAnimate
|
|
#3
|
||||
|
||||
|
Цитата:
Какие компоненты использовать, я знаю. Мне идея нужна. Пока в голову пришла только одна: Код:
ADOConn.Connected := true; Progressbar.position := 20; Application.ProcessMessages; ADOTable1.Open; Progressbar.position := 20; Application.ProcessMessages; ... 4ре таблицы + само соединение. А если ещё будут таблицы... Покрасивее ничего нет? |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Если во время запуска программы выполняются какие-то потенциально перечисляемые действия, вроде ADOTable1.Open из приведенного примера, их имена можно их выводить в заставке, как это делает Delphi или Photoshop.
Поскольку в соседней теме автор просил помощи в борьбе с быдлокодом, сразу скажу, что так как на примере писать не нужно. Должна быть некая общая процедура, выводящая "Загружается %s" в окне заставки. Вызов этой процедуры должен стоять в событии BeforeOpen, в AfterOpen можно поставить очистку строки. Причем, если у означенных компонентов нет своих обработчиков данных событий, обработчик должен быть один на все таблицы сразу. Если же у некоторых свой обработчик есть, добавляем в него вызов процедуры статуса (именно для этого нам и понадобилась процедура). Для остальных компонентов обработчик будет по-прежнему один общий. В качестве имен можно выводить имя компонента или значащую часть имени, убрав префиксы/постфиксы "ADO", если есть. Заодно будет повод назвать компоненты по-нормальному, а не ADOTable1, ADOTable2. Если же хочется совсем по-человечески, придется завести таблицу подстановки, в которой имя компонента соответствует читабельному наименованию. Красота требует жертв. Под таблицей подстановки подразумевается не столько таблица БД, сколько типизированная константа массивового типа в самой программе. Я бы сделал именно так. |
|
#6
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
И ещё, пожалуйста, подскажите небыдлокодерский вариант создания Экрана загрузки приложения. Думал сделать (дополнительную) форму, на OnShow которой, загрузить все таблицы. Но где вызвать её рождение ума не приложу. Последний раз редактировалось Uniq!, 01.09.2013 в 22:24. |
|
#7
|
||||
|
||||
|
Цитата:
Цитата:
Нужно обычным порядком создать форму, разместить на ней необходимые компоненты, а потом предусмотреть публичный метод: Код:
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;Код:
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
|
|||
|
|||
|
Цитата:
вообще, такая форма называется "Splash-screen". по сути - обычная форма, но без единого интерактивного контрола (кнопки и т.д.), т.е. юзеру там просто нечего кликать. создается в файле проекта перед автоматическим созданием главной формы, уничтожается перез запуском цикла обработки сообщений (Application.Run). Вообще, погугли, примеров куча как такое делать. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Uniq! (02.09.2013)
| ||
|
#9
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Да, с ADOConnection решение удачное, но навешивание кода на FormActivate меня напрягает. FormShow и FormActivate -- интерактивные события, и выполнять внутри них пакетные действия, не связанные непосредственно с отображением или активацией формы логически неверно и чревато факапами в будущем.
|