Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с IDE из программы

Delphi , Программа и Интерфейс , IDE и Компилятор

Работа с IDE из программы

Вот подпрограммы, работающие у меня в связке D1 и Win 3.1x:


function LaunchedFromDelphiIDE: Boolean;
{----------------------------------------------------------------}
{ Осуществляем проверку запущенности приложения из-под Delphi    }
{ IDE. Идея взята из сообщения в Delphi-Talk от Ed Salgado       }
{ из Eminent Domain Software.                                    }
{----------------------------------------------------------------}

begin
  LaunchedFromDelphiIDE := Bool(PrefixSeg) {т.е. не DLL} and
  Bool(PWordArray(MemL[DSeg: 36])^[8]);
end; {LaunchedFromDelphiIDE}

function DelphiLoaded: Boolean;
{----------------------------------------------------------------}
{ Проверяем, загружена ли Delphi. Дает правильные результаты     }
{  - если вызывающее приложение запущено отдельно, или из-под IDE}
{  - если Delphi имеет открытый проект                           }
{  - если Delphi минимизирована.                                 }
{ Автор идеи Wade Tatman (wtatman@onramp.net).                   }
{----------------------------------------------------------------}

begin
  DelphiLoaded := false;
  if WindowExists('TPropertyInspector', 'Object Inspector') then
    if WindowExists('TMenuBuilder', 'Menu Designer') then
      if WindowExists('TAppBuilder', '(AnyName)') then
        if WindowExists('TApplication', 'Delphi') then
          if WindowExists('TAlignPalette', 'Align') then
            DelphiLoaded := true;
end; {DelphiLoaded}

function DelphiInstalled: Boolean;
{----------------------------------------------------------------}
{ Проверяем наличие Delphi.ini, ищем в нем путь к Библиотеке     }
{ Компонентов, после чего проверяем ее наличие по этому пути.    }
{----------------------------------------------------------------}

var
  IniFile: string;
begin
  DelphiInstalled := false;
  IniFile := WindowsDirectory + '\Delphi.ini';
  if FileExists(IniFile) then
    if FileExists(GetIni(IniFile, 'Library', 'ComponentLibrary')) then
      DelphiInstalled := true;
end; {DelphiInstalled}

Я уверен, что один из приведенных выше методов вам поможет.Последние две
  подпрограммы используют некоторые другие инкапсуляции Windows API и классов
  Delphi, и они определены следующим образом:

function WindowExists(WindowClass, WindowName: string): Boolean;
{----------------------------------------------------------------}
{ С помощью паскалевских строк проверяем наличие определенного   }
{ окна. Для поиска только имени окна (WindowName), используем    }
{ WindowClass '(AnyClass)'; для поиска только класса окна        }
{ (WindowClass), используем WindowName '(AnyName)'.              }
{----------------------------------------------------------------}

var
  PWindowClass, PWindowName: PChar;
  AWindowClass, AWindowName: array[0..63] of Char;
begin
  if WindowClass = '(AnyClass)' then
    PWindowClass := nil
  else
    PWindowClass := StrPCopy(PChar(@AWindowClass), WindowClass);

  if WindowName = '(AnyName)' then
    PWindowName := nil
  else
    PWindowName := StrPCopy(PChar(@AWindowName), WindowName);

  if FindWindow(PWindowClass, PWindowName) <> 0 then
    WindowExists := true
  else
    WindowExists := false;
end; {WindowExists}

function WindowsDirectory: string;
{----------------------------------------------------------------}
{ Возвращаем путь к каталогу Windows (без обратной косой черты)  }
{----------------------------------------------------------------}

const
  BufferSize = 144;
var
  ABuffer: array[0..BufferSize] of Char;
begin
  if GetWindowsDirectory(PChar(@ABuffer), BufferSize) = 0 then
    WindowsDirectory := ''
  else
    WindowsDirectory := StrPas(PChar(@ABuffer));
end; {WindowsDirectory}

function GetIni(const IniFile, Section, Entry: string): string;
{----------------------------------------------------------------}
{ Получаем инициализационную 'profile' строку из определенного   }
{ пункта (Entry) определенной секции [Section] определенного     }
{ INI-файла (дополняем '.ini', если отсутствует). Возвращаем     }
{ нулевую строку, если IniFile, Section или Entry не найден.     }
{----------------------------------------------------------------}

var
  IniFileVar: string;
  IniFileObj: TIniFile;
begin
  if StrEndsWith(IniFile, '.ini') then
    IniFileVar := IniFile
  else
    IniFileVar := IniFile + '.ini';
  IniFileObj := TIniFile.Create(IniFileVar);
  GetIni := IniFileObj.ReadString(Section, Entry, '');
  IniFileObj.Free;
end; {GetIni}

Перевод контента на русский язык:

Вы используете несколько функций в Delphi, чтобы проверить, запущено ли приложение из IDE Delphi, если Delphi загружен и если Delphi установлен. Вот подробное описание каждой функции: 1. LaunchedFromDelphiIDE: эта функция проверяет, запущено ли приложение из IDE Delphi, смотрит на префиксный сегмент и проверяет, не является ли это DLL. 2. DelphiLoaded: эта функция проверяет, загружен ли Delphi, поиска специальных классов окон, которые обычно присутствуют, когда Delphi запущен (например, "TPropertyInspector", "TMenuBuilder" и т.д.). Если какие-либо из этих окон найдены, функция возвращает True. 3. DelphiInstalled: эта функция проверяет, установлен ли Delphi, смотрит на файл под названием "Delphi.ini" в директории Windows и проверяет, содержит ли он путь к библиотеке компонентов.

Функция WindowExists используется функцией DelphiLoaded, чтобы поискать специальные классы окон, а функция WindowsDirectory возвращает путь к директории Windows. Функция GetIni читает значение из файла INI. В целом, эти функции seem полезны для определения запуска приложения из Delphi или установки/загрузки Delphi.

Некоторые предложения:

  • Вы можете рассмотреть более надежный способ проверки загруженности Delphi, например, поиск специальных регистрационных ключей или файлов.
  • Если вы планируете использовать эти функции в нескольких местах, вам может быть полезно упаковать их в отдельный класс или модуль для удобства повторного использования и обслуживания.
  • Рассмотрите добавление обработки ошибок в свои функции, если они могут неудачно выполниться (например, если файл INI отсутствует или повреждён).

В отношении альтернативных решений есть несколько идей:

  • Вместо использования WindowExists, вы могли бы использовать функцию FindWindowEx для поиска окон с конкретными именами классов или текстом окна.
  • Вы также можете использовать функцию SHGetSpecialPath для получения пути к директории Windows вместо жесткого кодирования.
  • Если вам нужно более надежное решение для проверки установки Delphi, вы можете рассмотреть использование функции RegKeyExists для поиска специальных регистрационных ключей или значений.

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

В статье описаны три функции для проверки запущенности приложения из-под Delphi IDE, наличия Delphi и его установки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: IDE и Компилятор ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:59:39/0.0038878917694092/0