Работа с проектами.

  Банников Н.А. www.stikriz.narod.ru Почта На главную страницу  

Рейтинг@Mail.ru

И сказал Бог: да произведет вода пресмыкающихся,

душу живую: и птицы да полетят над землею,

по твери небесной. стало так.]

И сотворил Бог рыб больших и всякую душу животных пресмыкающихся,

которых произвела вода, по роду их, и всякую птицу пернатую по роду ее.

И увидел Бог, что это хорошо.

                Той же самой идеологии придерживается и компания Inprice, когда создает свои инструменты разработки для программистов. Обратите внимание на фразу : «… И сотворил Бог рыб … , которых произвела вода…». По сути, мы имеем дело с объектно-ориентированным подходом к проектированию программ. Вы пишите на Delphi вместе с Delphi. Delphi может выполнить часть рутинной работы за Вас. Пока Вы досконально не разберетесь, что же именно делает Delphi, лучше не мешать ей работать, исправлениями кода, который она создает автоматически. Delphi – это Case система для разработки проектов. В ней поддерживается работа как с одним проектом, так и с группой, состоящей из нескольких проектов. Вам только надо вовремя переключаться на нужный проект, входящий в группу, если Вы задаете настройки проекта в окне свойств проекта (Project/Options) или создаете новый модуль программы.

Проект.

                В начале работы, Вам нужно создать проект. Из одного проекта получиться одно приложение. Таким образом, проект является стержнем, на который нанизываются другие модули программы. Проект – это файл с расширением .DPR. Вот типичный файл проекта:

 

program IMNavigator;

 

uses

  Forms,

  Main in 'Main.pas' {fMain},

          

  About in 'About.pas' {AboutBox},

  Coder in 'Coder.pas';

 

{$R *.RES}

 

begin

  Application.Initialize;

  Application.HelpFile := 'IMNavigator.hlp';

  Application.Title := 'Почта Интернет';

  Application.CreateForm(TfMain, fMain);

  Application.CreateForm(TfEditorSetup, fEditorSetup);

  Application.Run;

end.

 

Programmозначает, что это файл проекта. Дальше идет имя модуля, которое будет именем программы.

Uses – модули, подключаемые к проекту. Это могут быть как стандартные модули VCL, так и все написанные Вами в составе проекта. Фраза: «Main in ‘Main.pas’ {fMain}», дословно означает : «Модуль Main находится в файле Main.pas. В нем находится описание формы fMain». Если нет названия формы в фигурных скобках, значит в данном модуле нет описания формы. Если файл модуля находится не в директории проекта, то к названию файла модуля будет прибавлен полный путь. {$R *.RES} – означает, что в качестве файла ресурсов будет создан автоматически файл с именем проекта и расширением RES. Обсуждению работы с ресурсными файлами, мы посвятим отдельную главу. Далее, идет код, выполняемый программой. Первое созданное окно , как правило, будет главным окном программы. Главное окно программы отличается от остальных тем, что при закрытии его, программа выгружается из памяти компьютера. Процедура Application.Run запускает обработчик сообщений программы. Выход из этой процедуры означает завершение работы программы. Поэтому Вы можете вставлять код инициализации и завершения до и после этой процедуры. Например, можно до запуска программы показать окно FirstForm с логотипом фирмы-разработчика. Вот как это можно реализовать:

 

begin

  FirstForm := TFirstForm.Create(Application);

  FirstForm.Show;

  FirstForm.Update;

  Application.Title := 'Платёжное поручение';

  Application.HelpFile := 'PLATPOR.HLP';

  Application.CreateForm(TMainForm, MainForm);

  Application.CreateForm(TKalendarForm, KalendarForm);

  Application.CreateForm(TSeachForm, SeachForm);

  FirstForm.Hide;

  FirstForm.Free;

  Application.Run;

end.

 

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

Для управления файлом проекта используется окно Project Options”.

 


               

 


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

 


 


                На странице Application Вы должны указать название программы, которое будет отображаться на панели задач при свертывании программы, имя Help файла, иконку. В поле Target file extensions указывается нестандартное расширение файла. Например, для ActiveX компонента, компилируемого по умолчанию в DLL нужно указать расширение OCX. Если поле не заполнено, то откомпилированный файл будет иметь расширение по умолчанию. Во время работы программы могут возникнуть проблемы с Help файлом. Программа может перестроить свой путь по умолчанию, например, при загрузки какого-нибудь документа, поэтому Вы можете воспользоваться предлагаемым мной методом задания имени Help файла во время исполнения программы, который может быть встроен в обработчик события создания главной формы.

 

MainPath:=ExtractFilePath(Application.ExeName);

 Application.HelpFile:=MainPath+'Platpor.hlp';

 

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

 


 


                На страничке Compiler Вы указываете настройки компилятора.

Code generation – это настройки для выходного модуля. Optimizations включает оптимизацию по размеру и скорости загрузки.  Соответствует команде компилятора {$O}. Вы можете вставить эту команду в текст программы. При задании {$O+} оптимизация будет включена, при {$O-} - выключена. Это же рассуждение аналогично и при использовании других команд. Эта команда пригодится при написании ассемблерного кода. Aligned record fields  выравнивает элементы в структурах на 32-битовых границах. Соответствует {$A}. Stack frames заставляет компилятор генерировать фреймы стека во всех процедурах и функциях. Соответствует {$W}. Pentium-Safe FDIV генерирует код, который обнаруживает неисправную инструкцию деления с плавающей запятой в первых процессорах Pentium. Соответствует {$U}.

Runtime errors – это проверка ошибок во время исполнения. Некоторые процедуры и функции Windows API не поднимают исключения, а вместо этого нужно каждый раз специальным вызовом функции проверять последнюю ошибку. Это несколько расходится с идеологией программирования на Delphi, поэтому у Вас есть возможность настроить свой проект так, чтобы он соответствовал обычному стилю программирования с использованием исключений. Range Checking проверка, обращений к массивам на выход за пределы границ. Соответствует {$R}. I/O Checking проверка ошибок I/O после каждого вызова I/O. Соответствует {$I}. Overflow Checking проверка на переполнение при операциях с целым числом. Соответствует {$Q}.

Syntax optionsэто опции синтаксиса Паскаля. Лучше всего, не менять эти параметры. Единственный параметр Huge Strings ключевое слово string соответствует новому типу AnsiString с этим выбором.   В противном случае ключевое слово string соответствует типу ShortString. Соответствует {$H}.

Debugging – опции встроенного отладчика. Debug Information устанавливает отладочную информацию в DCU файл. Соответствует {$D}. Local Symbols генерирует информацию о локальных переменных. Соответствует {$L}. В результате выбора этой опции Вы сможете в пошаговом режиме отладки знать значения переменных. Для более полной работы этой опции нужно отключить оптимизацию проекта. Reference Info/Definitions Only Генерирует символьную информацию о ссылке. Соответствует {$Y}. Assertions генерирует код для утверждений установленных в коде. Соответствует {$C}. В отличие от исключений, утверждения могут удаляться при финальной компиляции. Это очень удобное средство, т.к. показывает имя файла, где записана ошибочная инструкция и строка с ошибкой. Об этой возможности мы поподробнее поговорим позже.

