Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 80)


Программирование на DELPHI
Выпуск #80 (15 марта 2008 г.)

Разделы сайта:

Delphi.int.ru

Новости сайта
Регистрация »
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Рассылки сайта
F.A.Q.

IRC-каналы сайта:

Сервер: irc.dalnet.ru
Порт: 6667
Канал: #delphiintru
(основной)

Сервер: irc.rus.net
Порт: 6667
Канал: #delphi.int.ru
(тестовый)

Ждём Вас на нашем канале!

Доброго времени суток, уважаемые читатели!

Сегодняшний выпуск, можно сказать, обыкновенный, не наделённый чем-то сверхестественным, но и не лишённый свежей информации.

Всем тем, кто только присоединился к нам, рекомендуется зарегистрироваться на сайте. Регистрация предоставит Вам полный доступ к возможностям сайта. К примеру, без регистрации Вы не сможете задавать на сайте вопросы, оставлять комментарии к файлам и участвовать в опросах. Перейти к регистрации »

Если кто-то из читателей готов оказать помощь в развитии рассылки и сайта - пишите. Помощь может быть любая: поиск файлов для добавления на сайт, написание статей, программирование функционала сайта, модерирование вопросов и ответов и др.

В этом выпуске:

Статистика Delphi.int.ru Expert на 15.03.2008, 12:00 (предыдущий подсчёт - 16.02.2008, 10:00):

Количество экспертов: 47 (+2).
Участниками задано вопросов: 1415 (+75).
Экспертами отправлено ответов: 2014 (+88).
Количество сообщений на мини-форумах: 2589 (+133).
Максимальное число разосланных в день писем (за март '08): 1681 (03.03.2008).
Максимальное число разосланных в день писем (за всю историю): 1960 (28.10.2007, +0).

До встречи в следующем выпуске!

Разделы рассылки:

» Авторское слово
» Обучение Delphi
» Delphi.int.ru Expert
» Статья по Delphi
» Файловый архив
» Юмор

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом.

Количество читателей рассылки (15.03.2008, 12:00):
5595+1692+463= 7750 (+60)

Связь по e-mail:

admin@delphi.int.ru
support@delphi.int.ru


Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом
(текущая версия системы: 2.34+; последнее обновление: 29.02.2008)

Последние новости

В начале каждого месяца проходит голосование за лучший ответ месяца и самый интересный вопрос. Победителям вручаются почётные медали.
За февраль медали получили: min@y (лучший ответ) и Cool (лучший вопрос).

23 февраля 2008 г.

Голосование за корректность вопроса сделано обязательным при отправке ответа на вопрос.

 

Архив: вопросы и ответы

В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 356 - 370. Вопросы, на которые не было дано ни одного ответа, не публикуются.
Так как темп поступления вопросов от пользователей намного выше темпа их публикации, в рассылке публикуются вопросы, заданные довольно давно. Тем не менее, вопросы публикуются по порядку, без пропусков. Просмотреть любые вопросы и ответы Вы всегда можете на сайте.

Статистика по выпуску:

Кол-во вопросов: 15
Кол-ответов: 35
Баллы за ответы: 95
 

Вопрос # 356

Здравствуйте господа эксперты.
Подскажите пожалуйста как мне узнать загрузку процессора в ХР.
Заранее благодарю.

Вопрос задал: Яковлев Николай Сергеевич (статус: Посетитель)
Вопрос отправлен: 26 февраля 2007, 08:29 (эксперты)
Всего ответов: 2

 

1. Отвечает эксперт: Роман

Здравствуйте, Яковлев Николай Сергеевич!Вот адрес: http://delphiworld.narod.ru/base/loading_processor.html.И тутже http://delphiworld.narod.ru/_os_.html ещё много ответов на разные вопросы.

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 26 февраля 2007, 10:36
Оценка за ответ: 5

2. Отвечает эксперт: Федоров Роман Сергеевич

Для NT, 2000, XP

const
SystemBasicInformation = 0;
SystemPerformanceInformation = 2;
SystemTimeInformation = 3;

type
TPDWord = ^DWORD;

TSystem_Basic_Information = packed record
dwUnknown1: DWORD;
uKeMaximumIncrement: ULONG;
uPageSize: ULONG;
uMmNumberOfPhysicalPages: ULONG;
uMmLowestPhysicalPage: ULONG;
uMmHighestPhysicalPage: ULONG;
uAllocationGranularity: ULONG;
pLowestUserAddress: Pointer;
pMmHighestUserAddress: Pointer;
uKeActiveProcessors: ULONG;
bKeNumberProcessors: byte;
bUnknown2: byte;
wUnknown3: word;
end;

type
TSystem_Performance_Information = packed record
liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
dwSpare: array[0..75] of DWORD;
end;

type
TSystem_Time_Information = packed record
liKeBootTime: LARGE_INTEGER;
liKeSystemTime: LARGE_INTEGER;
liExpTimeZoneBias: LARGE_INTEGER;
uCurrentTimeZoneId: ULONG;
dwReserved: DWORD;
end;

var
NtQuerySystemInformation: function(infoClass: DWORD;
buffer: Pointer;
bufSize: DWORD;
returnSize: TPDword): DWORD; stdcall = nil;

liOldIdleTime: LARGE_INTEGER = ();
liOldSystemTime: LARGE_INTEGER = ();

function Li2Double(x: LARGE_INTEGER): Double;
begin
Result := x.HighPart * 4.294967296E9 + x.LowPart
end;

procedure GetCPUUsage;
var
SysBaseInfo: TSystem_Basic_Information;
SysPerfInfo: TSystem_Performance_Information;
SysTimeInfo: TSystem_Time_Information;
status: Longint; {long}
dbSystemTime: Double;
dbIdleTime: Double;

bLoopAborted: boolean;

begin
if @NtQuerySystemInformation = nil then
NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
'NtQuerySystemInformation');

// get number of processors in the system

status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo,
SizeOf(SysBaseInfo), nil);
if status <> 0 then
Exit;

// Show some information
with SysBaseInfo do
begin
ShowMessage(
Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13 +
'uMmNumberOfPhysicalPages: %d' + #13 + 'uMmLowestPhysicalPage: %d' + #13 +
'uMmHighestPhysicalPage: %d' + #13 + 'uAllocationGranularity: %d'#13 +
'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d' ,
[uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,
uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,
uKeActiveProcessors, bKeNumberProcessors]));
end;

bLoopAborted := False;

while not bLoopAborted do
begin

// get new system time
status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo,
SizeOf(SysTimeInfo), 0);
if status <> 0 then
Exit;

