Главная » Статьи » Программирование в Delphi

Cнижаем размер EXE в 40 раз
"малосодержательная " форма тянет около 355 КБ, и этот первоначальный размер умножается с всякой новой модификацией Delphi. "малосодержательная " программа, сочиненная с употреблением библиотеки KOL, сбавляющею размер наигрываемого файла, - 32 КБ. "аккуратное " консольное дополнение имеет охват 8 КБ, поскольку отображается как процесс и, соответственно, не имеет сложных взаимодействий с Windows-окнами. То есть можно сделать так, чтобы по Ctrl+Alt+Del консоль не было заметно . 

значит , в меню Delphi изберите File>New>Other и в появившемся окне среди иного найдите точку Console Application. явится следующая заготовка:


program Project1; //звание проекта

{$APPTYPE CONSOLE} //установка , указывающая на наличие консоли

uses SysUtils; //включенные модули

begin //зачин процесса

{ TODO -oUser -cConsole Main : Insert code here } //комментарий от Borland

end. //все процесса

Ага. данное "пустое" консольное приложение. надавите F9, чтобы кинуть его. Что вы хлебнули ? Черное окошко вроде Сеанса MS-DOS появилось и немедленно исчезло. Куда оно запропало ? Всё тяжбу в книжке , что консольное приложение - это процесс, который, точно и всё на планете , когда-нибудь кончится . Начало хода - первостепенное слово begin, а конец - end. Поскольку между ними отсутствуют какие-либо другие приказы , то end (прекращение процесса) минует сразу дальше начала, и консоль улетучивается . Чтобы эдакого не водилось , надо "занять" дополнение каким-нибудь циклом, желательно вечным . Вот так:


begin

repeat

//данное наш бессрочный цикл

until 1=0;

end.

направьте внимание на команду until. Наш цикл полно исполнятся до тех времен , пока 1 не станет одинаков 0. Угадайте сами, когда это выдастся . Другой вариацию :


begin

while true do begin

//вделывайте ваш кодировку здесь

end;

end.

И еще трансформацию :

Label MyLabel; //"отметка "

begin

MyLabel:

//ваш код тут

goto MyLabel;

end.

В общем, версий сколько угодно. ключевое , что консоль не полно закрываться. А теперь надобно реализовать декламация и запись на картина консоли, чисто это приготовлено в (не)давнишнем (не)подобру-поздорову MS-DOS. направят нам в этом операции из модуля System.pas. Синтаксис:


WriteLn(ровно _ЗАПИСЫВАЕМ) //решение данных в консоль

ReadLn(словно _ЧИТАЕМ) //декламация данных из консоли

отчего же модуль System.pas не продекларирован в отрасли uses? настоящее базовый модуль Delphi, какой всегда включен "по умолчанию". А теперь приобщите к отправному коду:


WriteLn('Hello World!');

отвечающая строка ("Hello World!") довольно выведена на консоль. Если эта наставление будет вмещена в бессрочный цикл (точно его построить - см. возвышеннее ), то строка "Hello World!" тоже будет добавляться бесконечное количество раз. Чтобы это поправить , нужно сочинить :


Begin

While true do begin

Writeln('Hello World!');

Readln;

End;

End.

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


var S: String; //наша переменная

begin

while true do begin

Writeln('Enter your name'+#10);

Readln(S);

Writeln(#10+'Your name is '+S);

end;

end.

тут "№10" обозначает шабаш абзаца, перевод курсора на следующую строку (клавиша Enter). А вот образец , где код закрывается по команде юзера:


var s: String;

begin

while true do begin

Readln(S); //словно ввел юзер?

//Юзер мог ввести команду и прописными литерами ,

//и строчными. реорганизуем буквы в прописные

//директивой UpperCase.

If UpperCase(s)='EXIT' then begin

//переспросим еще раз

Writeln('Do you really want to exit? [y/n]');

//разбираем ответ юзера

Readln(s);

if UpperCase(s)='Y' then exit; //вылезаем

end;

end;

end.

Вот так. Сюда можно вклинить какой угодно код, только подключив, если требуется, нужные модули. Теперь еще как-то откомпилируйте план и надавите Project>Information for 'ProjectName'. размах EXE хватит около 40 килобайт, да только потому, чисто модуль SysUtils.pas в области Uses тянет так много. А если вы замените данный модуль на Windows.pas, то программа полно занимать, точно я и обещал, ВОСЕМЬ кило на вашем харде .

несомненно , при контракте , что вы будете употреблять только модулем Windows, какой содержит большинство команд, потребных в будни . Если вы не коллекционируетесь вступать в консольные переговоры с юзером и употреблять процедурами WriteLn и ReadLn, то и консоль не потребна . Удалите приказ {$APPTYPE CONSOLE}, чтобы черное MS-DOS'овское окошко не заводилось .

однако если настоящее окошко вам очень надобно и вы собираетесь молве диалог с пользователем, то не пробуйте указывать русские буквы в команде WriteLn: консоль отобразит их в второй кодировке. Чтобы это выправить , напечатайте отправной (русский) роль в Блокноте и определите шрифт Terminal. плод будет в кодировке DOS, будто его и надо помогать в операции WriteLn.

обворовать полотно консоли от роли можно столь :


program Project1;

{$APPTYPE CONSOLE}

uses Windows;

var

buffer: TConsoleScreenBufferInfo; //буфер

i: integer;

begin

WriteLn('Press <Enter> to clear screen');

ReadLn;

GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),buffer);

for i:=0 to buffer.dwSize.y do writeln;

Writeln('Screen is cleared ');

Readln;

end.

Вот и всё. что собрать как -нибудь посерьезнее, чем обхаянное резкими программистами придаток типа "Hello World", мы расскажем вам в надлежащей серии.
Категория: Программирование в Delphi | Добавил: Nikol05 (10.11.2010)
Просмотров: 893 | Рейтинг: 1.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]