Главная » Статьи » Программирование в 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", мы расскажем вам в надлежащей серии. | |
Просмотров: 893 | Рейтинг: 1.0/1 |
Всего комментариев: 0 | |