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

Программирование во всем великолепии


Информационный Канал Subscribe.Ru


Программирование во всем великолепии.

Выпуск #00000004

Содержание:

1. Вступление.
2. Программирование на Assembler: Assembler для начинающих. Урок 4.
3. Программирование на Delphi: Delphi для начинающих. Урок 4.
4. JavaScript: Первые шаги. Урок 4.
5. Секреты Windows: Системный реестр.
6. Как с нами связаться.

1. Вступление.

Мышки плакали и кололись, но все равно продолжали жрать кактус

Вновь вы получили нашу рассылку. Смеем надеяться, что она вам понравится. Каждый автор пишет статью, вкладывая в нее часть своих знаний и старается совместить полезное с интересным. А в знаниях - сила. Поэтому мы не загружаем текст узкоспециализированными терминами и понятиями. Мы - за простое и понятное программирование. Этот вывод мы сделали давно - еще когда сидели за Ямахами с монохромными мониторами и писали программы на 5-ом Паскале. Сложные программы тяжело создавать одному - контролировать несколько десятков тысяч строк кода не всем под силу. Сегодня мы надеемся, что вы тоже сделаете выводы.

Содержание

2. Программирование на Assembler: Assembler для начинающих. Урок 4.

автор: Вий

Как я и обещал, на этом уроке разберем структуру программы на языке Ассемблер.

Программа состоит из сегментов. Каждый сегмент может быть не более 64 килобайт. Среди сегментов различают сегменты кода, данных и стека, хотя для процессора нет разницы между данными и командами. Т.е. в любой момент команды можно представить как данные и наоборот.

Для объявления сегмента существует директива segment. Сегмент заканчивается строкой <имя_сегмента> ends.

Рассмотрим пример:

first_segment segment
  ...
first_segment ends

Здесь мы объявили сегмент с именем "first_segment". В вашей программе может быть объявлено несколько сегментов, но к COM формату можно преобразовать только ту, которая имеет один сегмент.

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

<имя_метки>:

Пример:

my_label:

Здесь мы объявили метку с именем "my_label". В программе может быть объявлено сколько угодно меток, но имя метки, как и имя сегмента, должно быть уникальным, т. е. не должно совпадать с названием какой-либо директивы или команды, регистра или именем уже объявленного сегмента, переменной или метки.

Вы можете проанализировать примеры программ из прошлых выпусков.

На следующем уроке, если от вас, уважаемые подписчики, не поступит предложений, мы начнем изучение команд языка и, возможно, попутно разберем, как объявляются данные в Ассемблере.

Возможно я что-то упустил в данной статье, поэтому приму любые замечания по адресу veei@km.ru и в следующем выпуске опишу то, что вы, возможно не поняли. Жду ваших отзывов и предложений.

С уважением, Вий.

Содержание

3. Программирование на Delphi: Delphi для начинающих. Урок 4.

автор: Rasa

Здравствуйте, уважаемые подписчики! На прошлом уроке мы рассмотрели с вами алфавит и идентификаторы языка Object Pascal. Сегодня мы узнаем с вами больше о константах и выражениях и разберем нашу первую программу на Delphi.

В качестве констант в Object Pascal могут использоваться числа, символы и строки символов. Основными элементами, из которых конструируется исполняемая часть программы, являются константы, переменные и обращения к функциям. С помощью знаков операций и скобок из них можно составлять выражения, которые фактически представляют собой правила получения новых значений. Простым примером выражения можно считать (a + b) * c. Вскоре мы рассмотрим и операции.

Попробуем разобрать программу на Delphi.

При создании нового проекта среда Delphi автоматически вставляет в Редактор следующий код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

end.

попробуем разобраться в нем :-)

Любой модуль имеет следующую структуру:

        заголовок
  секция интерфейсных объявлений
     секция реализации
        терминатор

Заголовок открывается зарезервированным словом unit за которым следует имя модуля (Unit1) и точка с запятой.

Секция интерфейсных объявлений открывается зарезервированным словом interface - в этой секции описываются программные элементы (типы, классы, процедуры и функции), которые будут "видны" другим программным модулям, а в секции реализаций раскрывается механизм работы этих элементов. Секция реализаций открывается служебным словом implementation. Терминатором модуля, как и терминаторм программы, является end с точкой

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

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

По умолчанию подключен только модуль System - остальные программист должен объявлять сам.

