Lazarus 2.0.12 (2021.02.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz: interface probléma 2012 nov. 16 08:50 #1201

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 463
  • Köszönetek: 76
Ki kell dolgoznod a teljes interface-t (minden benne található eljárást), különben hibát generál a kódod.

Az interface-k használatáról olvasd el ezeket:
7 - Interfaces
7.1 Interface Definition (Itt a lényeg: "It is not possible for a class to implement only part of the interface: it is all or nothing.")
7.3 Interface implementations (Tehát: "If a method of an interface is not implemented, then the compiler will give an error.")
wiki:How_To_Use_Interfaces

Ha legfrissebb változatot ajánlják akkor a fejlesztés alatt álló változatról beszélnek/írnak. Az általad használt változat (2.6.0) 2012. Január 1-én jelent meg (sf.net-en 2011.12.31). Azóta már sok fejlesztés és hibajavítás történt.
A valóban legfrissebb (fejlesztői) változat nem biztos hogy mindig megoldja az aktuális problémát, de használata többnyire előnyökkel jár:
ftp://freepascal.dfmk.hu/pub/lazarus/snapshots/ (Lazarus 1.1 + FPC 2.7.1) !
ftp://ftp.freepascal.org/pub/fpc/snapshot/ (v27 - csak FPC)
(mind a két címen hivatalos tárhely található, a legutóbbi fejlesztésekkel és javításokkal, naponta frissítve)
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- FPC 3.3.1 -- Lazarus 2.1.0 -- GNU/Linux 5.4.0 x86_64

Válasz: interface probléma 2012 nov. 15 20:26 #1200

  • prekox
  • prekox profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 87
  • Köszönetek: 4
Nem az lehet a probláma, hogy egy hasonló "" GUID-ot kell generáli mint az IUnknown interfésznek? Delhiben minden interfésznek saját GUID-ja van...
i5 3470
8GB
Win 10
CodeTyphon 7.0

Válasz: interface probléma 2012 nov. 13 13:46 #1199

  • malbert
  • malbert profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 2
  • Köszönetek: 0
Mivel nem igazán jön válasz a témához, itt egy kis kiegészítés hogy eddig miket nézegettem a témával kapcsolatban:

1) www.progdigy.com/forums/viewtopic.php?t=4987&sid=d39a410ee6439cc2fe556868be6855a1

Itt egy PAEz nick nevű felhasználó futott bele hasonló problémába még 2011. júliusában.

Az ő problémája konkrétan ez:

superobject.pas(122,18) Error: No matching implementation for interface method "IUnknown.QueryInterface(constref TGuid,out <Formal type>):LongInt; StdCall;" found

Line 120-124
type
// forward declarations
TSuperObject = class; //<- error line
ISuperObject = interface;
TSuperArray = class;

PAEz ezt a verziót használta:
Lazarus 0.9.31
SVN 30522
FPC 2.5.1

Erre a problémára egy Tankard nick nevű felhasználó válaszolt 2011 dec. 21-én.
Az ő válasza ez volt:
Az fpc 2.5.1.-es verzióban megváltoztatták ezt a funkciót ... és itt megadja a QueryInterface aktuális deklarációját.
Ezen kívül említ még valami superobject.pas fájlt és ott valami "const to constref[/b]" ami nekem nem mond semmit. Gondolom itt az fpc forrásáról beszél.
Egyébként nekem az adott QueryInterface függvény az objpash.inc fájlba van (ami itt található: \lazarus\fpc\2.6.0\source\rtl\inc könyvtárba van:

IUnknown = interface

function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
end;

Ebből sajnos nem lettem okosabb.

2) sourceforge.net/tracker/index.php?func=detail&aid=3096230&group_id=29749&atid=397251
Itt is foglalkoznak a témával és itt is gyakorlatilag azt tanácsolják, hogy frissebb fpc-t használjon.

Ezen kívül van még pár hasonló eset, ahol frisebb fpc-t javasolnak, ill. vannak olyan esetek, amikor komponenseknél tanácsolják, hogy frisebbet használjanak.

Nálam a probléma az, hogy én a legfrisebb fpc-t használom, és semmilyen beállítást nem változtattam a lazarusban (talán pont ez a gond), és csak egy sima IInterface-t szeretnék használni, de nem jön össze.

interface probléma 2012 nov. 10 11:06 #1198

  • malbert
  • malbert profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 2
  • Köszönetek: 0
Interface-t szeretnék használni, de folyamatosan ezzel a hibával találkozok:

Error: No matching implementation for interface method "IUnknown.QueryInterface(constref TGuid,out <Formal type>):LongInt; StdCall;" found
Error: No matching implementation for interface method "IUnknown._AddRef:LongInt; StdCall;" found
Error: No matching implementation for interface method "IUnknown._Release:LongInt; StdCall;" found

Kerestem megoldást, de jelemzően mindenhol frissítést javasolnak.

A fenti hiba előidézéséhez csak ennyit tettem:
Letöltöttem a lazarust innen: sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2064%20bits/Lazarus%201.0.2/
Letöltött fájl: lazarus-1.0.2-fpc-2.6.0-win64.exe

Feltelepítettem egy win7 64bit-re.

Elindítottam, és létrehoztam egy új Application projektet.

Beleírtam a következőket a unit Unit1 type részébe:

ITeszt = interface(IUnknown)
procedure Teszt;
end;

TTeszt = class(ITeszt)
public
procedure Teszt;
end;

Lefordítottam a projektet és a fenti hibát kaptam.

Amennyiben a TTeszt leszármaztatásánál megadom az ITeszt interfészt, akkor előjön a hiba, ha nem adom meg, akkor nem.

Lazarus verzió: 1.0.2
FPC verzió: 2.6.0
SVN Revízió: 39019

A fenti projektet csak a teszt miatt írtam meg. A valóság az, hogy egy olyan projektet se tudok fordítani, ahol interface van használva. Mindegyiknél a fent leírt hibát kapom.

Ha tud valaki megoldást légyszi írjátok meg.
Köszi

  • Oldal:
  • 1