Messagesэто сообщения компилятора. Show Hints сообщает о неиспользуемых переменных и прочих не аварийных в принципе ситуациях. Show Warnings сообщает о возможных ошибках, например возможной не инициализации переменной перед использованием это может привести к неадекватной реакции программы.

                На странице блокнота Linker указываются установки для линковки программы.

 


 


                Map fileсоздание файла с расширением MAP, где указываются произведенные действия линковщика. Можно задать разные уровни детализации этого файла.

                Linker output – способ линковки. Generate DCUs – стандартный способ линковки в Delphi. Generate Object filesлинковка через OBJ файлы. Пригодится для связывания ассемблерных модулей и модулей, написанных на С и С++. EXE and DLL Options – опции выходного файла. Можно создать консольную программу, включить отладочную информацию для Borland Turbo Debugger-а  и включить отладочную информацию для удаленной отладки на двух компьютерах, например для отладки COM серверов приложений. Memory sizes – опции, указывающие размер стека и предпочтительный адрес для загрузки в DLL изображений, например иконок и т.д. EXE Descriptor - строка до 255 символов, которая обычно используется для указания авторской информации. Лучше всего для этой цели использовать страничку Version Info.

                На странице блокнота Directories/Conditionals Вы можете изменить пути по умолчанию файлов проекта. По умолчанию все эти пути указывают на директорию, где находится файл проекта. А также Conditional Defines – символы, указатели в условных директивах компилятора. Unit Aliases – для совместимости с программами Windows 3.1, замена имен устаревших файлов на новые. Например, WinTypes=Windows;WinProcs=Windows, что означает, что вместо WinTypes и WinProcs теперь нужно использовать файл Windows.

                На страничке блокнота Version info Вы можете указать номер версии продукта и авторские права. Для этого заполните соответствующие поля ввода.

                На страничке блокнота Packages представлены пакеты, установленные в вашей IDE. Вы можете отметить, что хотите использовать пакеты в своей программе, тогда будет компилироваться сверхтонкая программа. Во время выполнения компоненты, используемые в программе будут создаваться не в вашей программе, а в специальных DLL библиотеках, поставляемых заказчику вместе с программой. Это позволяет повторно использовать код между различными программами, написанными на Delphi. Несмотря, на то, что пакет – это DLL библиотека, он имеет расширение BPL. Подробнее на эту тему мы поговорим позже.

Модули.

                Программа, как правило, состоит из файла проекта и одного или нескольких модулей. Модуль – это текстовый файл с кодом программы. От процедурного программирования нам осталась процедура Application.Run. Все остальное – это описание наших типов и реакций на событие. Эти описания и находятся в модулях. Вот типичный пример модуля.

 

unit About;  // Название модуля

 

interface // Начало интерфейсной части

 

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, // Используемые модули

  Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls;

 

type                                        // Описание типа окна

  TAboutForm = class(TForm)

    GroupBox1: TGroupBox; //  этот код вставляет Delphi сама

    Label3: TLabel;

    BitBtn1: TBitBtn;

    Animate1: TAnimate;

    Label1: TLabel;

    procedure FormShow(Sender: TObject); // Обработчики событий, сделанные Delphi

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private // Отсюда Вы можете вставлять свой код

    { Private declarations }

  public

    MainPath: string; // Переменная, объявленная программистом

  end;

 

var

  AboutForm: TAboutForm; // Глобальная переменная класса окна, которую Delphi  инициализирует при автоматическом создании окна.

 

Implementation // Начало части реализации

 

{$R *.DFM}

 

procedure TAboutForm.FormShow(Sender: TObject);

begin

 Animate1.FileName:=MainPath+Animate1.FileName;

 Animate1.Active:=true;

end;

 

procedure TAboutForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 Animate1.Active:=false;

end;

 

end.

 

                В начале модуля стоит зарезервированное слово Unit, которое показывает, что это файл модуля, за ним – название модуля. В данном случае, Вы видите модуль формы About. Все, что идет после слова interface – является видимым из других модулей и служит для связи модулей в единый проект. Вы можете из других модулей обращаться к любым объектам, функциям, процедурам и переменным, объявленным в интерфейсной части. После слова type  идут описания типов пользователя. В данном случае представлено описание класса формы. Каркас описания Delphi создает автоматически. При добавлении новых компонентов на форму или обработчиков событий, Delphi самостоятельно включает нужные описания в описание класса формы. Вы можете смело распоряжаться только секциями private и public. В противном случае, Вы можете нарушить нормальную работу Delphi. После зарезервированного слова Var, Вы можете указать используемые глобальные переменные. В данном случае, Delphi указала переменную класса окна, которую Вы, в принципе, можете использовать в программе. Если Вы создаете окно на лету, то лучше объявить локальную переменную класса окна в процедуре, где создается окно. Далее Вы можете поместить константы, процедуры и функции, которые являются глобальными в Вашем проекте. После слова implementation заканчивается интерфейсная часть модуля. Далее идет реализация описаний в интерфейсе. Мы видим описание реализации двух процедур, которые являются обработчиками событий формы.

                Для добавления модулей VCL, Вам достаточно указать их имя в секции Uses. Для добавления других модулей, например, написанных Вами лучше воспользоваться командой меню Project/Add to project. Добавить можно только уже существующий модуль. Для создания нового модуля, Вам нужно воспользоваться репозитарием, о котором речь пойдет дальше. Зарезервированное слово Uses Вы можете использовать и в секции implementation для устранения перекрестных ссылок.

Репозитарий.

                Для создания нового в Delphi существует команда File/New… При этом, откроется окно репозитария, в котором Вы можете выбрать то, что Вам нужно создать. Окно репозитария представляет собой блокнот с закладками, где создаваемые объекты разбиты на типы.

                С помощью репозитария, Вы можете создавать объекты проекта через шаблоны. Репозитарий хранит информацию о шаблонах в специальном виде. Вы можете сами пополнять репозитарий или менять название и расположение окон. Для этого выберите команду Tools/Repository.

 


 


                На закладке блокнота New указаны основные объекты: программа, DLL, пустой модуль, компонент и т.д. На закладке ActiveX Вы можете создавать ActiveX компоненты и COM объекты. На закладке Multitier Вы можете создавать объекты баз данных по технологии CORBA, MTS, COM. На закладке Forms – стандартные шаблоны форм. На закладке Dialogs – шаблоны диалоговых окон. На закладке Projects – шаблоны для создания проектов с многодокументным интерфейсом пользователя, одно документным интерфейсом пользователя, и полностью совместимой по спецификации Microsoft программы для Windows 95. На закладке Business Вы можете создавать специализированные формы для бизнес приложений. Так же есть закладка с именем Вашего проекта. Там собраны все формы, входящие В Ваш проект. Вы можете наследовать формы от уже созданных. Например, Вы можете создать форму редактора записи в базе данных, а потом наследовать от нее редакторы для всех таблиц. Некоторые из создаваемых объектов вызывают при своем создании дополнительные окна диалогов, в которых нужно указывать параметры для создания объектов. Обо всех возможностях репозитария мы поговорим по мере необходимости. Для начала, Вам нужно усвоить, что для создания нового проекта, нужно выбрать в репозитарии иконку Application, для создания формы она – Form, а для создания модуля – Unit. При этом, они автоматически будут добавлены в Ваш проект.

Среда разработки программ.

 

1.        Быстрые кнопки, повторяющие пункты меню. Вы можете самостоятельно настроить внешний вид панелей инструментов, нажав по ней правой кнопкой и выбрав пункт всплывающего меню Customize

2.        Палитра компонентов.

3.        Инспектор объектов. Вы можете настраивать выбранный на форме объект по вашему желанию. Все настройки можно производить со свойствами, объявленными в секции published компонентов или в начале объявления класса формы.

4.        Окно точек останова. Вы можете установить свои точки останова программы, щелкнув мышкой по редактору кода слева в специальной области, примыкающей непосредственно к редактору – это самый простой способ.

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

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

7.        Редактор кода.

 

Остальные окна мы рассмотрим по мере необходимости.

 

                Почти все окна можно размещать внутри друг друга. Например, Вы видите, что окно исследователя кода находится внутри редактора кода. Вы можете разместить, например, менеджер проектов в окне редактора кода или в инспекторе объектов, или где-то еще. Инспектор объектов, тоже можно размещать в других окнах, и так почти со всеми окнами. Вы можете сами поэкспериментировать. Для этого возьмите нужное окно и перемещайте его через границу другого окна, когда рамка перемещаемого окна разместится внутри окна-контейнера, можно отпустить перемещаемое окно. Таким образом, Вы можете настроить наиболее удобным образом для Вас окна интегральной среды разработки.

 

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

 


                Аналогично можно получить контекстное всплывающее меню и для других составляющих группы проектов: проектов и модулей. Почти у всех окон есть всплывающее контекстное меню Properties. Выбрав этот пункт меню, Вы можете наиболее удобно настроить то или иное окно под Ваши нужды. Есть только одна проблема: при переустановке Delphi она потеряет все Ваши настройки. Эта проблема решена в Delphi 5.

Пошаговое создание простого проекта.

                Теперь, мы знаем достаточно, чтобы создать простой проект. Выберите команду меню File/New. Появится окно репозитария. На закладке New выберем иконку Application. Delphi создаст новый проект, который включит в состав группы проектов с именем ProjectGroup1. В нашем проекте есть пустая форма. Она главный претендент на то, чтобы стать главным окном приложения. Выберем пункт меню Project/Options. Действительно, мы видим, что окно Form1 создается автоматически, и является главным окном приложения, т.к. его имя выбрано в выпадающем списке Main Form. Перейдем на закладку Application. Здесь можно задать название приложения, выбрать файл иконки и Help файл. Подтвердим сделанные изменения в проекте, нажав кнопку Ok. Выберем команду меню File/Save All для сохранения проекта на диске. Сначала, появится название файла модуля, а потом – файла проекта. Соответственно у модуля расширение PAS, а у проекта – DPR. Это важно. Старайтесь сразу давать нужные названия модулю и проекту. Например, модуль можно назвать Main, а проект по имени нашей программы, например TestProgramm. Расширения Delphi поставит автоматически. Для добавления новой формы, Вы можете снова воспользоваться репозитарием, где выбрать подходящий шаблон. Если форма простая, то можно просто нажать на кнопку New Form на панели инструментов. Я советую Вам поэкспериментировать с репозитарием по созданию разного типа проектов и форм. Пока, только не создавайте новых компонентов и ActiveX объектов.

Подключение к проекту других объектов.

Файл ресурсов.

                По умолчанию Delphi создает файл ресурсов самостоятельно. Его имя совпадает с именем проекта. Вы можете создать свой файл ресурсов в Image Editor-е. У полученного файла ресурсов расширение будет RES. Вместо строчки {$R *.RES} нужно записать что-то вроде {$R MyResource.RES}, тогда Delphi будет подключать ваш файл при компиляции. Не забудьте поместить хотя бы одну иконку в ресурс, т.к. Delphi уже ничего туда не добавит.

DLL.

                Есть два способа подключить DLL к Вашему проекту. Первый способ - статический. Второй – динамический.

 

Статически:

 

unit Main;

 

interface

 

 

function BalanceToStr(Balance: Extended; Simbol: ShortString; isKop: boolean): ShortString;

 

const

    FuncDllName = 'StrFunc32';

 

implementation

 

{$R *.DFM}

 

 

function BalanceToStr; external FuncDllName;

 

 

end.

 

 

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

 

Динамический:

 

unit UnRepForDll;

 

interface

 

Type

 

ERepDllExcept = class(Exception); // Создали класс ошибки.

 

 

TDllRegisterServer = function : HResult; stdcall;  // Объявление типа функции

 

 

 Const

 

    RepDllName = 'UnReport32.dll'; // Имя DLL библиотеки

 

implementation

 

 uses ComObj;

 

 

procedure LoadAndRunDll;

Var DllHandle: THandle; // Дескриптор DLL

       DllRegisterServer: TDllRegisterServer; // Указатель на функцию

begin

  DllHandle:=LoadLibrary(PChar(RepDllName)); // Загружаем DLL.

  if DllHandle < 32 then // DLL не загрузилась

      raise ERepDllExcept.Create( Невозможно загрузить DLL !);

  try

   DllRegisterServer:=nil; // На всякий случай.

   DllRegisterServer:=GetProcAddress(DllHandle, PChar('DllRegisterServer')); // Вытаскиваем указатель на функцию

   if not Assigned(DllRegisterServer) then // В DLL нет такой функции

     raise ERepDllExcept.Create('Не найдена функция!');

   DllRegisterServer; // Вызов функции

 finally

   FreeLibrary(DllHandle); // Выгружаем DLL

 end;