type
  TForm1 = class (TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Образцы для создания элементов программы в Object Pascal называются типами, таким образом класс TForm1 - это тип. Перед его объявлением стоит зарезервированное слово type (тип). Стандартный класс TForm реализует все нужное для создания и функционирования пустого Windows окна. Класс TForm1 порожден от этого класса, о чем свидетельствует строка

TForm1 = class (TForm)

в которой за зарезервированным словом class в скобках указывается имя родительского класса. Термин "порожден" означает, что класс TForm1 унаследовал все возможности родительского класса TForm.

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

Объект Form1 формально относится к элементам программы, которые называются переменными. Вот почему перед объявлением объекта стоит зарезервированное слово var (от английского variables - переменные). (Переменные в Delphi объявляются при помощи зарезервированного слова var - после него идет имя переменной, двоеточие и тип переменной, например объявление перемеменной

var
 MyVariable: Integer

говорит компилятору о том, что имя переменной - MyVariable, а ее тип - Integer, то есть целый) Собственно, это все, из чего состоит наш модуль. Разве что я забыл сказать о строчке

{$R *.DFM}.

Она дает компилятору команду (команды компилятора называются директивами) присоеденить все файлы с расширением DFM (формы Delphi) к нашей программе.

Если попробовать написать такую же программу на языке Pascal for Windows от Borland, то количество строчек кода было бы в несколько раз больше. Потому что программирование без визульных библиотек превращается в программирование на API, то есть программисту все нужно создавать самому с нуля. Delphi же использует VCL (Visual Component Library), которая значительно упрощает жизнь программисту. Однако у программирования без VCL есть одно несомненное достоинство - размер получаемой программы. Иногда он бывает меньше в несколько десятков или сотен раз, чем программа написанная с использованием визуальных компонентов в Delphi. Что ж, на сегодня, я думаю, это все.

На следующем уроке мы разберем несколько операций и продолжим написание нашей программы.

До свидания!

Содержание

4. JavaScript: Первые шаги. Урок 4.

автор: UniQ

Здравствуйте уважаемые подписчики!

Сегодня мы разберём основные конструкции JScript. Такие как циклы, условия. Начнём с условий. Условия в JavaScript описываются следующим образом:

if (условие) {
   серия команд 1;
}
[else {
   серия команд 2;
}]

Посмотрим на примере, как это работает:

<html>
<script> language="JavaScript">
<!-- скрываем скрипт
  var intVar = 10;
  if (intVar == 10)
  {
    document.write("Да, intVar равно 10!");
  } else {
    document.write("Как? intVar не равно 10?");
  }
-->
</script>
</html>

Этот пример иллюстрирует так называемое полное ветвление, так как есть серия команд которая выполняется при соблюдении условия, а также серия команд выполняющаяся при несоблюдении условия. Если в результате выполнения этого скрипта вы увидели "Как? intVar не равно 10?", то можете смело выключать компьютер и ложиться спать :) Вот пример неполного ветвления:

<html>
<script language="JavaScript">
<!-- скрываем скрипт
  var intVar = 10;
  if (intVar == 10)
  {
    document.write("Да, intVar равно 10!");
  }
-->
</script>
</html>

Здесь, наверное, следует пояснить различия между = и ==. Оператор присваивания = применяется когда переменной слева от него сопоставляется значение стоящее справа от =. А == применяется для проверки идентичности значений! Например:

intVar = 5;  // присвоили переменной intVar значение 5
intVar == 5; // здесь переменной intVar НИЧЕГО не присваивается,
             // а значение intVar сравнивается с числом 5

Отсюда вывод, оператор == применяется только в условиях для сравнения на предмет равности!

Идём дальше. Теперь давайте познакомимся с циклами. Цикл в JScript описывается следующим образом:

for ([начальное значание]; [конечное значение]; [изменение]) {
   тело цикла
}

Здесь всё, что находится в квадратных скобках [] указывать не обязательно. В самом простом случае цикл можно проиллюстрировать следующим примером

<html>
<script language="JavaScript">
<!--
  for(var i=0; i<10; i++)
  {
    document.write(i+"<br>");
  }
-->
</script>
</html>

Это работает так: переменной i присваивается начальное значение, в данном случае 0, проверяется i<10, если это так то значение i увеличивается на единицу (i++), выполняется тело цикла (у нас это document.write(i+"<br>");) далее, опять, проверяется i<10, если это так, то значение i увеличивается на единицу, выполняется тело цикла и так до тех пор пока условие i<10 будет выполняться - то есть, пока i меньше 10. Но если учитывать вышесказанное на счёт того, что всё, что находится в квадратных скобках []:

for ([начальное значание]; [конечное значение]; [изменение]) {
   тело цикла
}

указывать не обязательно, то что же получается? А получается бесконечный цикл! Например такой:

<html>
<script language="JavaScript">
<!--
  for(;;)
  {
    document.write("Hello!<br>");
  }
-->
</script>
</html>

В некоторых случаях это способно "подвесить" Ваш браузер. Но поверьте у этой конструкции совсем другие цели :) Теперь переходим к следующей конструкции: к циклам с постусловием. Они описываются следующим образом:

do
   команда;
while (условие завершения);

do{
   серия команд;}
while (условие завершения);

Данный цикл будет выполняться, пока условие завершения не окажется истиной (true):

<html>
<script language="JavaScript">
<!--
  var intVar=0;
  do{
    document.write("Hello!<br>");
    intVar++;}
  while(intVar<10);
-->
</script>
</html>

Следующая конструкция это цикл с предусловием, он так же как и цикл с постусловием, выполняется пока условие истина и выглядит так:

while (условие завершения) {
   серия команд;
}

Вот пример:

<html>
<script language="JavaScript">
<!--
  var intVar=0;
  while(intVar<10){
    document.write("Hello!<br>");
    intVar++;
  }
-->
</script>
</html>

Если Вы еще новичок в программировании у Вас может возникнуть вопрос: а в чем же различия между циклами с постусловиями и предусловиями? Отвечаю: цикл с постусловием в любом случае выполнится хотя бы один раз! Почему? достаточно лишь взглянуть повнимательней на его конструкцию:

do{
   серия команд;}
while (условие завершения);

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

while (условие завершения) {
   серия команд;
}

Теперь давайте представим себе такую ситуацию:

<html>
<script language="JavaScript">
<!--
  var strVar;
  strVar = window.prompt("Введите число: 1, 2 или 3 ","");
  if(strVar == 1)
    {
      document.bgColor = "#FF0000";
    }
  if(strVar == 2)
    {
      document.bgColor = "#00FF00";
    }
  if(strVar == 3)
    {
      document.bgColor = "#0000FF";
    }
  if(strVar > 3)
    {
      document.write("Неверное значение!");
    }
-->
</script>
</html>

Громоздко? ДА! Не удобно? ДА! Есть другой способ? Да! Вот мы и подошли к следующей конструкции JScript - switch, её описание выглядит следующим образом:

switch (выражение){
   case значение1 :
       {серия команд};
      break;
   case значение1 :
       {серия команд};
      break;
   ...
   default : {серия команд};
}

Эта конструкция позволяет заменить то нагромождение if(){}; которое мы видели в предыдущем примере, вот как он выглядел бы с конструкцией switch:

<html>
<script language="JavaScript">
<!--
  var strVar = window.prompt("Введите число: 1, 2 или 3 ","");

  switch(strVar)){
    case "1" : document.bgColor = "#FF0000"; break;
    case "2" : document.bgColor = "#00FF00"; break;
    case "3" : document.bgColor = "#0000FF"; break;
    default: document.write("Неверное значение!")
    }
-->
</script>
</html>

Понятнее? Да! Удобнее? Однозначно! В примерах было употреблено выражения которые мы с Вами ещё не разбирали:

var strVar = window.prompt("Введите любое ","");

Результат его работы Вы уже видели, если конечно выполняли скрипт, оно просто выводит диалог с запросом. Это все основные конструкции JScript.

На этом наш сегодняшний урок закончен. Если у Вас возникли вопросы, обращайтесь: post-master@rambler.ru

Дорогу осилит идущий.

До свидания!

Содержание

5. Секреты Windows: Системный реестр.

автор: Rasa

Здравствуйте, уважаемые подписчики! Сегодня мы вновь постараемся расширить свои знания относительно реестра. Попробуем с вами сделать более удобными некоторые контекстные меню Windows.

Один из примеров был приведен еще в первом выпуске "Программирование во всем великолепии" ("...чтобы в контекстном меню файлов и папок появились опции "Копировать в папку..." и "Переместить в папку..." нужно создать в реестре...").

Что ж, начнем.

Вы никогда не пробовали переименовать Корзину? А переименовать ее довольно просто. Например, после установки пакета Noron Utilites, Корзина называется Norton Protected Recycled Bin.

Дело в том, что корзина - это объект рабочего стола (такой же как "Сетевое окружение" или "Мои документы"). А раз это объект, то все свои параметры он читает из реестра (кстати, в следующей статье я расскажу вам, как создать свой собственный объект на Рабочем столе или в папке Мой компьютер). Получается, что если информацию о Корзине удалить из реестра, то Корзина вообще перестанет существовать. Но Корзину нам с вами удалять не нужно, поверьте - я пробовал - это чертовски неудобно! :-) Однако мы можем сделать так, чтобы в контекстном меню Корзины появилась не только опция Переименовать, но и Удалить.

