[Delphi] Delphi 8 en OLE automation

Pagina: 1
Acties:
  • 48 views sinds 30-01-2008

  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Hallo,

Ik wil in Delphi 8 OLE automation gebruiken om Word aan te spreken, zoiets als:

MyVar := CreateOleObject('Word.Appplication');
MyVar.visible := true;
.
.
etc.

Maar in Delphi 8 zit de routine CreateOleObject niet meer in de comobj unit.

Weet iemand hoe ik toch via OLE Word aan kan spreken?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Uit de Delphi 8 Documentation:
quote: ms-help://borland.bds2/bds2guide/html/AutomationObjects.htm
The CreateOleObject function (defined in ComObj) returns an IDispatch reference to an Automation object and is assignment-compatible with the variant Word.
Sja, misschien zit het ergens in je code gewoon niet goed waardoor ie CreateOleObject niet kan vinden?

/edit
hmm, na wat speurwerk lijkt het wel of CreateOleObject niet zo heel erg meer bestaat. Maar CreateComObject werkt gelukkig wel:
Delphi:
1
Wordje := CreateComObject(ProgIDToClassID('Word.Application'));


offtopic:
...hmm, react verneukt die quote url...

[ Voor 21% gewijzigd door _Thanatos_ op 02-02-2004 21:47 ]

日本!🎌


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Hallo _Thanatos_

thanks voor je reply

maar ehm... hoe moet ik de variabele 'wordje' in jou voorbeeld van createcomobject nu declareren?

ik kom er nog niet helemaal uit 8)7

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Op deze site vind je een goed voorbeeld van hoe je Word kan aanspreken vanuit Delphi

  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Hey jozy2002

Bedankt voor je reply maar het voorbeeld dat je noemt werkt niet met Delphi 8...
createoleobject bestaat niet meer...

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
janusja schreef op 03 februari 2004 @ 10:00:
Hey jozy2002

Bedankt voor je reply maar het voorbeeld dat je noemt werkt niet met Delphi 8...
createoleobject bestaat niet meer...
Dan vind je hier een voorbeeld van het gebruik van CreateComObject
Maar helaas is dit weer niet een voorbeeld met Word, maar misschien heb je er wat aan..

Altijd irritant als er na een delphi-upgrade bepaalde dingen niet meer werken.. :s

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

jozy2002, je begrijpt het denk ik niet :). Delphi 8 is voor .Net en alle vorige Delphi's zijn voor win32. Dat is een enorm groot verschil.

We adore chaos because we like to restore order - M.C. Escher


  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
LordLarry schreef op 03 februari 2004 @ 10:44:
jozy2002, je begrijpt het denk ik niet :). Delphi 8 is voor .Net en alle vorige Delphi's zijn voor win32. Dat is een enorm groot verschil.
Ai..
Sorry, dan begrijp ik het inderdaad niet..

Kun je me er iets meer over vertellen.. Is Delphi 8 alleen maar voor .NET? Of kun je er ook win32 applicaties mee maken..

Of weet je misschien waar ik hier concrete informatie over kan vinden?? Het is me namelijk nog steeds niet gelukt om nou echt precies duidelijk te krijgen wat een applicatie een .net applicatie maakt, en wat niet..

Microsoft zegt over MSN Messenger bijvoorbeeld dat het een .NET applicatie is.. Maar ik ben in de veronderstelling dat het gewoon een WIN32 applicatie is..

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Delphi 8 heet eigenlijk "Delphi 8 for .Net" en compiled alleen programma's voor .Net. Als je D8 koopt krijg je er D7 bij. Met D7 kan je voor win32 compilen.

.Net is een marketing term van MS. Alles binnen MS kreeg tot voorkort er .Net achter geplakt. Daarom is het ook zo verwarrend. De .Net waar wij het hier als programmeurs meestal over hebben is het .Net framework. Dat .Net framework bestaat ook weer uit verschillende onderdelen, zoals een compiler, JIT, GAC, FCL, CLR, IL, CLI enz.

Of MSN Messenger een .Net app is weet ik niet, maar aan de buitenkant zou je er ook weinig aan hoeven te merken. Ook de .Net applicatie heeft gewoon een EXE extensie.

Wat een Applicatie echt .Net maakt is dat het IL bevat ipv machine code en dat het dus door de JIT moet voordat het gaat draaien, maar zelfs die grens is mager met de dingen die VC.Net kan doen.

Het is een heel nieuwe API, compiler, technieken enz. (gebaseerd op al bestaande ideeen zoals Java en Delphi) en is zo groot dat het hier niet te doen is om alle afkortingen en theorieen uit te leggen. Hier op het forum en op internet is al aardig wat informatie te vinden. Als je specifieke vragen hebt of juist hele algemene vragen hebt over .Net zou ik een nieuw topic openen.

Mocht je je nog afvragen wat .Net jouw uitmaakt: De discussies en speculaties zijn nog gaande, maar over het algemeen wordt verwacht dat de win32 api over een bepaalde tijd door MS als depricated wordt aangemerkt en dat iedereen die Windows ontwikkeling doet ooit over moet.

We adore chaos because we like to restore order - M.C. Escher


  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Bedankt, het wordt me allemaal steeds iets meer duidelijk
Ga ik ook even kijken


Het klinkt misschien suf, maar ".NET" is nogal een verotte zoekterm in zoekmachines, en dat maakt het vinden van informatie niet makkelijker..

  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Wat ik dan in google nog wel eens doe is gewoon een vraag stellen: geef domweg als zoekactie 'wat is .net?' en je krijgt een stapel antwoorden.

Ondertussen ben ik er nog steeds niet uit met mijn Word en Delphi 8 vraag; iemand enig idee?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

In je "Project Manager" doe je rechtermuis op "References" en kiest voor "Add Reference..." Daar kies je voor "COM Imports" en kiest "Microsoft Word [versienummer] Object Library" (of hoe het in jouw office versie ook mag heten. Daarna kan je de volgende code gebruiken zoals je al gewend was:
Delphi:
1
2
3
4
5
6
7
8
uses Word;

procedure TForm1.Button1Click(Sender: TObject);
var Wordje: Word.ApplicationClass;
begin
  Wordje := CreateComObject(ProgIDToClassID('Word.Application')) as Word.ApplicationClass;
  Wordje.Visible := True;
end;


Dit is wel early binding integenstelling tot late binding zoals je doet met CreateOleObject. Early binding is sneller en minder foutgevoelig omdat de compiler al controleerd of alle aanroepen wel correct zijn.

Voor zover ik kan nagaan kan late binding niet zo simpel met .Net als we gewend waren bij win32 Delphi. Zoals hier te lezen valt in C#: http://www.csharphelp.com/archives2/archive348.html

We adore chaos because we like to restore order - M.C. Escher


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Yay! dit werkt!

Geweldig, dank je wel! _/-\o_

  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Ik gebruik nu:

var WordAp: Word.ApplicationClass;

en dan:

WordAp := CreateComObject(ProgIDToClassID('Word.Application')) as Word.ApplicationClass;

Als ik nu het volgende probeer:

wordap.Application.NewDocument('normal.dot');

krijg ik een foutmelding:

'read/write not allowed for CLR events. Use Include/Exclude procedure'

In de Delphi help staat: "Use Include/Exclude to add or remove methods."

maar daar kom ik ook niet verder mee; hoe los ik dit op?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het lijkt wel of NewDocument als event wordt gezien en niet als method. Kan dat kloppen?

We adore chaos because we like to restore order - M.C. Escher


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
yep, dat kan kloppen.

de melding komt trouwens al tijdens het compileren. Als ik help opvraag krijg ik het volgende:


read/write not allowed for CLR events. Use Include/Exclude procedure

Multicast events cannot be assigned to or read from like traditional Delphi read/write events.

Use Include/Exclude to add or remove methods.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je wilt een nieuw document aanmaken of wil je van Word te horen krijgen wanneer iemand een nieuw document maakt? De laatste is NewDocument, maar is de eerste niet gewoon Document.Add?

We adore chaos because we like to restore order - M.C. Escher


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Ik wil een nieuw document aanmaken.

Als ik het volgende gebruik:

Wordapp.Documents.Add('normal.dot');


krijg ik de melding:

There is no overloaded version of 'Add' that can be called with these arguments


enig idee?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Omdat Add veel meer parameters heeft dan die ene die jij geeft. Lees de documentatie er eens op na.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Tja janusja, kijk eens in de help in delphi.
Zet je op die Add method, druk op F1 en kijk welke signature Add heeft. Dit is gewoon een kwestie van het lezen van de documentatie en even wat zelfwerkzaamheid tonen.
Iedereen zou hier eens een topic moeten openen voor een dergelijke vraag, terwijl het antwoord binnen no-time in de help kan gevonden worden.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.