end;

 

 

end.

OBJ

 

                Вы можете подключать к проекту заранее откомпилированные модули, например, С++ или модули, написанные на чистом ассемблере. Хотя, я не рекомендую писать новые модули на ассемблере, т.к. в Delphi Вы можете использовать встроенный ассемблер, но об этом позже.

 

unit Main;

 

interface

 

 

procedure  hasp (Service, SeedCode, LptNum, Pass1, Pass2 : longint;

                     var p1,p2,p3,p4 : longint); external; // Объявили фуекцию

 

implementation

 

{$R *.DFM}

 

{$L  hasp32b.obj} // Подключили OBJ модуль

 

 

end.

 

Теперь Вы можете смело вызывать функцию.

 

Соглашения о вызове функции.

 

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

В Delphi есть возможность указать различные соглашения: register, stdcall, pascal, cdecl. Директива, регулирующая правила передачи параметров, и получения результатов помещается в заголовке программы, например:

 

procedure Myprog; register;

 

или

 

function MyFunc(Par1: Integer; Par2: Extended): boolean; stdcall;

 

                Директива register задействует для передачи параметров максимальное количество регистров процессора, поэтому является самой быстродействующей. Эта директива используется в Delphi по умолчанию. Директива stdcall используется при вызове стандартных подпрограмм Windows. Директива pascal используется при вызове процедур и функций стандартного Паскаля, а директива cdeclС и С++ функций. Директива stdcall примечательна еще тем, что передает неявный параметр кода ошибки, произошедшей в вызываемой функции. Она удобна при использовании в DLL и COM, т.к. не поднимает исключения, а передает его в вызвавшую программу.

Международная адаптация

 

                После того, как Вы полностью закончили работу над программой, программа прошла полное тестирование и готова к поставке заказчику, Вы можете создать несколько копий инсталлятора с разными интерфейсами пользователя для разных языков. Для этого есть возможность вынести из программы все ресурсы в DLL. Вы можете создать несколько ресурсов, которые будут помещены в разные DLL. Тогда у Вас появится возможность поставить заказчику в инсталляторе нужную DLL с нужным языком в интерфейсе пользователя. Для создания такой DLL, Вам нужно выбрать в репозитарии иконку Resource DLL Wizard. В появившемся окне мастера добавить все компоненты программы, которые вы хотите перестроить на нужный язык. Следующим шагом будет добавление всех ресурсных файлов, которые компилируются с программой. В этом окне уже есть один файл по умолчанию. Далее, выбрать языковую адаптацию, имя ресурсного файла, который нужно получить и выходную директорию. После нажатия кнопки Finish, будет создан ресурс и проект DLL библиотеки. Вам нужно отредактировать ресурсный файл и скомпилировать DLL. Далее, можно скопировать полученный результат в другой каталог, отредактировать ресурс для другого языка и т.д. В конце, Вы получите несколько ресурсов в разных директориях для разных языков. Откомпилировав DLL для разных языков, Вы получите нужную локализацию Вашей программы. Теперь, при создании инсталлятора, Вам нужно только менять поставляемую пользователю DLL. Чтобы программа имела нужный интерфейс.

Список используемых файлов Delphi.

 

Расширение

Пояснения

.dpr

Проект приложения

.pas

Модуль

.dfm

Ресурс окна

.dcu

Откомпилированная форма окна

.cfg

Откомпилированные настройки проекта

.dof

Опции проекта в текстовом виде

.dsk

Настройки среды разработки

.map

Карта линковки

.res

Ресурс

 

                Delphi сохраняет старые копии файлов с расширением, которое начинается со знака ~ . При переносе проекта, например, на дискете, Вы можете безболезненно удалить часть файлов – это все файлы с расширением, начинающимся с ~, MAP и DCU.  

 

    Банников Н.А. www.stikriz.narod.ru почта 2000 г.

Сайт создан в системе uCoz