// get new CPU's idle time
status := NtQuerySystemInformation(SystemPerformanceInformation,
@SysPerfInfo, SizeOf(SysPerfInfo), nil);
if status <> 0 then
Exit;

// if it's a first call - skip it
if (liOldIdleTime.QuadPart <> 0) then
begin

// CurrentValue = NewValue - OldValue
dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) -
Li2Double(liOldIdleTime);
dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) -
Li2Double(liOldSystemTime);

// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime := dbIdleTime / dbSystemTime;

// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors
+ 0.5;

// Show Percentage
Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %', dbIdleTime);

Application.ProcessMessages;

// Abort if user pressed ESC or Application is terminated
bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or
Application.Terminated;

end;

// store new CPU's idle and system time
liOldIdleTime := SysPerfInfo.liIdleTime;
liOldSystemTime := SysTimeInfo.liKeSystemTime;

// wait one second
Sleep(1000);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetCPUUsage
end;

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 26 февраля 2007, 12:30
Оценка за ответ: 5


Вопрос # 357

Здравствуйте уважаемые эксперты!
Подскажите, как получать Index подсвеченной строки в выпавшем списке компонента TComboBox при передвижении по этому списку курсора, до того как пользователь сделает выбор, т.е. до нажатия кнопки. Возможность редактирования в элементе ввода компонента должна сохраняться.

Вопрос задал: NickStNew (статус: Посетитель)
Вопрос отправлен: 26 февраля 2007, 13:59 (эксперты)
Всего ответов: 3

 

1. Отвечает эксперт: Вадим К

Единственный способ, который я знаю - это сделать отрисовку вручну. Тогда в OnDrawIten вам будет приходить сообщение о необходимости перерисовать себя вы смотрите, у данного итема состояние не выделеное случайно.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 февраля 2007, 14:24
Оценка за ответ: 4
Комментарий: Index подсвеченной строки получается, но только если выбрать style="csOwnerDrawFixed" или csOwnerDawVariable. При этом не работает редактирование в строке ввода

2. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, NickStNew!
Попробуйте так:см приложение.
Через таймер, запуск таймера когда ComboBox получает фокус и останов когда ComboBox его теряет. Interval = 100.
Если пользователь ничего не выбрал остается тот индекс который был до получения фокуса.
Удачи!

Приложение:

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Ответ отправлен: 26 февраля 2007, 17:23
Оценка за ответ: 5
Комментарий: Спасибо, все работает

3. Отвечает эксперт: Шарайчук Сергій Олександрович

Здравствуйте, NickStNew!
Попробу написать код для событея ONChange, а Index получить попробуй следуйщим способом:
i:=ComboBox1.item.itemindex

Ответ отправил: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Ответ отправлен: 26 февраля 2007, 20:17
Оценка за ответ: 3
Комментарий: К сожелению ответ неточен. Событие OnChange при перемещении курсора (и подсвеченной строки) по выпавшему списку компонента TComboBox не вызывается


Вопрос # 358

У меня проблема, хочу зделать програму, которая реагируєт на копирование, тойсть например если её скопировали 1 раз она делает одно, 2 раза - другое, 3 раза совсем иное. Одним словом потавить счотчик на копирование! ПОМОГИТЕ ПОЖАЛУСТА!!!!

Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Вопрос отправлен: 26 февраля 2007, 21:49 (эксперты)
Всего ответов: 3; сообщений в мини-форуме вопроса: 2

 

1. Отвечает эксперт: Роман

Здравствуйте, Шарайчук Сергій Олександрович!Странная какая-то идея...Попробуйте поискать чего-нибудь на http://www.delphikingdom.com/ там есть материаль о защите программ от копирования и взлома.Только не ясно, а где хранить информацию о кол-ве копирований,если во внешнем файле то какой в этом смысл...Да и откуда прога копироваться будет(?) с CD? Незнаю,разве что защищать её по ключевой дискете и запретить ей копироваться без неё и всё это дело шифровать...или электронным ключём на МК...Всёравно ломанут,да и стоит ли оно того...а цена...Вобщем:http://www.delphikingdom.com/ ...И кстати зачем всё это,смысл то в чём???

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 26 февраля 2007, 23:01

2. Отвечает эксперт: Вадим К

Спешу вас разочаровать, но такое практически невозможно. Если программа не запускается, то она не сможет выполнить никакого кода. В своё время группа программистов разработала большой проект по защите музыкальных дисков от копирования. Были вложены немеряные деньги. И перед окончательным выходом в свет защиту ломанули. Причём банально. Защита полагалась на то, что у пользователя включен автозапуск компакта. Стартовала маленькая прога, которая потом препятствовала копированию музыки. Но скажите, чем отличается копирование музыки на другой носитель от её воспроизведения с программной точки зрения? ничем! В любом случае её нужно вначале считать. А как вы могли догадаться, ломанули её зажатым Shift'ом. Мальчика назвали немеряным хакером и долго охотились за ним.
Это был лирический отступ.
Но если ваша программа устанавливается либо вы первоначально настраиваете её сами, то тут есть один обходной манёвр. Либо написать драйверок, который будет сидеть в памяти и перехватывать все копирования и смотреть, не моё ли - очень сложно сделать на делфи (да, да на 3 делфи можно драйвера компилить, на старших - нет) да и систему будет тормозить (ну антивирь почти:))
Либо сделать привязку к железу. И если при запуске не совпадает номер - увеличиваем счётчик. Но если с проги сняли 2 копии, то каждая с них будет жить отдельной жизнью.
Хотя есть идея. Вносим в программу код, на который явно будет ругаться антивирус (аля FORMAT C: и так далее) но этот код выполнятся не будет. Дальше при настройке указываем антивирю, что каталог с прогой не трогать. всё.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 февраля 2007, 23:31

3. Отвечает эксперт: Федоров Роман Сергеевич

Здравствуйте, Шарайчук Сергій Олександрович!
Есть еще одна идейка, но она актуальна в том случае если вашу прогу копируют а потом запускают. Суть такова:
1)При запуске вашегл exe программа создает в том же каталоге еще один exe (который является совершенно другой программой) и запускает его.
2)Далее созданный exe ждет заверщения вашей программы и после этого записывает в конец файла информацию о текущем положении на диске и номер копии.
3)Далее я смутно представляю как это все будет выглядеть но суть такова, при запуске вы должны будете проверять записанную строку с текущим местоположением, в случае несовпадения счстаете программу скопированной и выполняете ......, незабывайте о создании второго exe (который будет опять заность информацию о месте хранения, также вы должны передавать ему ифу о том что вас уже скопировали, иначе вы несможете определить сколько раз ее копировали).

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 27 февраля 2007, 09:43


