Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

вывод информации   Найти похожие ветки 

 
Drema   (2004-12-25 00:26) [0]

Возникла такая проблема:

В моей программе есть процедура, которая выполняется долго.
Я хочу перед началом выполнения вывести сообщение типа Please Wait...
И делаю это просто:

Procedure Button1click(...);
....
label1.caption="Please Wait...";
<действия>

....

Ну и в результате надпись "Please Wait..." появляется уже после нескольких
секунд томительного ожидания, во время которых выполнялись <действия>.

Как же заставить все это работать правильно?


 
aus   (2004-12-25 00:29) [1]

Procedure Button1click(...);
....
label1.caption="Please Wait...";
Application.ProcessMessages;
<действия>


 
Cosinus ©   (2004-12-25 00:55) [2]

<from DelphiWorld.narod.ru>
[>>>>>>>>>>]

Мне также понадобился логотип для одного из моих клиентов, поэтому я загрузил файл из публичной библиотеки и включил в свое приложение модуль, позволяющий выводить логотип при загрузке программы. В этом модуле было около 150 строк кода, но у меня свое понятие относительно количества необходимого для этого дела кода, поэтому я просто удалил лишнее, для которого просто не нашел применения.

После моего хирургического вмешательства осталось всего пять или шесть строк кода, вплетенных в скелет формы. После сравнения моего кода с демо-проектом, поставляемым с Delphi (MastApp), я понял, что мой код много проще.

Я не хочу обвинять автора в том, что он плохо сделал свою работу. Без его помощи этого кода просто бы не существовало. Я нахожу, что изучение чужого кода всегда существенно расширяет и дополняет багаж программиста.

Код производит впечатление, что создание окошка с логотипом в Delphi плевое дело. Ну за дело: сначала, с помощью редактора, создайте форму (лучшим решением будет создание нового проекта в отдельном каталоге) и установите лучшие, на ваш художественный взгляд, значения таких свойств, как позиция, размеры и границы. Затем создайте обработчик события OnDeactivate и добавьте единственную строчку кода, в которой мы освобождаем форму. И, последнее, добавьте секцию initialization с тремя строчками кода, которые создают, выводят и обновляют форму.

Для того, чтобы использовать новое окошко с логотипом, скопируйте получившийся .PAS-файл в каталог с проектом, в котором вы намереваетесь его использовать, и вставьте ссылку на модуль в самую верхнюю часть секции uses. НЕ добавляйте форму к проекту.

Ниже приведен пример кода (форма имеет имя SplashForm, модуль обозван как SPLASH). Мой код добавлен между закомментаренных блоков {>>вставить} и {<<конец вставки}, весь остальной код генерируется Delphi.

type
 TSplashForm = class(TForm)
   [...labels, bitmaps, и пр., добавляется редактором Delphi...]
   procedure FormDeactivate(Sender: TObject);
 end;

var
 SplashForm: TSplashForm;

implementation

{$R *.DFM}

{ Это шаманское место. Application.Run в нашем случае
вызывает программу деактивации.}

procedure TSplashForm.FormDeactivate(Sender: TObject);
begin
 {>>вставить}
 Free;
 {<<конец вставки}

end;

{>>вставить}

initialization
 begin
   SplashForm := TSplashForm.Create(nil);
   SplashForm.Show;

   { Я не уверен, но причина наличия здесь Update в том,
   что, как мне кажется, приложение пока не может работать
   c очередью своих сообщений}

   SplashForm.Update;
 end;
 {<<конец вставки}
end.



В головном модуле после строчки USES (.DPR-файл) просто добавьте "SPLASH," (не заключайте это в кавычки). Это все. Никакой головной боли с таймерами, никаких запусков отдельных приложений. Логотип быстро появляется и остается до тех пор, пока приложение не начнет свою работу.
[>>>>>>>>>>]

<PS Мне понравилось, как работает код... Но если кто-то из мастеров объяснит, почему так делать не следует или, как вариант, как сделать лучше, то я буду очень благодарен:)))>


 
Drema   (2004-12-25 01:05) [3]

СПАСИБО!! Ура! заработало!


 
Leonid Troyanovsky ©   (2004-12-25 16:03) [4]


> Cosinus ©   (25.12.04 00:55) [2]
> <PS Мне понравилось, как работает код... Но если кто-то
> из мастеров объяснит, почему так делать не следует или,
> как вариант, как сделать лучше, то я буду очень благодарен:)))>


Зависит от.
Самый простой вариант состоит из небольшой формы без бордюра,
fsStayOnTop, содержащей TAnimate(f.e.: clock.avi) Align := alClient, Active := True.

Эта форма удаляется из списка автоматически создаваемых,
а показывается кодом из слегка измененного .dpr


program ProjectX;

uses
 Forms,
 Unit1 in "Unit1.pas" {Form1},
 ..
 UnitX in "UnitX.pas" {SplashForm};

{$R *.res}

begin
 with TSplashForm.Create(nil) do
 try
   Show;
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   ..
 finally
   Free;
 end;
 Application.Run;
end.


--
С уважением, LVT.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
14-1103892481
by
2004-12-24 15:48
2005.01.16
Паттерны проектирование и Delphi.


1-1104205706
DelphiN!
2004-12-28 06:48
2005.01.16
Ошибка при обращении к компонентам из разных Unit-ов в DLL


4-1101201473
-SeM-
2004-11-23 12:17
2005.01.16
Хендл KERNEL32


14-1104388237
Чеширский_Кот
2004-12-30 09:30
2005.01.16
Верите ли вы...


4-1101711707
BVV
2004-11-29 10:01
2005.01.16
Время создания файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский