![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Как отобразить процесс соединения ADOConnection, а то пользователи нервничать начинают,
пока программа соединяется с сервером и загружает таблицы из удалённой БД. |
#2
|
||||
|
||||
![]() TProgressBar, TAnimate
Пишу программы за еду. __________________ |
#3
|
||||
|
||||
![]() Цитата:
Какие компоненты использовать, я знаю. Мне идея нужна. Пока в голову пришла только одна: Код:
ADOConn.Connected := true; Progressbar.position := 20; Application.ProcessMessages; ADOTable1.Open; Progressbar.position := 20; Application.ProcessMessages; ... 4ре таблицы + само соединение. А если ещё будут таблицы... Покрасивее ничего нет? |
#4
|
||||
|
||||
![]() Цитата:
Google в помощь |
#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 -- интерактивные события, и выполнять внутри них пакетные действия, не связанные непосредственно с отображением или активацией формы логически неверно и чревато факапами в будущем.
|