Вопрос # 359

Имеет место быть следующая задача: необходимо разработать программный продукт для нужд логистики, возможно связь КПК, компьютеров, в двух городах России в режиме on-line.
Прошу дать оценку перспективы выполнения задачи с помощью средств Делфи, и примерную схему её выполнения.
Существуют ли более эффективные альтернативные пути решения задачи с помощью не Делфи технологий?

Вопрос задал: Knjazev (статус: 3-ий класс)
Вопрос отправлен: 27 февраля 2007, 06:04 (эксперты)
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

1. Отвечает эксперт: Вадим К

Написать можно. Ваша формулировка насколько расплывачаста, что я даже не могу сказать, что же конкретно вы хотите сделать. Поэтому никаких точных указаний как/почём немогу. А написать можно всё, главное желание.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 27 февраля 2007, 13:51


Вопрос # 360

Kak sdelat 4toby info v BD Acces mojno bylo videt tolko 4erez mou progu. sdelan 4/z ADO

Вопрос задал: Сагынов Байсак Найсабекович (статус: Посетитель)
Вопрос отправлен: 27 февраля 2007, 12:51 (эксперты)
Всего ответов: 4; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, Сагынов Байсак Найсабекович!
Шифруйте информацию, ключ держите в программе.

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Ответ отправлен: 27 февраля 2007, 12:58

2. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Пожалуй, наилучший способ - это организация защиты БД на уровне пользователей; при этом программа подключается к базе, используя специальное имя пользователя и пароль, которые хранятся в зашифрованном виде в программе.
Для организации такой защиты проще всего воспользоваться мастером защиты, встроенном в Access.

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 6-ой класс)
Ответ отправлен: 27 февраля 2007, 13:10

3. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Сагынов Байсак Найсабекович!

1.Ну наверное либо в Access либо при создании БД динамически необходимо установить логины и пароли для доступа к БД. Это один вариант. На самом деле защита несерьёзная, т.к. любая програмка типа Office Password Recovery вытащит пароли.
2.Более надёжное средство - в проге создать процедуру кодирования БД. При выходе из приложения файл БД кодируется при входе декодируется. Вариант более устойчив, но здесь файл БД в открытом виде доступен при работе с прогой.
3.Наконец 3 способ. Трудоёмкий, но в плане безопасности наиболее надёжный. Вся информация записываемая в БД хранится в виде строк. ADO реализуется через TADOQuery, перед записью данные кодируются. При обращении к данным соответственно раскодируются. Соответственно выплывает недостаток. Большая по объёму БД будет долго обрабатываться.
Удачи

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Ответ отправлен: 27 февраля 2007, 15:42

4. Отвечает эксперт: Федоров Роман Сергеевич

Здравствуйте, Сагынов Байсак Найсабекович!
Ставьте пароль на базу данных и используйте его в программе при подключении к BD.

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 27 февраля 2007, 20:44


Вопрос # 363

Как сделать, чтобы галочки ставились в CheckListBox не только при нажатии на область пометки, но и при нажатии на название элемента?
======================================
Что напрашивалось сразу - я написал обработчик событий на OnClick и вроде заработало, но после этого при нажатии на область пометки - галочка появляется и сразу исчезает! Забавно так))) Прилагаю обработчик! Может както его модифицировать?

Приложение:

Вопрос задал: RedMask (статус: Посетитель)
Вопрос отправлен: 28 февраля 2007, 10:34 (эксперты)
Всего ответов: 4; сообщений в мини-форуме вопроса: 5

 

1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, RedMask!
Забавный обработчик, думаю он войдет в анналы истори :)))

Попробуй так:

PS: Не проверял, могут быть ошибки в синтаксисе :)

Приложение:

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Ответ отправлен: 28 февраля 2007, 10:56
Оценка за ответ: 4
Комментарий: Ну не знаю, в чём я не правильно задал вопрос %))

2. Отвечает эксперт: Роман

Здравствуйте, RedMask!Вот работающий код.Нужно для проверки использовать State которое имеет 3 состояния:cbUnchecked-выключен,cbChecked-включен,cbGray-серое состояние.

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 28 февраля 2007, 11:41
Оценка за ответ: 4
Комментарий: Работает, если в OnClickCheck поставить abort =)

3. Отвечает эксперт: Николай Рубан

Единственное что могу еще дополнительно порекомендовать, так это просто пропишите в оба обработчика (Click и ClickCheck) одинаковые действия...

Смотрите приложение.
Удачи!!!

Приложение:

Ответ отправил: Николай Рубан (статус: 8-ой класс)
Ответ отправлен: 28 февраля 2007, 14:10
Оценка за ответ: 5
Комментарий: Я сделал что-то типо этого! Спасибо

4. Отвечает эксперт: Федоров Роман Сергеевич

Здравствуйте, RedMask!
var
Flag: boolean;

procedure TForm1.CheckListBox1Click(Sender: TObject);
begin
if not Flag then
CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex];
Flag := False;
end;

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
begin
Flag := True;
end;

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 28 февраля 2007, 19:39
Оценка за ответ: 5
Комментарий: Работающий вариант! :-)


Вопрос # 364

У меня появилась таая проблема: есть текст неважно где, в Memo, StringGrid, label, или Edit, мне нужно вывести ево на печать, как ето сделать? Пробовал через PrintDialog так же как и OpenDialog или SaveDialog, диалог принтера роботает, а што делать незнаю, ПОМОГИТЕ ПОЖАЛУСТА! Если знаете помогите розпичатать и диаграму из компонента Cart!!!

Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Вопрос отправлен: 01 марта 2007, 12:30 (эксперты)
Всего ответов: 3; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Федоров Роман Сергеевич

Здравствуйте, Шарайчук Сергій Олександрович!

Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers :

PROPERTY

Aborted:boolean - Показывает, что процесс печати прерван
Canvas:Tcanvas - Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст ... . Тут есть несколько особенностей, они описаны после описания объекта.
Fonts:Tstrings - Возвращает список шрифтов, поддерживаемых принтером
Handle:HDS - Получить Handle на принтер для использования функций API (см. Далее)
Orientation:TprinterOrientation - Ориентация листа при печати : (poPortrait, poLandscape)
PageHeight:integer - Высота листа в пикселах
PageNumber:integer - Номер страницы, увеличивается на 1 при каждом NewPage
PageWidth:integer - Ширина листа в пикселах
PrinterIndex:integer - Номер используемого принтера по списку доступных принтеров Printers
Printers:Tstrings - Список доступных принтеров
Printing:boolean - Флаг, показывающий, что сейчас идет процесс печати
Title:string - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
METODS

