Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Verständnisfrage zu Com und Interface-Propertys

  Alt 22. Aug 2018, 11: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 11:56 Uhr)
  Mit Zitat antworten Zitat