Hot News:

Unser Angebot:

  Foren auf CAD.de
  Grundsätzliches
  Delphi AutoCAD - OLE Problem?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
Autor Thema:  Delphi AutoCAD - OLE Problem? (5753 mal gelesen)
june
Mitglied


Sehen Sie sich das Profil von june an!   Senden Sie eine Private Message an june  Schreiben Sie einen Gästebucheintrag für june

Beiträge: 4
Registriert: 03.02.2005

erstellt am: 03. Feb. 2005 15:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo an alle,

ich habe ein großes Problem wenn ich von Delphi auf AutoCAD zugreifen möchte. Ich habe dir Typenbibliothek usw in Delphi eingebunden und folgenden Code erstellt um eine Zeichnung in ACAD zu öffnen.
Eigentlich möchte ich sie mit

Acad.Application.ActiveDocument.Database.Blocks.Add(vpoint,'c:\z1.dwg');

einfügen aber da bekomme ich eine Fehlermeldung OLE.... mit der ich nichts anfangen kann.
Dann habe ich es mit einem "schlichten" open probiert und funktioniert leider auch nicht.

Der komplette Code ist folgender:


var
  Acad2000 : Variant;;
  Acad: AcadApplication;
  vpoint : Variant;
  acade  : AcadEntity;
  acadblockref : AcadBlockReference;
  ablock : AcadBlock;
  atest : AcadDocument;
  st : string;

begin

  try
    Acad2000 := GetActiveOleObject('AutoCAD.Application.15');
  except
    try
        ShowMessage('kein connect');
        Acad2000 := CreateOleObject('AutoCAD.Application.15');
    except
        ShowMessage('kein create moeglich');
        Exit;
    end;
  end;

  Acad := IDispatch(Acad2000) As AcadApplication;
  Acad2000.Visible := True;
  Acad.ActiveDocument.Activate;

  // Meine Variable für die Koordinaten als OLEVariant
  vPoint := VarArrayCreate([0,2], varVariant);
  vPoint[0] := 1.0; vPoint[1] := 1.0; vPoint[2] := 1.0;

  // Testbefehle die funktioniern !!! sendcommand geht auch
  st := string(acad.Application.Caption);
  showmessage(st);
 

  // Egal welchen der Befehle ich verwende
  // beim Aufruf kommt ein "schwerer" Fehler

  Acad.Application.ActiveDocument.Open('c:\test.dwg');

  oder

  Acad.ActiveDocument.Import('c:\test.dwg',vpoint,10);

  oder

  Acad.ActiveDocument.ModelSpace.InsertBlock  (vpoint,'c:\z1.dwg',0,0,0,0);


end;
(Ich benutze AutoCad 2000 und Borland Delphi 7.0)

Vielleicht mache ich einen grundsätzlichen Fehler?!?
Für jeden möglichen Lösungsvorschlag wäre ich sehr dankbar.

Gruß
Jürgen

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas2DEasy
Mitglied
Softwareentwickler


Sehen Sie sich das Profil von Andreas2DEasy an!   Senden Sie eine Private Message an Andreas2DEasy  Schreiben Sie einen Gästebucheintrag für Andreas2DEasy

Beiträge: 73
Registriert: 29.12.2004

erstellt am: 03. Feb. 2005 21:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für june 10 Unities + Antwort hilfreich

hi, folgende Tips :
http://mysite.verizon.net/~vze2vjds/delphi/index.htm

das sollte alle deine probleme lösen
wenn noch was ist

einfach posten

Gruß Andreas

------------------
Nobody is perfect

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas2DEasy
Mitglied
Softwareentwickler


Sehen Sie sich das Profil von Andreas2DEasy an!   Senden Sie eine Private Message an Andreas2DEasy  Schreiben Sie einen Gästebucheintrag für Andreas2DEasy

Beiträge: 73
Registriert: 29.12.2004

erstellt am: 03. Feb. 2005 21:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für june 10 Unities + Antwort hilfreich

vieleicht kannst du ja mal deinen code posten , dann kann ich den debugger mal laufen lassen
Ich habe aber leider die ACAD nicht mehr.
nach dem ständigen debuggen hatte ich die schnauze voll
und habe eine eigene Engine geschrieben

Gruß Andreas

------------------
Nobody is perfect

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas2DEasy
Mitglied
Softwareentwickler


Sehen Sie sich das Profil von Andreas2DEasy an!   Senden Sie eine Private Message an Andreas2DEasy  Schreiben Sie einen Gästebucheintrag für Andreas2DEasy

Beiträge: 73
Registriert: 29.12.2004

erstellt am: 03. Feb. 2005 21:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für june 10 Unities + Antwort hilfreich

hab noch mal über deinen code geschaut
versuchs doch mal mit

var
  Acad2000 : OleVariant;
statt
var
  Acad2000 : Variant;;


------------------
Nobody is perfect

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

june
Mitglied


Sehen Sie sich das Profil von june an!   Senden Sie eine Private Message an june  Schreiben Sie einen Gästebucheintrag für june

Beiträge: 4
Registriert: 03.02.2005

erstellt am: 04. Feb. 2005 10:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Andreas,

Danke für deine Antworten !!!

Die Webseite kenne ich, es ist aber schade
das ein paar "interessante" Links auf ihr nicht mehr
funktionieren.

Das Fehlerhandling ist echt Müll!!!
Ich habe es zwar geschafft das meine Zeichnung/Block
eingefügt wir aber ich kann immernochnicht
so gut die möglichen Fehler abfangen.
Mein Problem war das ich den Insertpoint als varVariant
und nicht als VT_R8 Definiert habe!!! (!!Ich könnte ausrassten!!)

NICHT SO:    vPoint := VarArrayCreate([0,2], varVariant);
Sondern SO:  vPoint := VarArrayCreate([0,2], VT_R8);

Mir dem OLEVariant hattest Du recht!

Ich hab da aber noch ein paar Fragen :-)

1. Kannst Du mir einen allgemeinen Tip geben wie ich am besten
OLE Fehler abfangen kann?
mit try .... except ... end; kann ich das ja vergessen.
Gibt´s da bessere Möglchkeiten?

2. Wie meinst Du das mit der eigenen Engine?

3. Kennst Du irgendein Buch zu Delphi-ACAD
  oder weitere Sample/Tutorial/Source Seiten für diesen Zweck?
  Die besten die ich gefunden habe waren endweder
  aus china russland oder sonstwo.
  Ich arbeite mit dem Buch
  "AUTOCAD 2004 VBA - A Programmers Reference" von Joe Sutphin
  und "übersetz" mir das ganze was ich brauche in Delphi.


Vielen Dank!!

Gruß Jürgen

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

june
Mitglied


Sehen Sie sich das Profil von june an!   Senden Sie eine Private Message an june  Schreiben Sie einen Gästebucheintrag für june

Beiträge: 4
Registriert: 03.02.2005

erstellt am: 04. Feb. 2005 11:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Noch eine klein Frage:

Ich würde gerne auf Events von ACAD reagieren.
z.B.
------VBA CODE

Event Modified(pObject As AcadObject)
      Element von AutoCAD.AcadBlocks
      Wird ausgelöst, wenn ein Objekt
      oder eine Gruppierung in der Zeichnung geändert wurde.

------VBA CODE

wie kann ich sowas in Delphi machen?
OLE-Server ? EventDispatch?
Aber wenn, wie ?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas2DEasy
Mitglied
Softwareentwickler


Sehen Sie sich das Profil von Andreas2DEasy an!   Senden Sie eine Private Message an Andreas2DEasy  Schreiben Sie einen Gästebucheintrag für Andreas2DEasy

Beiträge: 73
Registriert: 29.12.2004

erstellt am: 04. Feb. 2005 12:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für june 10 Unities + Antwort hilfreich

Du hast doch die ACAD_TLB.pas
da sind für die Klassen , und die interfaces
inden interfaces findest du die events für dokumente, Appl.
unter anderem objektadded usw.
für alles was du noch brauchst musst du ein eigenes Interface oder wrapper schreiben.

zum Thema Engine:
ich brauche acad nicht mehr , habe eine eigene Appl.

ich kann dir gleich sagen , das wenn acad-version sich ändert,
fängst du von vorne an

Gruß Andreas

------------------
Nobody is perfect

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

stopf
Mitglied
dipl.Ing

Sehen Sie sich das Profil von stopf an!   Senden Sie eine Private Message an stopf  Schreiben Sie einen Gästebucheintrag für stopf

Beiträge: 1
Registriert: 14.05.2005

erstellt am: 14. Mai. 2005 21:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für june 10 Unities + Antwort hilfreich

ich krieg auch immer nen fehler..

hab aber den code schon ausgefeilt, denk ich?

CODE:

  var
    Acad: AcadApplication;
    vPoint : OleVariant;
    AppWasRunning: boolean; // tells you if you can close Excel when you've finished
//    lcid: integer;
    Unknown: IUnknown;
    Result: HResult;
//    st : string;

  begin
//    lcid := LOCALE_USER_DEFAULT;
    AppWasRunning := False;

    {$IFDEF VER120}      // Delphi 4
    Result := GetActiveObject(CLASS_Application_, nil, Unknown);
    if (Result = MK_E_UNAVAILABLE) then
      Acad := CoApplication_.Create

    {$ELSE}              // Delphi 5
    Result := GetActiveObject(CLASS_AcadApplication, nil, Unknown);
    if (Result = MK_E_UNAVAILABLE) then
      Acad := CoAcadApplication.Create
    {$ENDIF}

    else begin
      { make sure no other error occurred during GetActiveObject }
      OleCheck(Result);
      OleCheck(Unknown.QueryInterface(AcadApplication, Acad));
      AppWasRunning := True;
    end;
    Acad.Visible := True;


  vPoint := VarArrayCreate([0,2], VT_R8);
  vPoint[0] := 1.0; vPoint[1] := 1.0; vPoint[2] := 1.0;
  Acad.ActiveDocument.Open('c:\Prototype.dwg');

Fehlermeldung:

Erste Zufalls-Exception bei $7C81EB33. Exception-Klasse EOleException mit Meldung 'OLE-Fehler 80210070'.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz