[delphi]Hoe een array van automation objects als out para

Pagina: 1
Acties:

  • tyball
  • Registratie: December 2000
  • Laatst online: 31-07 14:32
Ik werk met COM en Delphi en heb een automationObject TServer en TPrintOpdracht met bijbehorende interfaces . De Server moet een methode krijgen om alle printopdrachten die bij een bepaalde code horen te geven. Dus iets van(ter idee)

TServer.getPrintOpdrachten(code:Integer): array of IPrintOpdracht.

Mijn vraag is hoe ik nu in de type libary het voor elkaar krijg dat ik een array van IPrintOpdracht als out paramether declareer bij de getPrintOpdracht methode in de IServer interface.

Ik heb het als een Olevariant geprobeerd te declareren in de type libary , wat dus niet werkt(invalid typecast), je krijgt dan:

TServer.getPrintOpdrachten(code:Integer): Olevariant
var
p:array[0..1] of IPrintopdracht;

begin

Result:= p;


End;

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou heb ik niet zoveel verstand van COM, maar imho moet je het ook als parameter definieren, en niet als returnwaarde zoals jij nu doet.

De caller geeft dan een array mee, en de callee vult die array met data

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

.oisyn schreef op 14 October 2003 @ 12:14:
Nou heb ik niet zoveel verstand van COM, maar imho moet je het ook als parameter definieren, en niet als returnwaarde zoals jij nu doet.
Klopt, maar Delphi kan het zo laten zien alsof er een functie is met een returnwaarde. HResult wordt intern geregeld.
tyball schreef op 14 October 2003 @ 12:08:
Mijn vraag is hoe ik nu in de type libary het voor elkaar krijg dat ik een array van IPrintOpdracht als out paramether declareer bij de getPrintOpdracht methode in de IServer interface.
Je kan niet zomaar een array mee of teruggeven in COM. Gebruik daarvoor een IStream, een SafeArray/VariantArray in een OleVariant, IEnum of je eigen interface. Je eigen interface is meestal het netst en gaat zoiets heten van IPrinterOpdrachten. De interface zal functies bevatten om de losse items uit je array te benaderen, zoals property Items[Index: Integer], Delete(Index: Integer) enz..

/edit
Bij de SafeArray/VariantArray in een OleVariant breng je al je data in 1x naar de overkant. Bij de andere doe je dat dus per item.

[ Voor 8% gewijzigd door LordLarry op 14-10-2003 12:39 ]

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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Je kunt een IPrintopdrachten interface definiëren, die bijvoorbeeld zo uitziet:
Delphi:
1
2
3
4
5
6
type
  IPrintopdrachten = interface
    [{123bladibla}]
    Aantal: Integer;
    GetOpdracht(Nummer: Integer): IPrintopdracht;
  end;
Via deze interface kun je de afzonderlijke printopdrachten versturen. TServer kan er als volgt uitzien:
Delphi:
7
8
9
10
11
type
  TServer = class(TRemoteDataModule)
  public
    getPrintOpdrachten: IPrintopdrachten;
  end;

Een goede grap mag vrienden kosten.