AssignPrn(f:TextFile) - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
Abort - Сбросить печать
BeginDoc - Начать печать
NewPage - Начать новую страницу
EndDoc - Завершить печать.

Пример :

Приложение:

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 1 марта 2007, 13:59
Оценка за ответ: 5

2. Отвечает эксперт: Роман

Здравствуйте, Шарайчук Сергій Олександрович!Посмотрите тут:http://delphiworld.narod.ru/_os_.html,должно помочь.

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 1 марта 2007, 15:03
Оценка за ответ: 3

3. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Шарайчук Сергій Олександрович!
В Delphi печать происходит так: см приложение.

BeginDoc; Связывается с принтером по умолчанию,
начинает формирование первой страницы,которое заключаетса в рисовании на канве принтера текста,линий и всего того что вобще с любой канвой делать можно.

Newpage; Посылает на принтер предидущую страницу,
начинает формирование новой страницы- очищает канву принтера, устанавливает позицию пера в 0 0,
увеличивает на 1 счетчик страниц.

EndDoc; Посылает на принтер последнюю страницу и заканчивает печать разрывает связь с принтером.

Удачи!

Приложение:

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Ответ отправлен: 2 марта 2007, 10:24
Оценка за ответ: 4
Комментарий: Как нарисовать на канве изображение с обекта Chart


Вопрос # 365

Я очень много слішал о книге "Delphi глазами хакера" неподскажете где её можно скачать бесплатно!

Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Вопрос отправлен: 01 марта 2007, 12:33 (эксперты)
Всего ответов: 4; сообщений в мини-форуме вопроса: 8

 

1. Отвечает эксперт: Игорь Данилевич

Здравствуйте, Шарайчук Сергій Олександрович!

http://www.noil.pri.ee/downloads/books/DGH.rar

Ответ отправил: Игорь Данилевич (статус: 3-ий класс)
Ответ отправлен: 1 марта 2007, 13:31

2. Отвечает эксперт: mvp

Здравствуйте, Шарайчук Сергій Олександрович!
http://www.programmersclub.ru/files/book_delphi_haker.rar

Ответ отправил: mvp (статус: 4-ый класс)
Ответ отправлен: 1 марта 2007, 13:31
Оценка за ответ: 4

3. Отвечает эксперт: Николай Рубан

Вот рекомендую Вам такую ссылочку:
http://kiev.c-books.info/books/load.php?ty=delphi&lng=RU

Поней Вы найдете искомую книгу, а также эще кучу книг по тематике Delphi.

Удачи!!!

Ответ отправил: Николай Рубан (статус: 8-ой класс)
Ответ отправлен: 1 марта 2007, 13:38
Оценка за ответ: 5

4. Отвечает эксперт: Федоров Роман Сергеевич

Здравствуйте, Шарайчук Сергій Олександрович!
http://programmersclub.ru/bookhaker

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 1 марта 2007, 14:02
Оценка за ответ: 4


Вопрос # 366

Здрасте, уважаемые эксперты!!! Подскажите, возможно-ли на Delhi, а если возможно, то как, сделать обработчик прерывания от LPT и COM портов. Заранее спасибо!!!

Вопрос задал: Цопа Владимир Милузиевич (статус: Посетитель)
Вопрос отправлен: 02 марта 2007, 11:49 (эксперты)
Всего ответов: 2

 

1. Отвечает эксперт: Вадим К

Вы же не в досе, где всё можно. Под виндовсом единственно правильный способ сделать это - драйвер. Но это не стихия делфи. А зачем вам обработчик прерывания от порта? Экономить ресурсы собрались? Опрашивайте в потоке и всё.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 2 марта 2007, 13:47

2. Отвечает эксперт: Роман

Здравствуйте, Цопа Владимир Милузиевич!Как извесно в NT лавочка с прямым доступом к портам была прикрыта,и для работы с COM есть функции winapi,но как мне помнится обслуживание прерываний там не предусмотрено,НО есть реализация в компоненте TBComPort.Там мониторинг состояния линий порта выведен в отдельный поток с генерацией событий;для LPT есть такая штука LptWdmIo - драйвер LPTWDMIO.sys предоставляет пользовательским приложениям возможность управлять параллельными портами ПК.Он поддерживает два вида операций -- чтение из порта и записи в порт.Прерываний там нет,но при необходилости их можно реализовать опять-же отдельным потоком.

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 2 марта 2007, 14:02
Оценка за ответ: 5
Комментарий: Огромное спасибо за подсказку! В глубине души я подозревал, что проблему нужно решать через потоки. Но так-как "варюсь в собственном соку" (нескем общаться) решил поспрошать у Вас - Экспертов.


Вопрос # 367

Здравствуйте. Я так и не понял насчет MediaPlayer1.
Вопрос был такой.
Как мне, скопировав в папку несколько песен (например, песен десять),
нажав на кнопку, они должны проигрываться по очереди (одна за другой).
Я сразу напишу, что я начинающий, поэтому не знаю как их
загрузить в ListBox1, (составив список песен), а потом
проигрывать их по очереди. Если можно то напишите
поподробнее. Заранее благодарен.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 02 марта 2007, 23:24 (эксперты)
Всего ответов: 3; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Федоров Роман Сергеевич

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

Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс)
Ответ отправлен: 2 марта 2007, 23:36
Оценка за ответ: 3

2. Отвечает эксперт: Роман

Здравствуйте, Толков Геннадий Викторович!Вот вам два примера.Первый выводит в ListBox все файлы каталога.Второй - Функция предоставляет Вам каждый раз новое имя файла,а если список файлов исчерпан, начинает перебор снова.Может пригодиться для последовательного воспроизведения файлов.

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 3 марта 2007, 00:34
Оценка за ответ: 5

3. Отвечает эксперт: Дима Гусаков

Здравствуйте, Толков Геннадий Викторович!
Исходник в прикреплённом файле.
К ответу прикреплён файл. Загрузить » (срок хранения: 30 дней с момента отправки ответа)

Приложение:

Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Ответ отправлен: 3 марта 2007, 09:23
Оценка за ответ: 5


Вопрос # 368

Приветствую!!!У меня MainMenu.На событие формы OnShow такой текст(работает). Нужно добавить строчек,чтоб при клике по соотв.элементу, форме передавался фокус.

Приложение:

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 03 марта 2007, 00:20 (эксперты)
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

1. Отвечает эксперт: min@y™

В объявлении формы надо прописать обработчик события OnClick() для свежесозданных пунктов MainMenu. В реализации этого обработчика надо передать фокус форме. При создании нового пункта меню, его свойству OnClick надо присовоить сделанный обработчик.
См. Приложение.

Приложение:

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 5 марта 2007, 08:37
Оценка за ответ: 5
Комментарий: Это вариант рабосий,но не красивый.Я надеялся еще что-нить узнать.Спасибо за потраченое время.


Вопрос # 369

Здравствуйте эксперты. Назовите, пожалуйста, свойство компонента TChart, которое позволит очистить поле для вывода нового изображения, Series1.Clear мне не подходит, т.к. это стирает линию. И ещё, задали вопрос, который я честно говоря даже не понял: Какими свойствами можно сделать методы компонента TChart активными и видимыми? Думаю, что вы знаете ответ на этот вопрос.

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 03 марта 2007, 20:35 (эксперты)
Всего ответов: 3; сообщений в мини-форуме вопроса: 3

 

1. Отвечает эксперт: Шарайчук Сергій Олександрович

Всмысле стирает линию, формиру вопросы чотче. Очистить поле опроуй так: Chart1.SeriesList.Series[0].Clear;

Ответ отправил: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Ответ отправлен: 3 марта 2007, 20:52
Оценка за ответ: 3

2. Отвечает эксперт: Вадим К

По поводу второго вопроса телепаты мне подсказали, что это наверное свойства Visible, которое определяет видим/невидим и Enbled - активный/неактивный. Оба свойства буленовские, тоесть пользуемся типа так
Chart1.Visible:=True

Но также возможно, что это и не то. Если в вопросе подразумевалось создание компонент, то что бы свойства компонента были доступны в коде, они должны быть обявлены в секции public. А published раздел делает их ещё видимыми свойства в инспекторе объектов

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 3 марта 2007, 23:55
Оценка за ответ: 4

3. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Полушин Сергей Анатольевич!
Закрасьте канву цветом фона.

Chart1.Canvas.Brush.Color := clWhite;
Chart1.Canvas.FillRect(Rect(0,0,Chart1.Width,Chart1.Height);
Только исчезнет все и линии и оси и все другое.
Оно Вам надо?

Удачи!

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Ответ отправлен: 5 марта 2007, 12:19


Вопрос # 370

Есть форма, на которой TImage с иконкой 32bpp. Если фон формы сделать прозрачным, то 32-битная тень исчезнет. Как сделать, чтобы форма не отображалась, а изображение (с альфа каналом), которое на ней находится, было видно.

Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 03 марта 2007, 21:35 (эксперты)
Всего ответов: 2; сообщений в мини-форуме вопроса: 4

 

1. Отвечает эксперт: Бубырь Александр Николаевич

Этот пример делает овальную форму, дальше думаю можно будет разобраться.

Приложение:

Ответ отправил: Бубырь Александр Николаевич (статус: 6-ой класс)
Ответ отправлен: 4 марта 2007, 10:03

2. Отвечает эксперт: Роман

Здравствуйте, Иван!Вот вам примерчик.MaskBmp-альфаканал,белый цвет будет прозрачным,и соотверственно в этих местах форма будет прозрачной.

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 4 марта 2007, 12:39


Обучение Delphi

» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 3 урока:

16. Циклы - общее понятие; цикл с параметром
17. Циклы - цикл с предусловием и цикл с постусловием
18. Работа со строками и символами

Подпрограммы (часть 1)

Автор:
© Ерёмин А.А., 2008
Если не ясно, как следует поступить, то всегда придерживайтесь правила - лучше дать подчиненным больше, чем положено, чем недодать положенное.
Номер урока:
19
 

Введение

Представьте, что у Вас в программе одна и та же последовательность действий повторяется и прописана в разных местах (например, в обработчиках нажатий разных кнопок, выбора пунктов меню и т.п.) Если в программе что-то дублируется, то написана она неверно. Точнее, сам программист не знает о возможностях, которые предоставляет ему язык программирования и/или не знаком с методами оптимизации. Чем плохо дублирование? Вы скажете, код становится более громоздким? Да, в том числе и это, но это не главное. Дело в том, что прямое копирование фрагментов кода сковывает руки и не даёт возможности в дальнейшем делать исправления. Нет, конечно, их можно делать, но если в программе в 100 различных местах написано одно и то же и это "одно и то же" нужно подправить, уйдёт не одна минута на работу, которая, в общем-то, бесполезна. Если речь идёт о каких-то визуальных изменениях программы - это ещё куда ни шло... Представьте другую ситуацию: программа рассчитывает какие-либо данные по заданной формуле. Помимо расчёт ов программа строит графики, сохраняет информацию в базе данных и т.п. В общем, многофункциональная программа. И в один прекрасный момент выясняется, что формулу расчёта нужно изменить. А у нас она по всей программе задана в явном виде. Придётся исправлять везде. А если где-то забудем исправить, ещё и проблемы возникнут - половина расчётов станут неверными, не те данные попадут в базу данных и т.д. Логично было бы задать формулу расчёта один раз и каким-либо образом её вызывать. Но как? Задать переменную-формулу нельзя... Вот здесь на помощь и приходят подпрограммы.

Подпрограммы

Подпрограмма представляет собой набор операторов, команд, оформленных специальным образом. Подпрограмму можно вызывать из основной программы, причём неограниченное число раз. Вынося какой-то код в подпрограмму, мы исключаем дублирование этого кода в различных местах программы и, естественно, уменьшаем общий объём кода программы. Использование подпрограмм придаёт приложению более структурированную форму. В какой-то степени подпрограммы и упрощают чтение кода для других пользователей. Более того, использование подпрограмм позволяет организовать разделение труда при работе над большим проектом каждый работает над своей задачей, а все результаты быстро и просто подключаются к основной программе.
По структуре подпрограмма практически идентична самой программе - она содержит заголовок, блок описаний, блок реализации. Конечно, форма записи подпрограмм (т.е. их описания) отличается от формы записи самой программы.
В общем случае работа с подпрограммой делится на два этапа. Перво-наперво нужно описать подпрограмму, иначе основная программа просто её не найдёт. После того, как подпрограмма описана, её можно вызывать из основной программы. При этом, конечно, никто не запрещает Вам редактировать подпрограмму и программу параллельно. Т.е. Вы можете сначала просто описать подпрограмму и "повесить" на неё простейшее действие вроде вывода окошка с сообщением, затем прописать вызов подпрограммы во всех нужных местах, протестировать работоспособность программы, и затем продолжить написание подпрограммы.
Вызов подпрограмм осуществляется по их именам. Имя подпрограммы составляется по всем тем правилам, по каким составляются имена идентификаторов (переменных). Т.е. может состоять только из латинских букв, цифр и знака подчёркивания, не может начинать с цифры и т.д. Более подробно правила задания имён идентификаторам были рассмотрены в одном из первых уроков. Имена подпрограмм должны быть уникальными, т.е. не может существовать подпрограмм с одинаковыми именами. Но, как известно, на любое правило есть своё исключение... И здесь есть особые случаи - в объектно-ориентированном программировании (ООП) есть принцип полиморфизма, согласно которому у объектов могут быть методы (они являются подпрограммами) с одинаковыми именами. Но знакомиться с ООП мы будем позже, поэтому не забивайте голову лишними незнакомыми словами :-)
Итак, помимо имени подпрограммы мы должны описать список аргументов (параметров), передаваемых подпрограмме. К примеру, если подпрограмма вычисляет некоторое значение по заданной формуле, параметрами могут являться составляющие переменные, включённые в эту формулу. Допустим, если подпрограмма вычисляет площадь круга, то параметром (аргументом) будет его радиус. Важно отметить, что подпрограммы могут и не иметь входных параметров (т.е. работать без указания всяких данных), а также могут иметь нефиксированное число параметров (т.е. хотите - передавайте один, а хотите - пять, дело Ваше). В третью группу можно выделить подпрограммы, у которых часть параметров обязательна, а часть - нет. Вторые встречаются довольно редко и требуют особого подхода. Каждый параметр - это, по сути, обычная переменная, поэтому при описании параметров нужно каждому из них дать уникальное имя и указать тип данных.
В стандартных модулях Delphi описано великое множество подпрограммы и их можно вызывать без описания. Они уже описаны, просто в других модулях. Помните, мы подключали модуль Math для доступа к математическим функциями? А модуль StrUtils с функциями обработки строк? Так вот, в этих модулях и описаны подпрограммы, которые мы использовали. Если модуль не подключен, Delphi не узнает, где находится подпрограмма и какие функции она выполняет. Но стоит модуль подключить и дополнительный арсенал у нас в кармане. Естественно, помимо использования готовых подпрогрмм мы можем создавать и свои собственные, пользовательские.

