AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Verständnisfrage zu Com und Interface-Propertys

Verständnisfrage zu Com und Interface-Propertys

Ein Thema von Delbor · begonnen am 22. Aug 2018 · letzter Beitrag vom 13. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2   
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
726 Beiträge
 
Delphi 10.3 Rio
 
#1

Verständnisfrage zu Com und Interface-Propertys

  Alt 22. Aug 2018, 12:27
Hi zusammen

Vorausschicken muss ich: Ich habe noch nie etwas mit Com und/oder Interfaces gemacht und habe desshalb damit Null Erfahrung. Das einzige, was ich verbuchen kann, sind die unzähligen Beiträge im Netz, die ich in den letzten Tagen zusammengesucht habe (und ein vor vielen Jahren nachgebautes Beispiel mit Word und CreateOleObject).
Ich habe die Typbibliothek des PDFCreators importiert (ohne Komponentenwrapper z erstellen). Dabei gibt es Konstrukte wie:
Delphi-Quellcode:
  IQueue = dispinterface
    ['{3803F46C-F5AA-4B86-8B9C-6EFFAC9CDCFA}']
    procedure Initialize; dispid 1610743808;
    function WaitForJob(timeOut: Integer): WordBool; dispid 1610743809;
    function WaitForJobs(jobCount: Integer; timeOut: Integer): WordBool; dispid 1610743810;
    property Count: Integer readonly dispid 1610743811;
    property NextJob: IPrintJob readonly dispid 1610743812;
    function GetJobByIndex(jobIndex: Integer): IPrintJob; dispid 1610743813;
    procedure MergeJobs(const job1: IPrintJob; const job2: IPrintJob); dispid 1610743814;
    procedure MergeAllJobs; dispid 1610743815;
    procedure Clear; dispid 1610743816;
    procedure DeleteJob(index: Integer); dispid 1610743817;
    procedure ReleaseCom; dispid 1610743818;
  end;
Dieses Interface versuche ich nun, in einer Klasse zu nutzen:
Delphi-Quellcode:
type
  TCustomCreatePDFClass = class(TPersistent)
    {private}
     FPDFCreator: IPDFCreator;
     FPrinters : IPrinters; //,
     FPrintJob : IPrintJob;
     FPrintJobInfo : IPrintJobInfo;
     FQueue : IQueue;
     FJobFinishedEvent : IJobFinishedEvent;

     {public}
      procedure CreatePDFCreator;
      procedure InitializeQueue;
  end;
und:

Delphi-Quellcode:
procedure TCustomCreatePDFClass.InitializeQueue(TInterfacedObject, IQueue);
begin
  FQueue := CoQueue.Create;
  FQueue.Initialize;
  FQueue.WaitForJob(10); // Bis hierhin scheint alles in Ordnung zu sein

  FPrintJob := FQueue.NextJob; // Hier meckert Delphi, IQueue hätte kein Element Namens 'NextJob'
  FPrintJob.NextJob; // Hier meckert Delphi, IPrintJob hätte kein Element Namens 'NextJob'
  FPrintJob.SetProfileSetting();
end;
Dabei versuche ich, nach diesen Anweisungen vorzugehen - ob ich allerdings bis jetzt auch nur ansatzweise auf dem richtigen Dampfer bin, weiss ich (noch) nicht.

Ich hab mich auch schon versucht, über Propertys in Interfaces schlau zu machen:
https://stackoverflow.com/questions/...and-properties
https://stackoverflow.com/questions/...rty-visibility
https://www.delphipraxis.net/65692-p...interface.html

Wobei mir gerade jetzt Beittrag 6 im letzten verlinkten Beitrag aufgefallen ist (die Methodenzuordnungsklauseln). Trotzdem ist mir da einiges nicht klar. In dem Beispiel ist das Interface-Property so deklariert:
Delphi-Quellcode:
ISample = interface
  function getValue : Integer;
  procedure setValue(value : Integer);
  property Value : Integer read getValue write setValue;
end;
Meine Interface-Propertys hingegen so:
Delphi-Quellcode:
    property Count: Integer readonly dispid 1610743811;
    property NextJob: IPrintJob readonly dispid 1610743812;
An Implementierungen enthält die TLB gerade mal die Classfunctions Create und CreateRemote.

Ich denke, ich habe da noch einiges nicht verstanden. Wie stark liege ich daneben, wenn ich von der Idee ausgehe: Indem ich die von dem Interface angegebenen Methoden in meiner Klasse implementiere, überschreibe ich allfällige Implementierungen des Ursprungsobjekts (hier also PDFCreator)?
Oder hab ich bislang weniger als nichts begriffen?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (22. Aug 2018 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
726 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 22. Aug 2018, 22:14
Hi zusammen

Inzwischen habe ich die Deklaration der Klasse TCustomCreatePDFClass angepasst - was mich zur bisherigen Deklaration veranlasst hat, kann ich nicht mehr nachvollziehen. Die neue Deklaration in einer eigenen Unit:

Delphi-Quellcode:
unit PDFCreatorClassUnit;

interface

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, mscorlib_TLB, Winapi.ActiveX, PDFCreator_COM_TLB;

type
  TCustomCreatePDFClass = class(TInterfacedObject, IQueue)
    {private}
     FPDFCreator: IPDFCreator;
     FPrinters : IPrinters;
     FPrintJob : IPrintJob;
     FPrintJobInfo : IPrintJobInfo;
     FQueue : IQueue;
     FJobFinishedEvent : IJobFinishedEvent;

     {public}
      procedure CreatePDFCreator;
      procedure InitializeQueue;
  end;


implementation
Und da beginnt schon das erstte Problem: das Interface IQueue wird markiert. unddie Meldung lauted : 'Interfacetyp erwartet'. Und dies, obwohl erst eine Zele darüber die Unit PDFCreator_COM_TLB eingebunden wird.

Was ist da falsch?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.544 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 22. Aug 2018, 22:37
interface ist nicht gleich dispinterface

IQueue = dispinterface
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
726 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 22. Aug 2018, 23:00
Hi Uwe Raabe

Danke für deine Antwort! Aber versteh ich das richtig, Ich kann gar keine solchen Klasen deklarieren? In der fraglichen Tlb gibts ausser den CoKlassen nur Dispinterfaces.

Aber da fällt mir noch etwas auf:
Delphi-Quellcode:
  CoQueue = class
    class function Create: IQueue;
    class function CreateRemote(const MachineName: string): IQueue;
  end;
Davon gibts sechs Stück - eines weniger wie Interfaces. Und das könnte mich auf die Idee bringen, meine Klasse von solch einer Co-Klasse abzuleiten. Nur habe ich von so einer Möglichhkeit nirgends was gelesen, auch im Embaa-Wicki nicht

Gruss
Delbor

PS: Es sei denn, ich fände noch sowas...
Und wenn ich richtig liege, entspräche dies dann der späten Bindung, und das wollte ich eigentlich vermeiden.
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (22. Aug 2018 um 23:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.214 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 08:13
Verzichtest Du aus didaktischen Gründen auf den Komponentenwrapper?

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.544 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 08:37
Delphi-Quellcode:
procedure TCustomCreatePDFClass.InitializeQueue(TInterfacedObject, IQueue);
begin
  FQueue := CoQueue.Create;
  FQueue.Initialize;
  FQueue.WaitForJob(10); // Bis hierhin scheint alles in Ordnung zu sein

  FPrintJob := FQueue.NextJob; // Hier meckert Delphi, IQueue hätte kein Element Namens 'NextJob'
  FPrintJob.NextJob; // Hier meckert Delphi, IPrintJob hätte kein Element Namens 'NextJob'
  FPrintJob.SetProfileSetting();
end;
Mit den hier gezeigten Deklarationen sollte das aber schon gehen. Häng doch mal ein Minimalprojekt an, mit dem wir das Problem reproduzieren können.

Aber versteh ich das richtig, Ich kann gar keine solchen Klasen deklarieren?
Das ist richtig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
726 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 11:02
Hi zusammen
Verzichtest Du aus didaktischen Gründen auf den Komponentenwrapper?
Sherlock
Nein, das war eigentlich nicht meine Absicht. Bei meinen Versuchen, Paperport fernzusteuern wurden mir die Dinger "automatisch" installiert, (ich hatte das entsprechende Häkchen im Importdialog übersehen), wonach ich dann 32 dieser Dinger auf der Toolbox kleben hatte. Angesichts der Tatsache, dass ich die Typbibliotheken gerade mal für eine Anwendung brauche, schien mir dies zuviel des guten.
Andrerseits ists ja schon so: ich lerne mehr, wenn mir die Arbeiten nicht einfach so abgenommen werden - ich hatte mir schon überlegt, die TLB wieder zu löschen und mit dem Wrapper neu zu importieren. Vom Lerneffekt her ist es aber ganz gut, dass ichs nicht getan habe.

Delphi-Quellcode:
procedure TCustomCreatePDFClass.InitializeQueue(TInterfacedObject, IQueue);
begin
  FQueue := CoQueue.Create;
  FQueue.Initialize;
  FQueue.WaitForJob(10); // Bis hierhin scheint alles in Ordnung zu sein

  FPrintJob := FQueue.NextJob; // Hier meckert Delphi, IQueue hätte kein Element Namens 'NextJob'
  FPrintJob.NextJob; // Hier meckert Delphi, IPrintJob hätte kein Element Namens 'NextJob'
  FPrintJob.SetProfileSetting();
end;
Mit den hier gezeigten Deklarationen sollte das aber schon gehen. Häng doch mal ein Minimalprojekt an, mit dem wir das Problem reproduzieren können.
So ein Minimalprojekt müsste ich erst noch entwerfen - das Testprojekt ist dafür wohl eher schon zu gross. Aber ich hänge hier mal die erzeugte TLB an. Ich denke, das würde dir wohl schon einiges nützen.

Was den Zugriff auf den PDFCreator angeht - da existiert ausser den obigen Zeilen eigentlich noch gar nichts ausser leeren Methodenrümpfen.

Gruss
Delbor
Angehängte Dateien
Dateityp: pas PDFCreator_COM_TLB.pas (14,8 KB, 2x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.544 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 11:42
Also, den Fehler Hier meckert Delphi, IQueue hätte kein Element Namens 'NextJob' kann ich hier nicht reproduzieren. Allerdings hat der Fehler Hier meckert Delphi, IPrintJob hätte kein Element Namens 'NextJob' durchaus seine Berechtigung.

Du könntest der Vollständigkeit noch deine Version der mscorlib_TLB.pas anhängen. Vielleicht bringt die noch ein paar Erkenntnisse.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
726 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 12:07
Hi Uwe Raabe

Die liegt im selben Verzeichnis wie die PDFCreator_COM_TLB - das Problem ist: ich habe keine Ahnung, woher die kommt. Ich dachte erst, das sei eine Typbibliothek, um Windows fernzusteuern - WMI oder sowas, doch das scheint nicht der Fall zu sein. Ich habe allerdings auch nicht weiter gesucht, da ich erstmal mit dem vorliegenden Projekt klarkommen muss. Nun findest du sie im Anhang.

Gruss
Delbor
Angehängte Dateien
Dateityp: zip mscorlib_TLB.zip (169,2 KB, 2x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.544 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Verständnisfrage zu Com und Interface-Propertys

  Alt 23. Aug 2018, 13:19
Die mscorlib_TLB wird vond er PDFCreator_COM_TLB benötigt. Interessanterweise gibt es in der mscorlib_TLB auch eine Co-Klasse CoQueue, weswegen die Reihenfolge in der Uses-Anweisung von Belang wäre. Allerdings gäbe es da andere Fehler.

Der folgende Text compiliert hier ohne Probleme:
Delphi-Quellcode:
procedure Main();
var
  FQueue: IQueue;
  FPrintJob: IPrintJob;
begin
  FQueue := CoQueue.Create;
  FQueue.Initialize;
  FQueue.WaitForJob(10); // Bis hierhin scheint alles in Ordnung zu sein

  FPrintJob := FQueue.NextJob; // Hier meckert Delphi, IQueue hätte kein Element Namens 'NextJob' --- hier nicht!
// FPrintJob.NextJob; // Hier meckert Delphi, IPrintJob hätte kein Element Namens 'NextJob' --- Das ist auch korrekt so.
  FPrintJob.SetProfileSetting('Hurz', 'Hurz');
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf