Тема: Как на Delphi выбрать с каким релизом AutoCAD работать ?

Как в проге на Delphi выбрать с каким Акадом работать ?
К сожалению нет книги. Не кто не может привести код ?

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

алгоритм проверки установленных AutoCAD-ов:
1. проверять наличие ключей в реестре:
HKCR\AutoCAD.Application.XX
(где XX - версии AutoCAD)
2. далее "смотреть" по ключам:
HKCR\CLSID\XX...XXXX
(где XX...XXXX - ClassID взятый из HKCR\AutoCAD.Application.XX\CLSID)
3. проверить наличие файла AutoCAD-а, прописанного в
HKCR\CLSID\XX...XXXX\LocalServer32
(если файл присутствует - значит, с большой долей вероятности, можно утверждать, что данная версия AutoCAD присутствует на компутере).
ну, а окно выбора организовать несложно  :)

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

> callisto
Я бы начал отсюда: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD
Там есть (поглубже) переменные AcadLocation (каталог в котором acad.exe) и ProductName (имя AutoCAD или вертикального приложения)
Затем запустил бы соответствующий acad.exe и с ним бы работал.

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

procedure ruGetACADExePathNames(var lst: TStringList);
  procedure GetAcadReleaseList(const Rel: string);
  var
    r: TRegistry;
    s,
      rList: TStringList;
    i,
      c: integer;
  begin
    r := TRegistry.Create;
    r.RootKey := HKEY_LOCAL_MACHINE;
    s := TStringList.Create;
    rList := TStringList.Create;
    if r.OpenKey(keyAcadRegRoot, false)
      then begin
      r.GetKeyNames(s);
      r.CloseKey;
      for i := 0 to s.Count - 1 do
        if (AnsiStrLIComp(pchar(Rel), pchar(s[i]), length(Rel)) = 0)
          then rList.Add(keyAcadRegRoot + '\' + s[i]);
      for i := 0 to rList.Count - 1 do begin
        r.CloseKey;
        r.OpenKey(rList[i], false);
        s.Clear;
        r.GetKeyNames(s);
        for c := 0 to s.Count - 1 do begin
          if (AnsiStrLIComp('ACAD', pchar(s[c]), 4) = 0)
            then begin
            r.CloseKey;
            if r.OpenKey(rList[i] + '\' + s[c], false)
              then begin
              lst.Add(copy(rList[i], (LastDelimiter('\', rList[i]) + 1), maxInt) + '\' +
                s[c] + '=' +
                r.ReadString('ProductName') + ' ' +
                r.ReadString('Language') + ', ' + Rel);
            end;
          end;
        end;
      end;
    end;
    s.Free;
    rList.Free;
    r.CloseKey;
    r.Free;
  end;
begin
  GetAcadReleaseList('R14');
  GetAcadReleaseList('R15');
  GetAcadReleaseList('R16');
  GetAcadReleaseList('R17');
end;

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

Только желательно указать, что keyAcadRegRoot='SOFTWARE\Autodesk\AutoCAD' - так, кажется?

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

> kpblc
Сам догадается кому надо. Или как Shareware пойдет

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

Я слышал, что программа сделанная для одной версии AutoCAD работает с библиотекой данной версии.
А программа сделанная для другой версии AutoCAD работает с библиотекой данной версии.
Вот я сделал прогу для AutoCAD 2002, а с 2004 прога не заработала.
Где-то читал, что для 2004 уже используется другая библиотека типов или объектов. Эта библиотека подключается именно при компиляции
Как тогда быть ?

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

Гхм... Купить и прочитать "САПР на базе..." - там разобрано.

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

> Alexys
Не надо импортировать библиотеку типов. В ней происаны конкретные GUID для версии AutoCAD. В другой версии будут другие.
Надо использовать позднее связывание - то есть обращение к AutoCAD.Application, AutoCAD.Application.16 и т.д. Как определить нужный AutoCAD.Application в runtime - отдельный вопрос.
Не укладывать на форму никаких компонентов Acad*!

Re: Как на Delphi выбрать с каким релизом AutoCAD работать ?

Если не использовать компонент акад, то помощь в выборе свойств и методов видна не будет. Вроде так ? И результат написания кода (ошибки) будут выявляться при запуске, а не при отладке. Это неудобно. Но с другой стороны можно сначала с компонентом что-то написать, а на заключительном этапе его убрать. Так уважаемые профи?