Запустите редактор реестра (меню Пуск, пункт Выполнить - введите regedit) и откройте раздел

HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}.

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

А чтобы все же добавить - идем здесь же в подветвь ShellFolder, то есть переходим в раздел

HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder

У этой ветви есть двоичный параметр Attributes - по умолчанию он должен быть определен как 40 01 00 20.

Для того чтобы в контекстном меню Корзины появилась опция Переименовать, нужно этому двоичному параметру (Attributes) присвоить значение 50 01 00 20, а чтобы появился еще и пункт 'Удалить' присваиваем Attributes значение 70 01 00 20 (а просто 'Удалить', без пункта 'Переименовать' - 60 01 00 20). Но я не рекомендую этого делать - удалять Корзину не нужно. Однако, если вы все же решите оставить этот пункт, то хочу сказать тем, кто может нечаянно его активизировать, что система, перед тем, как удалить объект с Рабочего стола спросит у вас потверждения (правда при попытке удаления Корзины возникает дурацкое предупреждение о том, что Корзину нельзя поместить в корзину :-) )

При установке флага Attributes в значение 73 01 00 20 в контекстном меню Корзины появляется еще две опции - 'Копировать' и 'Вырезать' - они абсолютно бесполезны.

Обобщая, могу сказать, что переименовать или изменить значок (вскоре рассмотрим и как менять значки системы) можно у любого объекта на Рабочем столе или в папке Мой компьютер - для этого нужно знать лишь ClsID объекта. Об идентификаторах я рассказывал в прошлом выпуске. Скажу также здесь, что к контекстному меню любого объекта можно добавлять свои пункты - но это тоже не сегодня.

Ок, теперь попробуем добавить свой пункт в контекстное меню всех файлов и в контекстное меню папки - ну, и, естественно, определять ему команду запуска определенного файла.

Для начала открываем в реестре раздел

HKEY_CLASSES_ROOT\*

В нем создаем ветвь shell. Shell - в переводе с английского значит "оболочка", здесь разработчики компании Майкрософт подразумевали "Интеграция с системой" :-) Так вот, в этом разделе создадим ветвь, например Example и в ней создадим раздел Command. Дальше все как при регистрации собственного типа файла - в параметре по умолчанию ветви Example пишем текст, который будет отображаться в меню, а в параметре по умолчанию пишем

<путь_к_вашей_программе>\<моя_программа.exe> "%1".

Готово.

И чтобы ваши опции появились в контекстном меню папок, просто повторяем все в разделе реестра

HKEY_CLASSES_ROOT\Directory

или в разделе

HKEY_CLASSES_ROOT\Folder

- оба отвечают за папки. Вроде все просто. Но это если только не углябляться. У приведенного выше способа добавления в контекстное меню файлов и папок есть несколько недостатков:

Во-первых, не добавишь свою иконку рядом с именем пункта в контекстном меню.

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

В-третьих, у вас не получится изменять внешний пункт добавленного пункта.

Все эти недостатки устраняются с помощью расширений оболочки, где оболочка (Shell) - это проводник Windows (Explorer), а расширение (extension) - код, который вы пишете, чтобы получить управление проводником в определенный момент (например, при щелчке правой кнопкой мышки на каком-либо файле). Таким образом, расширение оболочки - это COM объект, который добавляет некоторые особености к проводнику. К примеру, за контекстное меню в проводнике отвечает интерфейс IContextMenu. Именно через него получается хэндл контекстного меню. Говоря просто - это просто! :) Наглядный пример - архиватор Рошала WinRAR. Его интеграция с оболочкой нравится почти всем моим знакомым.

На сегодня это все. Напоследок могу лишь посоветовать вам не доверять Windows - она подводит в самый ответственный момент, именно поэтому старайтесь производить тщательный тюнинг как можно чаще.

До свидания!

Содержание

6. Как с нами связаться.

Возможно у Вас есть пожелания по улучшению рассылки или Вы, на страницах нашей рассылки, хотели бы увидеть материалы по другим областям программирования, предлагайте, мы рассмотрим и учтём их. Ведь эти статьи пишутся программистами для программистов!
Ждем ваших отзывов.

Вий: veei@km.ru
Rasa: rasa@fromru.com
UniQ: post-master@rambler.ru

Рассылка может отображаться некорректно в программе The Bat! Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное