1. Введение
В интернете просматривая форумы по программированию я наталкивался на вопросы связанные c вопросом «Как программу заставить удалить или переименовать себя во время исполнения». В этой статье описывается самый элементарный способ.
2. Что нужно?
Borland Delphi желательно 7 — требует установки
Блокнот (notepad.exe) — стоит на всех компьютерах с Windows
cmd.exe — стоит на всех компьютерах с Windows
3. Начинаем
Зачем нам нужен блокнот и cmd.exe спросите вы?
Мы для решения этой задачи будем использовать Пакетный файл, подробнее: В Википедии
Функция для удаления:
function RemoveApp : boolean; var batfile : TextFile; // переменная файла begin try // блок try..except для обработки исключений (ошибок) RemoveApp := true; // в результат возвращаемой функции ставим значение: истина AssignFile(batfile,’Del.bat’); // присваиваем файл переменной ReWrite(batfile); // Открываем для перезаписи (если существует файл перезапишится, иначе создастся) ChDir(ExtractFilePath(ParamStr(0))); // меняем текущую директорию (с которой работает программа) на директорию в которой находится исполняемый файл WriteLn(batfile,’del ‘+ExtractFileName(ParamStr(0))); // записываем в файл команду удаления del WriteLn(batfile,’del Del.bat’); // пишем это для самоуничтожения пакетного файла CloseFile(batfile); // закрываем файл WinExec(‘Del.bat’,SW_SHOW); // запускаем пакетный файл который был создан программой ExitProcess(0); // завершаем программу except RemoveApp := false; // если происходит ошибка возвращаем ложь end; end;
Функция для переименования:
Как изменить иконку ярлыка для запуска программы
function RenameApp(newname : string) : boolean; var batfile : TextFile; // переменная файла begin try // блок try..except для обработки исключений (ошибок) RenameApp := true; // в результат возвращаемой функции ставим значение: истина AssignFile(batfile,’Rem.bat’); // присваиваем файл переменной ReWrite(batfile); // Открываем для перезаписи (если существует файл перезапишется, иначе создастся) ChDir(ExtractFilePath(ParamStr(0))); // меняем текущую директорию (с которой работает программа) на директорию в которой находится исполняемый файл WriteLn(batfile,’ren ‘+ExtractFileName(ParamStr(0))+’ ‘+newname); // записываем в файл команду переименовывание ren WriteLn(batfile,’del Rem.bat’); // пишем это для самоуничтожения пакетного файла CloseFile(batfile); // закрываем файл WinExec(‘Rem.bat’,SW_SHOW); // запускаем пакетный файл который был создан программой ExitProcess(0); // завершаем программу except RenameApp := false; // если происходит ошибка возвращаем ложь end; end;
4. Заключение
Как видите ничего сложного тут нет. Эти функции не требуют ни каких дополнительных модулей.
5. Конец
Если будут какие то проблемы, непонятки то пишите в комментарии. С удовольствием отвечу. Желаю вам успеха в программировании!
Прошу вас если вы скопировали эту статью к себе на сайт или форум или блог, то укажите ссылку на источник.
Delphi DS150E Установка и активация. 2016 пошаговая инструкция.
Источник: pblog.ru
Основы рефакторинга в Delphi XE.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Собственно, как и говорил в прошлом посте, на данный момент при появлении свободного времени я изучаю возможности рефакторинга в Delphi XE. Этот пост, как и пост по Git, является чем-то вроде моей онлайн-шпаргалки и, думаю, что будет полезен тем, кто хочет узнать в общих чертах, что предлагает нам Delphi XE в плане рефакторинга наших с Вами проектов.
Прежде всего стоит определиться с тем, что такое рефакторинг в принципе. В принципе, на данный момент, я понимаю под словом “refactoring” улучшение кода программы с целью его (кода) наилучшего понимания. Можно это определение корректировать, уточнять, но суть останется та же — улучшение.
Содержание скрыть
Введение
Зачем нам с Вами “заморачиваться” над рефакторингом, улучшением понимания кода и т.д.? Конечно, если программа пишется “на раз” – написал и забыл, то да, не стоит даже и лезть в рефакторинг. Можно даже написать программу, собрать exe-шник, раздать/продать, а все исходники удалить, чтоб не дай боже руки не потянулись разбирать через год весь этот мусор. Однако, если предполагается, что Ваш проект будет жить и развиваться далее, то рефакторинг просто жизненно необходим. И вне зависимости от того знали ли Вы до сегодняшнего дня, что есть такое понятие или нет Вы использовали рефакторинг в своих проектах и не один раз.
Простой, но, думаю, что показательный пример для тех кто программирует недавно.
Вы пишете программу, скажем, простенький почтовый клиент. Первое с чего начинается обычно работа (исключая предварительную работу по продумыванию структуры, функций и т.д.) в Delphi – открыли IDE, создали проект, накидали на главную форму компонентов и начинаем писать обработчики при этом, естественно, большинство из нас забывает дать всем компонентам на форме осмысленные, понятные имена отличные от стандартных.
К чему приведет такая работа, скажем, через месяц? Как минимум к тому, что будет очень затруднительно вспомнить для чего служит Memo1 или как называется правильно label куда выводится сообщение.
Придётся сначала искать где вообще происходит присвоение значений, потом присваивать новое имя компоненту, а это в свою очередь приведет к тому, что при следующей компиляции Delphi выведет нам несметное количество Error’ов, как бы намекая, что такого компонента-то нету и т.д. и т.п. И будем горевать над кодом пол дня. Знакомая ситуация? Так вот для избегания таких ситуаций в том числе и предназначен рефакторинг – сделать Ваш код понятным на столько, чтобы и через 3 года Вы открыли код и вспомнили, что и к чему.
Между прочим, некоторые IDE, например, тот же Lazarus (если мне не изменяет память) способны по ходу написания кода и переименования компонентов на форме корректировать исходник и при этом не требуется устанавливать какие-либо дополнительные плагины – в Delphi XE переименование компонента через Object Inspector затрагивает только то, что на виду, т.е. – объявление поля в классе формы, объявление обработчика, а имя переменной внутри метода остается без изменений и в результате приводит к ошибкам компиляции. Но это так, к слову. И раз уж я начал описание рефакторинга с примера использования в программах непонятных названий компонентов и переменных, то с этой функции я и начну свой небольшой обзор.
Если заглянуть в меню Refactor, то можно увидеть следующий набор разнообразных опций:
Собственно, если перед этим почитать небольшую, но достаточно познавательную статью в Вики, то станет более менее понятно, что каждая из этих опций реализует один из методов рефакторинга. Посмотрим как работают эти функции на практике.
Rename – переименование
Как я сказал выше, если по имени переменной нельзя сразу понять для чего она предназначена, то на чтение кода приходится затрачивать дополнительное время. Когда проект небольшой – в 1000-1500 строк кода, то времени уходит не много, но если проект большой, то, иногда без бутылки пива и не разберешься, что и к чему работает.
Если при просмотре кода своей программы Вы столкнулись с такой ситуацией, то опция Rename (Shift+Ctrl+E) – это то, что Вы должны применить сразу же (иначе через полчаса опять все забудется :)).
Для примера работы этой функции я создал небольшое приложение в котором “забыл” присвоить кнопке осмысленное имя и оставил его по умолчанию – Button1, затем я написал обработчик onClick для этой кнопки, а также ещё в нескольких местах программы использовал переменную Button1, скажем, что-то типа:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end; var Form2: TForm2; implementation procedure TForm2.Button1Click(Sender: TObject); begin Memo1.Lines.Add(‘Нажали кнопку Buton1’); end; procedure TForm2.Button2Click(Sender: TObject); begin Memo1.Lines.Add(‘Нажали кнопку Buton2’); Memo1.Lines.Add(‘Присвоили кнопке Button1 новое значение Caption = «Кнопка»‘); Button1.Caption:=’Кнопка’; end; end.
Код выглядит жутко, но мы сейчас все поправим. Так как это всего лишь пример использования Rename, то зададим первой кнопке (Button1) новое имя, скажем «btnSimple«. Для этого ищем в любом месте нашего кода упоминание Button1, скажем в обработчике Button2Click выделяем имя переменной и жмем Shift+Ctrl+E. Появится новое окно с предложением задать новое имя переменной:
Заносим в поле “New name” новое имя переменной – btnSimple, жмем Ok и…в исходнике ничего не переименуется. Вместо этого Delphi покажет нам список тех действий, которые произойдут, если Вы примените изменения. В нашем случае окно Refactorings будет выглядеть следующим образом:
И такое поведение IDE вполне оправданно и логично. Вы можете сколько угодно долго выискивать непонятные места в коде, задавать новые операции для рефакторинга, а среда будет Ваши действия запоминать. В любой момент времени Вы можете пересмотреть все предлагаемые изменения, внести в них коррективы и потом одним кликом по кнопке Apply Refactoring (Ctrl+R) внести в исходник все изменения. Также у Вас появляется и возможность отката изменений.
Теперь после того, как мы применим операцию переименования к нашей кнопке в нашем исходнике все упоминания Button1 автоматически сменятся на btnSimple и не будет никаких ошибок при повторной компиляции проекта. При этом, обратите внимание на то, что название обработчика OnClick тоже сменилось и вместо Button1Click стало btnSimpleClick.
С Rename разобрались, двигаемся далее прямо по ходу листинга представленного выше. Что остается “не так” кроме имён компонентов? Естественно, использование строк внутри методов. Что, если через год мы решим, что наша программа должна выдавать сообщения не на русском, а на английском языке? Лопатить весь код, выискивая строки и, помещая их в секцию resourcestring?
Не вариант, тем более, что есть замечательная функция рефакторинга – Extract resource string.
Extract resource string
Итак, для примера вынесем какую-нибудь строку в секцию resourcestring. Выделяем эту строку в редакторе исходного кода и жмем Shift+Ctl+L – снова новое окно, но уже по-меньше предыдущего в котором необходимо задать имя для нашей строки:
Задаем любое понятное имя (я обычно для всех ресурсных строк использую префикс rs) и жмем “Ок“ и в этом случае изменения попадут в исходник сразу же. В данном случае, опять же никаких противоречий в работе рефакторинга в Delphi нет, т.к. использование “волшебных значений” в коде есть зло и врядли программисту в здравом уме придёт в голову откатить такое правильное изменение исходника – вынести строковое значение в секцию resourcestring.
Удобная функция? Несомненно, особенно, если модуль достаточно большой по количеству строк.
Двигаемся далее. Для следующего примера используем не используемую ранее кнопку Button3.
Extract Method
Для порядка я переименовал компонент и присвоил кнопке имя btnOpenFile. Пусть обработчик OnClick у неё будет такой:
procedure TForm2.btnOpenFileClick(Sender: TObject); begin if dlgOpenFile.Execute then begin XML:=TNativeXml.Create; try XML.LoadFromFile(dlgOpenFile.FileName); if not XML.IsEmpty then begin Memo1.Lines.Add(Format(rsRootNode,[XML.Root.Name])); end; finally XML.Free; end; end; end;
Вместо комментария в коде содержатся ещё по меньшей мере 100 строк разбора открытого XML-файла, проверок имен узлов, атрибутов и т.д. Что в данном случае противоречит здравому смыслу и может вогнать в ступор человека впервые увидевшего Ваш код? Во-первых, несоответствие имени метода и его содержимого. По логике вещей клик по кнопке должен открыть файл, но не парсить его. Чтобы избежать такой “подмены” мы можем:
- Переименовать метод и присвоить ему новое, более подходящее имя
- Разделить метод на два – первый метод так и будет открывать файл, а второй – парсить.
Как работает переименование мы уже знаем, поэтому воспользуемся вторым способом – выделим всё, что относится к парсингу XML в новый метод. Для этого воспользуемся функцией Refactor/Extract Method.
Выделяем код, относящийся непосредственно к парсингу XML и жмем Shit+Ctrl+M – в открывшемся окне даем осмысленно имя новому методу:
Здесь следует обратить внимание на такой момент. Вы не сможете прямо в поле названия метода определить и список параметров – появится сообщение об ошибке:
Поэтому пока довольствуемся тем, что выделяем участок кода и выносим его в новый метод ParseXML. После нажатия кнопки Ok выделенный код будет перенескн в новый метод, а Delphi корректно определит новый метод в классе и в правильном месте вставит его вызов в исходном методе, т.е. получим в итоге такой код:
type TForm2 = class(TForm) Memo1: TMemo; smpl: TButton; Button2: TButton; btnOpenFile: TButton; dlgOpenFile: TOpenDialog; procedure btnOpenFileClick(Sender: TObject); procedure smplClick(Sender: TObject); procedure Button2Click(Sender: TObject); private XML:TNativeXml; procedure ParseXML;//это объявление сделано автоматически public end; var Form2: TForm2; implementation . procedure TForm2.btnOpenFileClick(Sender: TObject); begin if dlgOpenFile.Execute then begin XML:=TNativeXml.Create; try XML.LoadFromFile(dlgOpenFile.FileName); ParseXML; //правильно вставленный вызов метода finally XML.Free; end; end; end; procedure TForm2.ParseXML; //наш новый метод begin if not XML.IsEmpty then begin Memo1.Lines.Add(Format(rsRootNode, [XML.Root.Name])); end; end;
Теперь, пока не отошли далеко от работы с методами, рассмотрим как изменять состав параметров.
Чем хорош наш ParseXML? Этот метод выполняет свою узкую функцию – парсит XML-файл. В данном случае сама переменная, содержащая данные определена в классе Form2. Но вполне может возникнуть такая ситуация, когда нам захочется/потребуется сделать так, чтобы в ParseXML данные поступали в виде параметра. Для того, чтобы изменить список параметров метода в рамках нашего рефакторинга мы должны воспользоваться функцией Change Params…
Change Params – изменение списка параметров
Выделяем в любом месте кода имя метода – ParseXML и нажимаем сочетание клавиш Shift+Ctrl+X. Откроется окно, содержащее список параметров для метода. В нашем случае список будет пустым:
Для добавления нового параметра нажимаем кнопку Add… В открывшемся окне мы должны задать название параметра, тип данных и тип параметра (var, const и т.д.):
На этом окне остановимся чуть более подробно. Что касается полей “Parametr Name”, “Data Type” и списка “Parametr Type”, то тут, думаю, всё и так интуитивно понятно – заносится имя параметра, тип данных и выбирается тип самого параметра. При этом в момент набора с клавиатуры типа данных Delphi будет автоматически подыскивать по всем модулям, в т.ч. и не “родным”, таким как NativeXML, наиболее подходящий тип.
Остается поле “Literal Value”. Для чего оно используется? Чтобы понять его назначение, запишем в него такую строку – “XML”. Теперь жмем “Ок” и в окне Refactorings применяем изменения. А теперь обратите внимание на вызов метода ParseXML в обработчике btnOpenFileClick. Вызов стал таким:
ParseXML(XML);
Источник: webdelphi.ru
Урок 9 — События. Программное изменение свойств
В этом уроке я расскажу, что такое событие, реакция на событие и мы научимся программно изменять свойство компонентов. Создаем новый проект, на форму кидаем компонент Button с закладки Standard. Все свойства, выделенного компонента находятся в Object Inspector на вкладке Events. Выделяем форму и переходим к списку ее событий.
Список довольно большой и по этому мы рассмотрим самые важные события.
Событие OnClick. Вы уже знакомы с этим событием из прошлых уроков и знаете, что оно происходит тогда, когда мы нажимаем на ЛКМ один раз.
Далее событие OnCreate, оно возникает тогда, когда форма только начинает создаваться. Формы еще нет на экране, а событие уже произошло.
Событие OnDblClick, это событие похоже на OnClick, только нажать на ЛКМ нужно 2 раза (двойной клик).
Событие OnKeyDown. По названию можно понять, что оно происходит, когда пользователь нажимает на клавишу клавиатуры.
Событие OnKeyUp, схоже с событием OnKeyDown, только в этом случае клавиша отпускается.
Событие OnMouseDown, оно происходит при нажатии на левую кнопку мыши, на правую и на колёсико.
Событие OnMouseUp тоже самое что и OnMouseDown, только в этом случае кнопка отпускается.
Следующие событие OnMouseMove, оно происходит тогда, когда мы двигаем мышку в зоне данного компонента. Давайте попробуем поработать с этим свойством. Для этого нам нужно добавить компонент Label с вкладки Standard на форму и изменить его свойство Caption на 0. Теперь выделяем компонент Button и находим там свойство OnMouseMove, щелкаем по нему 2 раза и Delphi создаст процедуру Button1MouseMove. В этой процедуре между ключевыми словами Begin и end пишем код:
label1.Caption:=IntToStr(StrToInt(Label1.Caption)+1);
Объясняю что будет происходить. Когда мы водим мышкой по кнопке, выполняется событие OnMouseMove. В этом событии мы присваеваем свойству Caption у лейбла значение на единицу больше чем было.
Первоначально у нас в лейбле стоит ноль, когда мы водим по кнопке, то прибавляется к нулю единица, потом дальше шевелим мышку и уже к единице прибавляется еще одна единица и так далее. Вы наверное заметили, что в коде присутствуют функции IntToStr и ей обратная StrToInt они нужны для того, что бы складывать значения в числовом формате.
Если бы мы их не использовали и прибавляли бы единицу в строковом виде, то получилась бы длинная цепочка из единиц.
Идем далее и следующие свойство формы, которое мы рассмотрим называется OnResize оно возникает при изменении размера формы. Кликаем по этому событию и заполняем процедуру всё тем же кодом.
label1.Caption:=IntToStr(StrToInt(Label1.Caption)+1);
Теперь компилируем программу и наводим мышь на уголок формы. Теперь изменяем размер и видим, что событие происходит и выполняется код, который мы там написали.
С рассмотрением основных событий мы закончили, теперь давайте научимся изменять свойства компонентов программно. В событии кнопки OnClick пишем код:
form1.caption:=’Programm’;
Этот код изменит заголовок формы после нажатия на кнопку. Как вы видите, сначала пишется имя компонента (в данном случае форма), далее через точку его свойство и через оператор присваивания пишется сам заголовок в кавычках, так как свойство Caption имеет строковый тип.
Далее давайте программно изменим ширину формы, кликом по кнопке.
procedure TForm1.Button1Click(Sender: TObject); begin form1.width:=500; end;
Я думаю вы поняли, как программно изменять свойства компонентов. Экспериментируйте и всё получится 🙂
Ну вот и всё! Удачи!
Встретимся в следующем уроке!
Источник: thedelphi.ru