![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие окна
batya17 © (2006-07-20 03:19:00)НELP!!! Как сделать так чтобы при закрытии окна появлялось сообщение, что то вроде "Вы действительно хотите выйти" и кнопки да и нет если нет то прога не закрывается. Если знаеет отправте мне на мыло
batya15@rambler.ruЗаранее спасибо.
PSPF2003 (2006-07-21 13:08:00) [1]Спасибо за лекцию. Хм.. есть над чем задуматься.
Юрий Зотов (2006-07-21 13:00:00) [2]> PSPF2003 © (21.07.06 10:07) [30]
Книга, видимо, все же полезная. Действительно, ну не может же Борланд в своей справке рассказать об всем - и как работает клавиатура, и как обрабатываются прерывания, и как... и как... Тем более, что к Delphi все это напрямую не относится. Предполагается, что программист (раз уж он программист) знает все это из других источников - вот таки источником отчасти и служит эта книга.
Книга В.В. Фаронова, о которой Вы говорите тоже полезна, и даже очень. Советую капитально в ней разобраться - поверьте, что это снимет море проблем, и далеко не только (и даже далеко не столько) по разработке компонентов.
Просто каждую книгу стоит читать вдумчиво, не доверяя автору на все 100. Особенно в тех местах, где он говорит о недостатках Борландовского кода или о каких-то "нестандартных приемах". Честно говоря, я думаю, что о недостатках Борландовского кода имеет право говорить лишь тот, кто сам способен написать что-то такого же уровня, как Delphi и VCL. А прежде, чем учиться нестандартгым приемам, стоило бы как следует освоить стандартные (кстати, после этого наверняка произойдет странная вещь - неожиданно выяснится, что значительная часть приемов, которые раньше считались нестандартными вдруг почему-то стала вполне стандартной).
PSPF2003 (2006-07-21 10:07:00) [3]
> такого рода огрехи будешь спользовать
Нет, нет я не про сам код. В книге очень много информации. Ну например каким образом идет “обработка” нажатия на клавиатуру и много прочих мелочей подобных этой.
Мефисто (2006-07-21 10:00:00) [4]
> PSPF2003 © (21.07.06 09:37) [28]
Кому как…
Вот это зря ;)
Если программирование - это твой основной род занятий, то я бы задумался.
Если такого рода огрехи будешь спользовать в своих разработках - проблем не оберешся.
PSPF2003 (2006-07-21 09:37:00) [5]Хм... Возможно в книге и есть недостатки но для себя я нашел очень много интересной информации. Кому как…
Мефисто (2006-07-21 09:36:00) [6]
> PSPF2003 © (21.07.06 09:24) [24]
Книгу Юрия Ревича лучше в в лесок на отдых возьми (костерчик разжечь :) )
Мефисто (2006-07-21 09:32:00) [7]
> PSPF2003 © (21.07.06 08:13) [20]
Блин, хотел отзыв о книге оставить. Да говорят - отзыв слишком длинный - не отослать :(
http://www.bhv.ru/books/book.php?id=12155
PSPF2003 (2006-07-21 09:28:00) [8]Блин опять соврал не Архангельского а Фаранова. :)
PSPF2003 (2006-07-21 09:24:00) [9]
> P.S. ИШ, у вас появился новый кумир :) Видать Юрий Ревич
> ярый конкурент Архангельского :)))
Кумиры тут не причем. Покупаю ты литературу которая есть в наличии. А Архангельского есть только одна книга по созданию компонентов. Их (книг) вообще не видел в продаже.
Мефисто (2006-07-21 09:12:00) [10]
> PSPF2003 © (21.07.06 08:13) [20]
Gauge1.AddProgress(1);
меняем на
Gauge1.Progress := I;
И каков результат :)
Мефисто (2006-07-21 09:00:00) [11]Application.ProcessMessages; {прорисовка Label}
А ведь начинающие могут и купиться.
P.S. ИШ, у вас появился новый кумир :) Видать Юрий Ревич ярый конкурент Архангельского :)))
Мефисто (2006-07-21 08:57:00) [12]
> PSPF2003 © (21.07.06 08:13) [20]
А.... Как и ожидалось. Автор книги жжот!!!
Не блоков try, не учитывается и что мы могли бы в OpenDialog нажать кнопку Cancel или ввести имя файла вручную.
Вот это LOL:
BlockRead(ff,PChar(st)^,1); {читаем в строку по одному байту}
Gauge1.AddProgress(1);
Application.ProcessMessages; {прорисовка ползунка}
Яркий пример как не надо кодить!
PSPF2003 (2006-07-21 08:13:00) [13]Вот адрес смотрите сами www.Pspf2003.narod.ru\POLZUNOK.rar
98 304 байт
Германн (2006-07-21 02:19:00) [14]2
> Джо © (21.07.06 02:01) [18]
<offtop>
Серёга, ну и как твои ощущения через полсуток после "назначения любимой женой"? :-)
</offtop>
Джо (2006-07-21 02:01:00) [15]> Нестандартные приемы программирования на Delphi"!
Вот оно в чем дело, оказывается! :))
Германн (2006-07-21 02:00:00) [16]
> Так у кого же руки кривые - у меня, у Вас, у Юрия Ревича
> или у программистов Borland'а?
Не Юрий, Вы не врубились в PSPF2003 © (20.07.06 21:19) [8].
Вы же привели стандартноерешение! А вышеупомянутая книга Юрия Ревича (не читал её, увы) называется, если верить автору [8] - "Нестандартные приемы программирования на Delphi"!
:-)
Юрий Зотов (2006-07-21 01:33:00) [17]> PSPF2003 © (20.07.06 21:19) [8]
> Так самый ли лучший источник VCL?
ОК, давайте разберемся. Именно на Вашем же примере (точнее, на примере Юрия Ревича, видимо?). Вот программа, которая читает 100-килобайтный файл побайтно, с отбражением в ProgresBar'е и без него. Время чтения в миллисекундах выводится в заголовке формы.
const
FileName = 'C:\100K.tst';
FileSize = 100 * 1024;
StepCount = 500;
StepSize = FileSize div StepCount;
procedure TForm1.FormCreate(Sender: TObject);
var
F: file of byte;
i: integer;
B: byte;
T: cardinal;
begin
AssignFile(F, FileName);
Rewrite(F);
T := GetTickCount;
for i := 1 to FileSize do
begin
B := Lo(i);
Write(F, B)
end;
Caption := Format('Writing: %d msec', [GetTickCount - T]);
CloseFile(F);
ProgressBar1.Width := StepCount;
ProgressBar1.Smooth := True
end;
procedure TForm1.Button1Click(Sender: TObject);
var
F: file of byte;
i: integer;
B: byte;
T: cardinal;
begin
Button1.Enabled := False;
Button2.Enabled := False;
ProgressBar1.Position := 0;
AssignFile(F, FileName);
Reset(F);
T := GetTickCount;
for i := 1 to FileSize do
Read(F, B);
Caption := Format('Reading: %d msec', [GetTickCount - T]);
CloseFile(F);
Button1.Enabled := True;
Button2.Enabled := True
end;
procedure TForm1.Button2Click(Sender: TObject);
var
F: file of byte;
i, j: integer;
B: byte;
T: cardinal;
begin
Button1.Enabled := False;
Button2.Enabled := False;
ProgressBar1.Position := 0;
AssignFile(F, FileName);
Reset(F);
T := GetTickCount;
for i := 1 to StepCount do
begin
for j := 1 to StepSize do
Read(F, B);
ProgressBar1.Position := i
end;
Caption := Format('Showing: %d msec', [GetTickCount - T]);
CloseFile(F);
Button1.Enabled := True;
Button2.Enabled := True
end;
Результаты такие. Запись: 3.6-3.7 сек, чтение без отображения: 0.42-0.44 сек, чтение с отображением: 0.45-0.48 сек. Как видите, дополнительные затраты на прогрессбар составляют всего лишь 0.03-0.04 сек. Согласитесь, что разница с приведенными Вами данными просто огромная.
И тогда возникает два вопроса.
Вопрос номер 1.Так у кого же руки кривые - у меня, у Вас, у Юрия Ревича или у программистов Borland'а? Ведь раз такая огромная разница в результатах, значит, у кого-то они точно кривые. У кого же, как Вы думаете?
Вопрос номер 2.Так какой же источник лучше - исходники VCL или книга Юрия Ревича? Может быть, автору этой книги самому стоило бы почаще в них заглядывать, как Вы думаете?
Мефисто (2006-07-20 22:52:00) [18]
> Плохиш © (20.07.06 22:24) [14]
Ага, вот и мне интересно стало взглянуть на код :)
Уж больно астрономические задержки укзаны в данном посте:
PSPF 2003 © (20.07.06 21:19) [8]
Плохиш (2006-07-20 22:24:00) [19]
> Мефисто (20.07.06 22:19) [13]
Так же, небось, после каждого прочитанного байта кривые руки пытаются что-то обновить.
Мефисто (2006-07-20 22:19:00) [20]
> Плохиш © (20.07.06 21:55) [12]
Там самый тормоз TProgresBar т.к. все время мессаги шлет и обрабатывает их. Вызвана эта бяка тем, что TProgressBar - это обертка для Windows Progress Bar Control.
procedure TProgressBar.SetPosition(Value: Integer);
begin
if not F32BitMode and ((Value < 0) or (Value > Limit16)) then
ProgressLimitError;
if HandleAllocated then SendMessage(Handle, PBM_SETPOS, Value, 0)
else FPosition := Value;
end;
Guage шустрее, т.к. мессагами не парится:
procedure TGauge.SetProgress(Value: Longint);
var
TempPercent: Longint;
begin
TempPercent := GetPercentDone; { remember where we were }
if Value < FMinValue then
Value := FMinValue
else if Value > FMaxValue then
Value := FMaxValue;
if FCurValue <> Value then
begin
FCurValue := Value;
if TempPercent <> GetPercentDone then { only refresh if percentage changed }
Refresh;
end;
end;
> PSPF2003 © (20.07.06 21:19) [8]
Так что временные интервалы для Guage слишком! преувеличины. ProgressBar - да тормоз. Но и для него временной интервал слишком велик. Всеравно, там что-то не чисто :)