Типы подпрограмм

Все подпрограммы делятся на процедуры и функции. В предыдущих уроках эти термины уже использовались. Сейчас Вы узнаете, в чём разница. А различий на самом деле немного. Функция - это подпрограмма, результатом работы которой является какое-либо значение (одно единственное). Это позволяет использовать функции как обычные переменные, т.е. как операнды в выражениях. Просто значения будут вычисляться "на лету". Процедуры - это подпрограммы, которые не возвращают никакого значения в результате своей работы. Тем не менее, процедуры могут использоваться для передачи в основную программу каких-либо данных, причём передаваться может не одно значение, а несколько. Но в общем и целом процедуру следует понимать просто как ярлычок на выполнение указанных действий.

Управление подпрограммами

Вкратце об управлении. Как уже было сказано выше, подпрограммы вызываются по именам. Если подпрограмма требует входные параметры, то они указываются в скобках и разделяются запятыми. С этим мы уже неоднократно встречались, вызывая готовые подпрограммы. Поскольку вызов подпрограммы является отдельной командой, в конце необходим символ ";" (точка с запятой). Если подпрограмма-функция используется как операнд в выражении, точка с запятой, естественно, не нужны - следует воспринимает имя подпрограммы как переменную. Если подпрограмма не требует входных параметров, скобки можно опустить, оставив только имя самой подпрограммы. А можно скобки и написать, просто между ними не будет ничего. Помните, однажды мы учились работать с генератором случаных числе (урок №12)? Там мы вызывали процедуру Randomize для инициализации генератора... Вот у этой процедуры входных параметров нет, поэтому её можно вызвать как Randomize;, так и Randomize(); Лично мне больше нравится писать со скобам и - так код становится красивее, да и сразу понятно, что это подпрограмма, а не переменная. Но, повторюсь, писать скобки или нет - дело Ваше. Наконец, можно в любой момент завершить выполнение подпрограммы. Делается это командой Exit (англ. "выход"). Выполнение прерывается в том месте, где находится эта команда. Однако важно помнить, что если Exit находится в функции, то нужно предусмотреть значение, возвращаемое функцией. Завершение выполнения функции совсем не означает, что она не вернёт никакого значения - всё с точностью до наоборот. Помните, что значение любой переменной (а значит и результата работы функции) изначально не определено! Если результатом является число, не думайте, что там записан ноль! Там может быть всё, что угодно.

Заключение

Сегодняшний урок носит в основном теоретический характер. Мы не рассматривали никаких конкретных примеров и пока что не учились создавать свои подпрограммы. Этим мы займёмся в следующий раз. Сейчас важно понять назначение подпрограмм и усвоить основную терминологию, которая используется при работе с ними. Далее, когда перейдём к практике, всё станет более понятным.

Домашнее задание

Определить, какие входные параметры было бы логично задать для следующих подпрограмм:

  1. Функция, считающая, сколько раз буква встречается в тексте.
  2. Функция, вычисляющая объём цилиндра.
  3. Функция, проверяющая, является ли параллелепипед кубом.
  4. Процедура, делающая 3 кнопки, расположенные на форме, недоступными для нажатия.
  5. Процедура, изменяющая разрешение экрана.

Оцените данный урок (1 - плохо, ..., 5 - отлично): -1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
 

Статьи

Самые популярные статьи на сайте:

Работа с приложениями Microsoft Office. Excel
Конвертирование графических форматов
Работа с приложениями Microsoft Office. Word
Как можно из Delphi отслеживать все события Windows?
Написание инсталлятора на Delphi
Работа с реестром и INI-файлами в Delphi
Работа со строковыми типами данных
Создание непрямоугольных форм в Delphi
Как прочитать ID3-Tag'и из MP3-файла?
Работа с HTML-справкой в программах

О формах

Автор: Вадим К

Формы разные нужны, формы разные важны...

Вступление

Как известно, в приложениях, написанных на Делфи, если два типа форм – создаваемые автоматически (AutoCreate form) и создаваемые вручную. По умолчанию, если, конечно, вы не лазили в настройки, создаются формы первого типа. Рассмотрим преимущества форм первого типа и второго. Пример использования смотрите в прилагаемом архиве в каталоге Project.

Автоформы

Для форм этого типа Делфи вставляет в файл проекта строки вида:

Application.CreateForm(TForm1, Form1);

Этот метод выполняет создание формы, плюс небольшой код, который проверяет, является ли данная форма главной (в таком случае он её отображает) или нет.

Такие формы удобны тем, что к моменту запуска программы все заданные формы созданы и к ним можно смело обращаться. Для начинающих это достаточно удобно. Но! За этим удобством скрывается множество подводных камней.

Во-первых, эти формы должны создаться. А это порой отнимает очень много времени – ведь должны отработать конструкторы для каждой формы. А сюда многие "запихивают" и подключение к базе, и поиск файлов на диске...

При сотнях форм это начинает раздражать – программа открывается с большой задержкой (иногда счёт идёт на минуты). А главная форма отобразится только тогда, когда будут созданы все формы. И начинается перенос кода в OnShow (Это событие возникает, когда форма отображается на экране), но так как форма может скрываться и отображаться снова, то вводятся дополнительные переменные флаги. В целом код стаёт просто неподъёмным. И проект "загибается".

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

Формы, создаваемые вручную

Противники Делфи ликуют – вот оно, для маленьких проектов может Делфи и подходит, но для серьезных – нет. А решение проблемы-то простое. Для начала нужно ответить на вопрос: "Зачем создавать форму, которая возможно не будет отображена?". Например, форма "О программе". Я более, чем уверен, что в каждом сеансе работы с программой пользователи её не открывают. А туда многие любят ставить красивые большие картинки, разные спецэффекты.

Давайте напишем более оптимальный код для окон типа "О программе".

About

Первым делом, сделаем форму свободной (это перевод делфийского Available form). Это можно сделать двумя способами. Можно просто открыть окно настроек проекта на вкладке Forms (меню Project – Options). Там увидите два списка. Правый скорее всего будет пуст – именно тут находятся свободные формы. А слева находятся автоматически создаваемые. Кликнем дважды мышкой по имени нашей формы, которое скорее всего будет называться AboutForm (У вас она имеет вид Form23 или что то в этом виде? Срочно переименовывайте, так жить нельзя, ведь в школе к ученикам не обращаются "ученик 3", "ученик 15"?). Она переместится в список справа.

Второй способ заключается в ручной правке файла проекта – нужно просто удалить строку в которой эта самая форма создаётся. Но я не рекомендую так делать. Если раньше это было безопасно, то начиная с 2005 делфи иногда возникают осложнения – Делфи вовремя не обновляет другие файлы.

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

Итак, делаем.

1. Добавим в public-часть формы метод, вот такого вида:

class procedure MyShowForm;

2. Нажав Ctrl+Shift+C получаем заготовку обработчика.

3. В этой процедуре пишем следующее:

with Create(Application) do
  try
    ShowModal;
  finally
    Free;
  end;

Всё. Готово. Этот код делает следующее. Вначале создаст форму, потом отобразит как модальную и после закрытия формы (например методом Close) уничтожит её. То есть форма просуществует ровно столько, сколько нам она нужна. Осталось разобраться с тем, как её вызывать. А это очень просто. Вначале добавим в список uses вызывающей формы наш юнит с формой "О программе". А в обработчике соответствующего пункта меню напишем так:

TAboutBox.MyShowForm;

Стоит заметить одно маленько "но". В юните с формой "О программе" осталась переменная для формы (у меня она называется AboutBox: TAboutBox). К этой переменной обращаться нельзя – она не указывает ни на какую форму! Можно даже удалить это объявление, чтобы не мешалось перед глазами.

Эту методологию можно применять и для других форм подобного вида – тех, которые нужно показать и закрыть. Это могут быть формы-справочники или информационные формы.

Попутные замечания

В нашем случае на форме нужна кнопка «Ок», но писать для неё обработчик с одной строкой Close как-то некрасиво. Но есть красивое решение – устанавливаем в кнопки свойство ModalResult равным mrOk. Теперь модальная форма будет закрываться сама.

Давайте чуть расширим нашу форму "О программе". Добавим возможность изменения надписи на этой форме (у меня это будет Label, содержащий имя продукта). Для этого к нашему методу дописываем параметр. Суммарно это будет выглядеть где-то так:

public
  { Public declarations }
  class procedure MyShowForm(AProductName: string);
 ...
class procedure TAboutBox.MyShowForm(AProductName: string);
begin
  with Create(Application) do
  try
    ProductName.Caption := AProductName;
    ShowModal;
  finally
    Free;
  end;
end;

и соответственно вызов:

TAboutBox.MyShowForm('My program');

Вся прелесть этого способа в том, что если вы вздумаете отображать имя продукта не в Label, а на навороченном компоненте, только что скачанном, вам не придется перелопачивать весь проект в поисках всех вызовов формы. И если вы работаете в команде, то для ваших коллег не нужно будет составлять объяснительные "писульки", как, где и что нужно поправлять.

Ленивые формы

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

Сделать такую форму bp обычной просто. Вначале делаем её свободной. Это мы уже проходили чуть выше. Следующим делом переписываем строку вида:

var
  LazyForm: TLazyForm;

на следующую:

function LazyForm: TLazyForm;

Под строкой {$R *.dfm} добавим такое:

var privateForm:TLazyForm;
 
function LazyForm: TLazyForm;
begin
  if not Assigned (privateForm) then
    privateForm := TLazyForm.Create(Application);
  Result := privateForm;
end;

В этим строках мы проверяем, если форма уже создана, то возвращаем ссылку на неё. Если нет – создаем.

Самое чудесное, что остальной код переделывать не надо. То есть, можно свободно написать LazyForm.Show; и не бояться, что она не появится, а вместо неё будет окно с сообщением об ошибке. Такую форму можно закрывать, открывать снова. Можно делать модальной.

Но у этой формы тоже есть один недостаток. Если где-то будет вызван деструктор, то последствия будут плачевны, если вы снова захотите увидеть форму. Но чтобы исправить это, достаточно добавить в событие OnDestroy всего одну строку - privateForm := nil;

Также эту форму можно научить автоматически вызывать деструктор, когда вы её закрываете. Для этого в событии OnClose вставим строку Action := caFree;

Можно заменить caFree на caHide – это обычное поведение формы – просто скрыться.

Есть также caMinimize – форма будет сворачиваться, но не скрываться. И последний вариант – caNone. Он как раз заставляет "ничего не делать". Этот вариант очень удобен, когда у вас на форме введены данные и перед закрытием формы вы хотите их проверить. Проверяете в этом событии, и если что то не нравится – просто выставляете это значение и форма не закрывается. Но советую не переусердствовать, а то форму нельзя будет закрыть вообще. Правильный код будет выглядеть где-то так:

If ModalResult <> mrOk then Close;
If not (условие проверки правильности) then Action := caNone;

Групповые действия

Иногда, когда открыто множество форм, хочется "попросить" каждую форму выполнить какое-то действие. На первый взгляд кажется, что нужно хранить где-то массив открытых форм. Но чтобы всё это работало стабильно, придется много постараться.

Но Делфи предоставляет нам удобный инструмент. Она ведёт самостоятельно список всех открытых форм. Доступ к этому массиву получить легко. Количество открытых форм – Screen.FormCount. Обратиться к конкретной форме – Screen.Forms[индекс]. Рассмотрим на конкретном примере – закрыть все формы приложения, кроме главной.

procedure TMainForm.btnCloseFormsClick(Sender: TObject);
var
  i: Integer;
begin
  for i := Screen.FormCount - 1 downto 0 do
  if Screen.Forms[i]<>Application.MainForm then
     Screen.Forms[i].Close;
end;

Если присмотреться, то ничего необычного в этом коде нет. Чуточку переделав этот код, можно к примеру поменять заголовки всех форм.

Пойдём чуть дальше. Хочется обращаться к конкретным методам формы. Оказывается, это можно делать, даже не зная типа формы, нужно знать только имя метода и количество параметров. В приложении вы найдёте пример (каталог AllForm), как у всех форм выполнить метод по имени. Сам код вынесен в отдельный юнит и может применяться в любых приложениях. Есть только два ограничения:

- метод должен быть обявлен в published разделе (без этого никак);
- типы и количество параметров должно быть известно. В примере вызывается метод без параметров.

Вместо окончания

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

Файлы к статье »

Файловый архив

Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения

Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.

Название
Описание
Раздел
Объём
Ссылки
Professional Screen Camera Delphi Unit
Модуль для сохранения изображения происходящего на экране в видео-файл.
Возможности:
- запись в видео-файл произвольной области экрана;
- 5 способов задания региона для записи;
- автоматический выбор подходящего видео-кодека;
- возможность записи звука с выбранного устройства;
- изменение частоты сохранения кадров (вплоть до 200 кадров в секунду);
- возможность записи по таймеру;
- изменение приоритета прямо во время записи;
- возможность предварительного просмотра
... и многое другое.
398 Кб
TRIPLEDASHGARLIC 3D ENGINE
Небольшой движок, включающий в себя проверку столкновений и скелетную анимацию в OpenGL. В архиве два примера по использованию этих функций.
798 Кб
Poison ARP
Программа позволяет отсылать поддельные ARP пакеты, тем самым Вы можете заставить компьютер A думать что его IP уже занят в сети или заставить компьютер A, обменивающийся данными с компьютером B слать данные не B, а другому компьютеру, и тем самым перехватывать чухой трафик (атака ARP Spoofing).
96 Кб
Тейксейра, Пачеко - Borland Delphi 5
Эта книга предназначена для профессиональных разработчиков программного обеспечения в среде Delphi и написана двумя признанными экспертами в этой области. В текст книги включен исходный код множества прекрасных примеров работоспособных приложений по всем обсуждаемым темам, включая примеры приложений рабочего стола, многоуровневых и Web-ориентированных приложений. Каждый пример подробно комментируется, что делает данную книгу отличным учебником, позволяющим быстро освоить создание разнообразных эффективных приложений. В этой книге описана стратегия создания пользовательских приложений, динамических библиотек, применения многопоточного режима, создания специальных компонентов и многого другого.

5.16 Мб

6.07 Мб

Файлы к статье "О формах"
17 Кб
 
Всего новых файлов: 5  
12.53 Мб
 
 

Юмор

Ведущий раздела: Bruder

Вначале Бог создал бит и байт...

1. Вначале Бог создал бит и байт. И из них он создал слово.

2. И было в слове два байта, и ничего больше не было. И отделил Бог единицу от нуля, и увидел он, что это хорошо.

3. И сказал Бог: - «Да будут данные». И стали данные. И сказал Бог: - «Да займут данные отведенные им места». И создал он гибкие диски, жесткие диски и компакт-диски.

4. И сказал Бог: - «Да будут компьютеры, чтобы было куда поместить гибкие диски, жесткие диски и компакт-диски». И создал Бог компьютеры, и назвал их оборудованием.

5. И не было еще программного обеспечения, но создал Бог программы большие и малые, и сказал им: - «Идите, плодитесь, и размножайтесь, и заполните собой всю память».

6. И сказал Бог: - «И создам я программиста. И будет программист писать новые программы и управлять компьютерами, программами и данными».

7. И создал Бог программиста, и поместил его в вычислительный центр. И показал Бог программисту древо каталогов и сказал [ему]: - «Ты можешь использовать все тома и каталоги, ТОЛЬКО HЕ ИСПОЛЬЗУЙ WINDOWS».

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

9. И работали программист и пользователь под голой ДОС, и было это хорошо.

10. Hо Билл был хитрее остальных созданий божьих. И сказал Билл пользователю: - «Разве Бог велел тебе не запускать никаких программ?»

11. И сказал пользователь Биллу: - «Бог разрешил нам использовать любую программу и любые данные, только не разрешил нам запускать Windows, или мы умрем».

12. И сказал Билл пользователю: - «Как ты можешь рассуждать о том, чего даже не пробовал? Когда ты запустишь Windows, ты станешь равным Богу. И сможешь делать что угодно простым щелчком мыши».

13. И увидел пользователь, что плоды Windows приятнее и легче в использовании. И увидел пользователь, что любое знание стало бесполезным, ибо Windows легко его заменяла.

14. Поэтому пользователь установил Windows на свой компьютер и сказал программисту, что это хорошо.

15. И программист сразу же начал искать новые драйверы. И спросил его Бог: - «Что ты ищешь?» И ответил программист: - «Я ищу новые драйверы, потому что не смог найти их в ДОС». И вопросил Бог: - «Кто сказал, что тебе нужны драйверы? Ты запускал Windows?» И ответил программист: - «Билл сказал это».

16. И сказал Бог Биллу: - «За то, что ты сделал, будешь ненавидим всеми созданиями. И пользователь будет всегда недоволен тобой. И будешь ты всегда продавать окна».

17. И сказал Бог пользователю: - «За то, что ты сделал, Windows будет разочаровывать тебя и станет пожирать все твои ресурсы, и будешь ты использовать отвратительные программы, и всегда зависеть от помощи программиста».

18. И сказал Бог программисту: - «За то, что ты послушался пользователя, будешь несчастлив. Во всех твоих программах будут ошибки и станешь ты исправлять и исправлять их до скончания века».

19. И выгнал их Бог из вычислительного центра, и запер дверь, и защитил ее паролем.

20. ПРОГРАММА ВЫЗВАЛА ОБЩУЮ ОШИБКУ ЗАЩИТЫ.

21. Теперь, избавившись от посторонних глаз, Бог достал UNIX и взялся за работу.

:))

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки.




Ведущий рассылки: Ерёмин Андрей


В избранное