среда, 30 марта 2011 г.

Урок 1. Hellow World с изюминкой (блокировка запуска второй копии приложения Delphi)



Вот уже много лет я руковожу небольшим коллективом программистов, принимая непосредственное участие в написании кода на различных языках программирования. Последние лет 7-8 упор сделан на среду разработки Студия Борланд Дельфи (Delphi), а точнее – на язык, используемый в этой среде – Паскаль (Pascal).
О чем будет этот курс?
Мне не хотелось бы говорить об азах, расписанных во множестве учебников. Так же как не хотелось бы касаться вопросов управления средой разработки. Это приходит с практикой. За многие годы у меня накопился богатый опыт создания приложений с использованием баз данных. Вот этими знаниями и находками я и хотел бы поделиться.
В связи со сказанным, можно сделать вывод, что мой курс рассчитан на подготовленных пользователей.
А начну я, пожалуй, с обзора… нет, не литературы как таковой, а тематических сайтов.
  • Сайт wosoft.ru, где, кроме всех прочих полезностей и прелестей, в разделе Программы, образование, Справочники и энциклопедии, Вы можете найти книжку для начинающих, которая так и называется: «Учебник по Дельфи для чайников». Это – для тех, кто еще… сами понимаете…
  • Сайт delphibook.com, на котором также можно найти книги. В частности, я бы рекомендовал книги Архангельского. Вообще-то, всегда при выборе книги, рекомендую читать аннотацию, расположенную на обороте самой первой страницы. Там всегда указывается для кого предназначена эта книга: для начинающих или для профессионалов.
  • Очень много книг и статей на сайте RSDN.ru. Здесь Вы найдете весьма и весьма полное руководство «Программирование на языке Delphi». (Очень надеюсь, что авторы пошутили, поскольку такого языка не существует). Здесь подробно и наглядно рассказывается, как управлять средой разработки Дельфи, например в разделе «Проект приложения».
  • На следующем сайте, озаглавленном warayg.narod.ru (имеет ли название какое-то отношение к варягам не знаю), также можно найти неплохие, очень компактные, без воды пособия для начинающих и профи.
  • Настоятельно рекомендую вот эту ссылку: HelloWorld.ru – справочник по функциям. Аналогичная книга Сергея Свистунова уже много лет не переиздавалась, к сожалению. Здесь все удобно разложено по категориям. Множество хороших примеров.
  • Сайт SQL.ru просто не могу обойти вниманием. Это – копилка, это мощнейший живой форум. Однако, будьте готовы к тому, что на поиск ответа на любой вопрос вам придется потратить уйму времени.
  • DelphiExpert.ru – как Вы можете судить из меню слева – книги, программы, исходники, компоненты. Я же хочу обратить Ваше внимание на пункт меню «Видео уроки». Это как раз то, что нужно начинающим. Хотя материал неважно систематизирован, нарушен принцип от простого к сложному, но посмотреть не помешает.
  • И последняя ссылка на сайт Dcomponents.nsrod.ru – неплохой справочник (не учебник) по созданию компонентов.
Есть еще сайт с Базой  знаний по Delphi, через поисковик вы его найдете самостоятельно без труда. На этом сайте действительно собрана уникальная коллекция интересных решений. Но, как всегда и везде, мастера чуть-чуть чего-то не договаривают и Ваши попытки повторить их успех, зачастую могут привести к неудачным результатам.
На этом прелюдия закончена. В путь, по которому я предполагаю двигаться весьма условно от простого к сложному, но в результате которого, Вы будете уметь создавать  полноценные приложения с использованием баз данных, включающие графические иллюстрации, отчеты и контекстную справочную систему.
Но, прежде, чем я открою среду разработки и создам новый проект: «Хело ворлд с изюминкой :-) », я расскажу историю из жизни.
Мои коллеги – пользователи результатов моего повседневного труда – обычные люди, которым свойственно нажимать на иконку программы один раз, ну иногда – два раза и редко – три раза… Им даже не приходит в голову, что на каждый их клик компьютер реагирует – запускает одну и ту же программу по 2-3 копии одновременно.  А потом получалось так: оператор ввел какие-то важные данные, сохранил их, закрывает программу, а на экране… опять она, но уже без только что введенных цифр. Через пару столов невооруженным глазом было видно, как у коллеги в этот момент волосы вставали дыбом от шока. А посему призываю всех разработчиков: не пугайте ваших пользователей! Относитесь к ним бережно. Подумайте заранее, пользователь может оказаться беспечным и кликать на все подряд без видимой причинно-следственной связи.
Вот, чтобы исключить одну из подобных ситуаций, я и предлагаю создать программу, которая сама не допустит запустить себя же второй и тем более – третий раз.
Итак, создадим новый проект, закинем в него «чтобы было» одну кнопку,

напишем под ней простенький обработчик события нажатия кнопки:
procedure TForm2.Button1Click(Sender: TObject);
begin
// Вывод сообщения по нажатию кнопки
ShowMessage(‘Hello World!!!’);
end;
Но, не за этим я собрал Вас, дорогие читатели. Это все – прописи. Это – материал с «пятой» страницы любого из учебников.
Найдите в проводнике результат работы компиллятора – файл *.exe и запустите его. И еще раз запустите, и еще…
Да, да, да… Это можно делать, пока у компьютера ОЗУ не треснет:




Чтобы избавиться от этой проблемы, давайте откроем страницу исходного кода проекта:
program HW_Proj;
uses
Forms,
HW in ‘HW.pas’ {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
и вмешаемся в ее работу:
program HW_Proj;
uses
Forms,
windows,
HW in ‘HW.pas’ {Form2};
var
HM: THandle;
{$R *.res}
function Check: boolean;  {проверка на запуск второй копии программы}
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, ‘MyProg’);
Result := (HM <> 0);
if HM = 0
then
HM := CreateMutex(nil, false, ‘MyProg’);
end;
begin
if Check
then Exit;
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Я использовал описание объекта Windows и функцию Check.
Попробуйте вновь открыть проводник и запустить несколько копий Вашей программы? Получилось?

6 комментариев:

  1. Спасибо! Попробовал в Delphi 2010. Но если не убрать {$R *.res}, то выдает сообщение:[DCC Error] E1026 File not found: 'Unit1.res'. Если убрать, срабатывает:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    if Check then Halt;
    end;

    ОтветитьУдалить
  2. (Дополнение к предыдущему комментарию.) Днем на свежую голову разобрался, почему не получалось сделать, как здесь написано. Кое-что пришлось исправить. Во-первых, в созданном в начале проекте(и далее везде) заменил Form2 на Form1, вернее, само так создалось. Затем вместо параметра 'MyProg' (в описании функции Check) вставил 'HW_Proj'- имя сохраненного проекта. Кстати, скопированные кавычки компилятор не принял, пришлось вручную впечатать. После этого все заработало, т.е. запуск второй копии стал невозможен. Благодарю автора за полезную "изюминку"!

    ОтветитьУдалить
  3. Сергей, извините, что сразу не ответил. Увы, обстоятельства...
    Спасибо Вам за проявленный интерес, за комментарии. Я рад, что Вы самостоятельно разобрались. Уверен, что полученные самостоятельно знания лучше тех, которые преподносят со стороны.
    К сожалению, в настоящий момент не располагаю временными ресурсами для продолжения цикла статей, хотя продолжаю вынашивать планы. Например, можно было бы на примере околобухгалтерской программы "Расходы" разобрать процесс создания плагинов или познакомиться с технологией oom. Но, вернувшись с небес на землю, могу лишь предложить Вам: пишите, если будут вопросы, я обязательно постараюсь на них ответить.
    Удачи Вам.

    ОтветитьУдалить
  4. Огромное спасибо вам!
    Не собираетесь ли написать больше про бухгалтерский учет- например, как создать аналитические разрезы и т.д.
    Или, может быть, укажите источник где подробно описана эта тема.
    Спасибо!

    ОтветитьУдалить
    Ответы
    1. Мне очень приятно, что цикл статей, написанный много лет назад до сих пор актуален.
      Однако, тему я считаю исчерпанной, и на текущий момент я не предполагаю "двигать науку вширь" - как говорил один из моих преподавателей.
      Спасибо за интерес, за комментарий. Да, поможет Вам интернет.

      Удалить
    2. В двух словах могу сказать следующее.
      Конечно, предложенная здесь программа не очень подходит для аналитического учета. Чтобы делать аналитику, нужно прежде всего правильно составить рабочий план счетов.

      Вот, к примеру у Вас есть несколько поставщиков (обозначим их П1, П2, П3 для краткости). Тогда Вам не следует учитывать все взаимоотношения с ними на 60 счёте. Нужно создать аналитические счета: 60-1 - расчёты с П!, 60-2 - расчёты с П2 и 60-3 - расчёты с П3. Для составления баланса Вам потребуется собрать все обороты и посчитать остатки по 60 счёту, но сделать это нужно будет собрав обороты и посчитав остатки по всем счетам, начинающимся с "60", т.е. по трём счетам. А для аналитических отчётов (например, отчёт, показывающий взаимоотношения с конкретными поставщиками, Вам нужно будет собирать обороты по каждому из трёх аналитических счетов отдельно. Обычно и тот и другой расчёт размещают в одной функции.

      Удалить

Примечание. Отправлять комментарии могут только участники этого блога.