Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

interface i korištenje

[es] :: Pascal / Delphi / Kylix :: interface i korištenje

[ Pregleda: 2607 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon interface i korištenje27.01.2019. u 21:55 - pre 62 meseci
Kada je malo vremena pokušavam nešto i naučiti...
Koristim klase i objekte, a vidim da postoji i nešto što se zove "interface".

Pokušavam shvatiti namjenu toga... i koliko shvatio sam samo dvije stavri:
1. ako klasu definiram kao nasljednika interface-a, moram definirati sve metode koje su definirane u interface-u
2. ako kreiram objek od interface-a, ne moram ga destroy-ati, tj. raditi free, sam se uništi

U tome i ne vidim neku korist.
Ako netko zna, a ima malo vremena i volje ( :) ) da pojasni primjenu i svrhu korištenja interface-a u programu i pri definiranju klasa.
 
Odgovor na temu

Predrag Supurovic
Pedja YT9TP
Užice

Član broj: 157129
Poruke: 6275

Sajt: pedja.supurovic.net


+1570 Profil

icon Re: interface i korištenje27.01.2019. u 23:46 - pre 62 meseci
Nasleđuješ klase a interfejse implementiraš.

Glavna stvar je da možeš da naslediš samo jednu klasu a možeš da implementiraš više interfejsa.

To u praksi znači da klase mogu da budu kompatibilne i ako ne nasleđuju neku zajedničku osnovnu klasu, već ako obe implementiraju isti interfejs.

To se odnosi i na prosleđivanje klasa kao parametara - ako paramtear definišeš da je ti određenog interfejsa onda sve kalse, kakve god da su, mogu da budu prosleđene kao taj parameter, sve dok imaju implementiran taj interfejs.

Interfejsi rešavaju problem kada imaš dve razliite klase koje nasleđuju razlišite osnovne klase ali ti je neohodno da sa obema radiš na isti način.

Sve u svemu, interfejsi otvaraju novo poglavlje u pristupu objektnog programiranja i ako te interesuje, treba to dobrano da izučiš.


 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje28.01.2019. u 05:30 - pre 62 meseci
Interfejsi su izuzetno korisni, pored Predragovog objasnjenja dodao bih kratki primer. Imas na primer, fakture, profakture i izvode i zelis da obezbedis import/eksport za ta dokumenta u xml, deklarisao bi nesto poput:

Code:

IXMLHandler = interface
['GUID interfejsa']
  procedure LoadFromXML(const AXMLDoc: string);
  function SaveToXML: string;
end;

TProfaktura = class(TDokument, IXMLHandler)
private
  procedure LoadFromXML(const AXMLDoc: string);
  function SaveToXML: string;
public

end;

TFaktura = class(TDokument, IXMLHandler)
private
  procedure LoadFromXML(const AXMLDoc: string);
  function SaveToXML: string;
public

end;

TIzvod = class(TObject, IXMLHandler)
private
  procedure LoadFromXML(const AXMLDoc: string);
  function SaveToXML: string;
public

end;


Kao sto vidis imas razne klase, sa razlicitim parentima a izvrsavaju isti zadatak na isti nacin. U narednoj verziji ukaze se potreba da radis import/eksport u JSON format, dodas novi interfejs i implementaciju. S tim sto ne meras u svakoj klasi implementirati interfejs vec to mozes u parent (ako imaju zajednickog) ili u nekoj potpuno nezavisnoj koju ces samo referencirati.
Interfejsi su takodje put ka COMu (sigurno si nekad koristio CreateOleObject), pola windowsa je tako uradjeno, MS Office itd.
 
Odgovor na temu

Deunan

Član broj: 338178
Poruke: 83
*.dynamic.isp.telekom.rs.



+21 Profil

icon Re: interface i korištenje28.01.2019. u 11:37 - pre 62 meseci
Jos jedan primer kojeg ces se nagledati, callback interface:

Zamisli da pises klasu "Posao" (ili paket) koju ce da koristi gomila ljudi (sa kojima radis, ili objavis paket).
Klasa treba da odradi neki posao i vrati rezultat glavnoj klasi koja je kreirala. (jezik je nebitan)

Code:

class Mojaklasa()    {
  
    // negde u klasi pozoves:
    Posao posao = new Posao(this);    // zapamti da je prosledjen "this" u klasu posao

    function posaoPrekinut(greska)  {  
      // klasa "Posao" vratila gresku  
   }
   function posaoGotov(rezultat)  {  
      // klasa "Posao" vratila rezultat  
   }
}

class Posao   {
  private Mojaklasa glavnaKlasa;

  constructor(Mojaklasa klasa)  {   // od prosledjenog "this" sacuvas referencu klase "Mojaklasa"
      this.glavnaKlasa = klasa;
      this.zapocniPosao();
  }

  function zapocniPosao()   {
    // neki posao
    if(greska)   {
       this.glavnaKlasa.posaoPrekinut(greska);   // vratis gresku klasi "Mojaklasa"
    }
    else {
      this.glavnaKlasa.posaoGotov(rezultat);   // vratis rezultat klasi "Mojaklasa"
    }
  }
}


ovaj kod ce da radi, ali imas 2 problema:
1. u klasi "Mojaklasa" moras tacno da znas imena callback funkcija koje klasa "Posao" moze da pozove i sta ce da vrati:
function posaoPrekinut(greska)
function posaoGotov(rezultat) ...

a, moze da ih bude mnogo vise.

2. Kada prosledis "this", klasa "Posao" mora tacno da zna ime tvoje klase da bi napravila referencu:
constructor(Mojaklasa klasa) {
this.glavnaKlasa = klasa;
}

Zato u paket ubacis interfejs da Mojaklasa moze da implementira:

i kod sad izgleda ovako:
Code:

interface PosaoInterface   {
  function posaoPrekinut(greska);
  function posaoGotov(rezultat);
}

class Mojaklasa() implements PosaoInterface    {
  
    Posao posao = new Posao(this);

    override function posaoPrekinut(greska)  {   // PosaoInteface ce te "naterati" da dodas callback funkciju }
    override function posaoGotov(rezultat)  {  // PosaoInteface ce te "naterati" da dodas callback funkciju }
}

class Posao   {
  private PosaoInterface glavnaKlasa;

  constructor(PosaoInterface klasa)  {   // posto Mojaklasa implementira PosaoInterface, mozemo ovako da cuvamo referencu
      this.glavnaKlasa = klasa;
      this.zapocniPosao();
  }

  function zapocniPosao()   {
    // neki posao
    if(greska)   {
       this.glavnaKlasa.posaoPrekinut(greska);   // callback funkcija sigurno postoji jer ce klasu "Mojaklasa" interfejs naterati da implementira
    }
    else {
      this.glavnaKlasa.posaoGotov(rezultat);   // callback funkcija sigurno postoji jer ce klasu "Mojaklasa" interfejs naterati da implementira
    }
  }
}


Sada klasa "Posao" ne zavisi od klase "Mojaklasa" pa mozes da je koristis i u drugim klasama:
Code:

class Nekadrugaklasa implements PosaoInterfejs   {
  Posao posao = new Posao(this);
  // override  interface functions
}

class Nekatrecaklasa implements PosaoInterfejs   {
  Posao posao = new Posao(this);
  // override  interface functions
}

class Nevaznokakosezoveklasa implements PosaoInterfejs   {
  Posao posao = new Posao(this);
  // override  interface functions
}




 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje28.01.2019. u 19:00 - pre 62 meseci
Ako sam dobro shvatio... interface me natjera da u svakoj klasi koja ga nasljeđuje definiram metode koje su definirane u interface-u, ali i pored toga, u svakoj klasi moram definirati metodu za tu klasu i napisati za nju kod.

Savkiceve 3 klase imaju 2 istoimene metode, ali u svako klasi se treba napisati kod za njezinu metodu koja će raditi u tok klasi? Što sam onda dobio time? Ako napišem klase, bez interface-a s metodama: XMLLoda i XMLSave opet mogu koristiti:
Kl1.XMLLoad
Kl2.XMLLoad
Kl3.XMLLoda

Da li u slućaju interface-a mogu napisati npr;
Kl4 := Kl1;
Kl4.XMLLoad;
Kl4 := Kl2;
Kl4.XMLLoad;

Ako radim sam na projektu, ne vidim korist od toga ili nisam shvatio poantu svega toga.

Neka literatura, a da nije općenito o klasama, objektima i programiranju?
Možda neki gotovi primjer implementacije interface-a i pojašnjenje zašto je tako kako je?

Koda nas postoji izreka: "daš mu mali prst, a on uzme ruku...." :) . Mislim da ima još programera kojima bi ta tema bila zanimljiva.
 
Odgovor na temu

Predrag Supurovic
Pedja YT9TP
Užice

Član broj: 157129
Poruke: 6275

Sajt: pedja.supurovic.net


+1570 Profil

icon Re: interface i korištenje28.01.2019. u 21:43 - pre 62 meseci
Štos je u tome što ti interfejsi omogućavaju da raznorodne klase povežeš.

Zato u svakaj klasi moraš da napišeš medode koje uslovljava interfejs - implementacija svake te metode obično i jeste drugačija za svaku klasu.

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje28.01.2019. u 22:26 - pre 62 meseci
> Ako sam dobro shvatio... interface me natjera da u svakoj klasi koja ga nasljeđuje definiram metode koje su definirane u interface-u, ali i
> pored toga, u svakoj klasi moram definirati metodu za tu klasu i napisati za nju kod.

Ne moras, mozes imati jednu klasu koja implementira te interfejse koju ces svuda referencirati tj. gde je to moguce.
Dakle, ako imas 20 klasa koje implementiraju IXMLHandler ne moras u svakoj pisati kod za LoadFromXML i SaveToXML,
dovoljno je da napises nezavisnu klasu (npr. TXMLHandler) koja ih implemntira i onda dalje u tih 20 klasa samo referenciras TXMLHandler.

> Savkiceve 3 klase imaju 2 istoimene metode, ali u svako klasi se treba napisati kod za njezinu metodu koja će raditi u tok klasi? Što sam onda
> dobio time? Ako napišem klase, bez interface-a s metodama: XMLLoda i XMLSave opet mogu koristiti:

To podrazumeva da sve te klase imaju istog parenta koji definise te metode, ako nemaju onda ih ne mozes koristiti na taj nacin.

> Možda neki gotovi primjer implementacije interface-a i pojašnjenje zašto je tako kako je?

Sa primerima je tesko, pogledaj Delphi (ili WinApi) source kod, ima brdo interfejsa.
Pogledaj i:
https://www.thoughtco.com/inte...delphi-programming-101-1058278
http://www.delphibasics.co.uk/Article.asp?Name=Interface
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje30.01.2019. u 20:35 - pre 62 meseci
Hvala na pojašnjenjima, shaćam način primjene, ali ne i svrhu!

http://www.delphibasics.co.uk/Article.asp?Name=Interface

sam isprobao bez interface-a i radi jednako, procedura TForm1.FormCreate(Sender: TObject); je identična. Zašto onda uplitati interface? Da me natjera da u kalsama TCar i TBicycle natjera da napišem function GetIsRecyclable : Boolean; i property isRecyclable : Boolean read GetIsRecyclable; ?

Primjer na stranici:
https://www.thoughtco.com/interfaces-in-delphi-programming-101-1058278

ima smisla zbog funkije if Supports(Screen.Forms[cnt], IConfigChanged, icc) then

To je jedino gdje vidim svrhu korištenja interface-a.

Malo sam čačkao po unitima Delphi-a i našao nešto što ne razumijem. Radi se o unitu: Vcl.Forms (Delphi XE 10.1)
Code:

 IDesignerHook = interface(IDesignerNotify)
 ...
 TCustomForm = class(TScrollingWinControl)
    ...
    FDesigner: IDesignerHook;
    ...
 end;

procedure TCustomForm.Notification(AComponent: TComponent;
   ...
     if FDesigner <> nil then
        FDesigner.Notification(AComponent, Operation);
  
....
   ...
end;


Od kuda sad to? Poziva se metoda interface-a?

Možda sugestija: otvoriti temu: "Interface i korištenje" poput one o kreiranju user kontrola. Netko od vas koji se dobro kužite u to, a pri tom ima vremena i volje...

Da nadopunim:
Shvatio sam da se može definirati:
Code:

iMojInt=interface
...
iMojaKlas=class(iMojInt)
...

pa kasinje u proceduri:

Code:

var mi: iMojInt;
begin
   mi := iMojaKlas.Create;
end;



Tada su u objektu mi vidljivi samo metode i property-i definirani u interface-u.
Još jedno zanimljivo svojstvo: kada se izađe iz procedure u kojoj se koristi objekt "mi", automatski se poziva destrukor klase od koje je kreiran, nije potrebno direktrno pozivati Free.

Evo što netko drugi misli o interface-u:
https://www.codeproject.com/Articles/1252175/Fixing-Delphis-Interface-Limitations

[Ovu poruku je menjao FranjoZG dana 30.01.2019. u 22:36 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje30.01.2019. u 23:08 - pre 62 meseci
> if FDesigner <> nil then
> FDesigner.Notification(AComponent, Operation);

> Od kuda sad to? Poziva se metoda interface-a?

Deluje mi sve normalno, designer je verovatno delphi IDE i salje mu se obavestenje o nekoj operaciji.

 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje31.01.2019. u 22:35 - pre 62 meseci
Počeo se igrati sa interface, zgodno...
Naišao na problem: dok klasu deklariram kao nasljednika TInterfacedObject sve je OK, ali ako ju deklariram kao nasljednika neke kontrole, javlja se problem.

Kako riješiti sljedeći kod, a da compiler ne javlja grešku?
Code:

  IMa=interface
    function get: integer;
  end;
  
  tMa=class(TList,  iMa)
    function get: integer;
  end;
  ...


 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje31.01.2019. u 22:45 - pre 62 meseci
U tom slucaju moras da sam implementiras implicitne funkcije koje svi interfejsi imaju (zapravo svi oni su naslednici IUnknown), AddRef, Release, Query. Pogledaj TInterfacedObject pa prepisi od tamo.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: interface i korištenje31.01.2019. u 23:31 - pre 62 meseci
Kada se govori o interfejsima, obično se posmatra iz ugla polimorfizma a vrlo retko iz ugla enkapsulacije.

Pored toga što upotreba interfejsa predstavlja najčistiji vid polimorfizma,
oni su takođe i jedan od najčistijih vidova enkapsulacije! ...

U tehničkom smislu - ukoliko nemaš potrebe da posmatraš različite klase na isti način a da se one
ponašaju različito (polimorfizam) - onda i ne možeš videti neku naročitu prednost upotrebe interfejsa.

Od kako su ljudi počeli da se bave programiranjem (npr. od pre 60-70 godina)
je bilo moguće raditi šta je ko hteo i kako je hteo, tako će biti i u budućnosti.
Međutim, ISKUSTVO iz prošlosti do današnjeg dana nas ne uči šta je moguće uraditi (sve je bilo moguće i pre 60 godina)
već nas uči KAKO NE TREBA RADITI!

Svaka nova paradigma u programiranju - proceduralno, OOP, funkcionalno, itd...
u suštini oduzima slobodu programeru da bi se na kraju dobilo kvalitetnije rešenje.

Tako i interfejsi - oduzimaju slobodu i dovode fokus na bitno - ako neku komponentu definišeš kao dobro osmišljen skup podataka i operacija (interface),
onda i consumeri te komponente NE MOGU da rade šta im je volja već sa onim što im je dato (interface + enkapsulacija)
što, generalno, na kraju dovodi do robustnijih, fleksibilnijih i jednostavnijih rešenja.

Što MANJE stvari neka komponenta može da radi TO BOLJE!
Što MANJE stvari zna neka komponenta TO BOLJE!

Citat:

Robert C. Martin: Clean Architecture

• Structured programming is discipline imposed upon direct transfer of control.

• Object-oriented programming is discipline imposed upon indirect transfer of control.

• Functional programming is discipline imposed upon variable assignment.

Each of these three paradigms has taken something away from us. Each restricts some aspect of the way we write code. None of them has added to our power or our capabilities.
What we have learned over the last half-century is what not to do.

With that realization, we have to face an unwelcome fact: Software is not a rapidly advancing technology.
The rules of software are the same today as they were in 1946, when Alan Turing wrote the very first code that would execute in an electronic computer.
The tools have changed, and the hardware has changed, but the essence of software remains the same.


[Ovu poruku je menjao dusans dana 01.02.2019. u 00:44 GMT+1]
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje02.02.2019. u 19:31 - pre 62 meseci
Hvala svima na pomoći. Radim novi projekt i radim ga s interface-ima.
Projekt je takav da imam dosta klasa u klasama, npr: objekt1.objetk2.property1
Najveća korist koju za sada vidim od interface-a je skrivanje property-a, procedure i funkcija koje se pokazujz nakon objekt. (iza točke). Nestala je šuma koja se pojavljivala dok sam koristio samo klase.
Vidjet ću kamo će me odvesti... u svakom slučaju: hvala na pomoći

Sad sam naletio na jedan problem:
ako interface koristim kao varijablu u TList<k> tada se ne izvrši destroy pri pražnjenju liste.

primjer:
Code:

  TRacun=class(TInterfacedObject, IPodaci) 
   fStavke: tList<Istavka>;
 ...
   procedure Clear;
 ...
 end;
...
  procedure TRacun.Clear
  begin
    fStavke.Clear;
  end;


Klasa tStavka za interface Istavka uredno ima napisan destrucor, ali se ne poziva, a ne dozvoli poziv: fstavke[Ind].free;

[Ovu poruku je menjao FranjoZG dana 02.02.2019. u 22:44 GMT+1]
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
31.223.145.*



+62 Profil

icon Re: interface i korištenje05.02.2019. u 15:04 - pre 62 meseci
Sad se setih detalja s interfejsima, koji si ti upravo dotakao/zaobisao sad preko liste.

U Delphi-ju standardni interfejs funkcionise preko brojaca referenci. Kad broj referenci postane 0 (nula), tad se poziva destruktor odgovarajuceg objekta (na kojem 'lezi' pomenuti interfejs). Kako mi da programski oslobodimo nasu referencu na interface, i tako eventualno unistimo objekat koji lezi ispod (ako RefCount postane 0)?
Prosto, postavis referencu na nil.
Znaci, ovako nesto:

Code:

  for i := 0 to fList.Count - 1 do
    fList[i] := nil;
  fList.Clear;


Ako i posle ovoga ne bude poziva destruktora, onda jos negde u programu postoje reference na interfejse iz liste, odnosno ove reference u listi nisu ZADNJE (nije RefCount = 1).

Pozz
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje05.02.2019. u 20:16 - pre 62 meseci
Naišao sam na još jedan problem. Ako nasljeđujem klasu, kako interface-u reči da ću koristiti njene property-e? Primer:
Code:

tMyBox=class(TScrollBox, IStrukturaPodaci)
... // neke procedure i parametri definirani i u IStrukturaPodaci
end;

...
var mb = IStrukturaPodaci;
begin
   mb := tMyBox.Create;
   mb.Top := 10; // ovo ne vidi.
end;


da li to znači da moram definirati i u svojoj klasi tMyBox property Top kao i funk. getTop i proc. setTop?
Ako ne radim sa Interface, tada uredno vidim property- nasljeđene klase. Kako to riješiti sa Interface?

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje05.02.2019. u 22:00 - pre 62 meseci
> Ako nasljeđujem klasu, kako interface-u reči da ću koristiti njene property-e? Primer:
> da li to znači da moram definirati i u svojoj klasi tMyBox property Top kao i funk. getTop i proc. setTop?
> Ako ne radim sa Interface, tada uredno vidim property- nasljeđene klase. Kako to riješiti sa Interface?

Ne mozes, interface ima tacno definisane metode i propertije, nista vise ni manje.
Ti od interfejsa mozes dobiti osnovni objekat pa njemu pristupati ali to onda znaci da nesto ne stima u toj logici, ko pristupa interfejsu
treba da zna i koristi samo ono sto interfejs nudi, ko taj interfejs implementira i kako njega ne zanima.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: interface i korištenje06.02.2019. u 05:14 - pre 62 meseci
To je komplikovano objasnjenje, uzimajuci u obzir da su vec data sva objasnjenja gore.
Preskocio bi licne konotacije, mada bi bas u ovoj temi moglo da se pise na licnimom nivou o tome sta je vec napisano a sta nije shvaceno od napisanog.
Zbog toga odgovor sa "ne moze" nije jasan odgovor na pitanje kako moze.

Recimo, pojednostavaljeno (lakse shvatljivo ;) objasnjenje bi bilo kako moze:

Moze tako sto ce objekat postati interfejs i onda kao interfejs moze da se koristi sa inerfejsima.
Kada objekat postane interfejs onda ce se videti njegove metode/propertyji.

Recimo bukvalno:


Code (delphi):

  TInterfacedList = class(TList, IInterface)
  private
  protected
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  public
    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
  end;

...
var
InterfacedList : TInterfacedList
...
InterfacedList.add(...
InterfacedList.Capacity
...
TInterfacedNN = class(TInterfacedList...
...
var
InterfacedNN : TInterfacedNN
...
InterfacedNN.add(...
InterfacedNN.Capacity

 

 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje23.03.2019. u 17:12 - pre 61 meseci
Imam mali problemčić...
Defirnirao sam klasu kao nasljednika TPanel.

TStavka

Dodao sam (prepisao iz TInterfacedObject:
objDestroyingFlag = Integer($80000000);
function GetRefCount: Integer; inline;
class procedure __MarkDestroying(const Obj); static; inline;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;

Kreirao sam interface za tu klasu.
IStavka

Varijabla koja mi je za objekt je Stavka: IStavka. Definirana je u public forme.

Obični button za kreiranje objekta i OnButtonClick:
Code:

  Stavka := TStavka.Create(Form1);


drugi (radi testa):
Code:

  Stavka := nil;


Morao sam kreirati destruktor da bih oslobodio kontrole koje su na TStavka (nekoliko tLabela i TEdita)

Sve radi OK, pozove se destruktor kada treba, nakon Stavka := nil kao i kad closam formu. Probem je kad se napravi Close programa, a forma na kojoj je Stavka je kreirana. Ako prije closanja programa napravim: Stavka := nil ili closam formu, sve je OK, ako ne, tada se dogodi sljedeće redosljedom:

1. pozove se destroy TStavke (nigdje ga direktno ne pozivam)
2. pozove se _Release, brojać je na 1 i on ponovno pozove destroy. Normalno, program javi Invalid... pokušava napraviti destroy objekata koji ne postoji.

Prvi put destroy nije pozvan iz funkcije _Release, drugi put je.

U čemu je problem? Gdje griješim?

Nadopuna, zaobišao sam problem, ali me svejedno zanima o čemu se radi.
- Objekt je na MDIChild formi
- u onclose MDIChild forme sam dodao: Stavka := nil;
- u onsClose Main forme sam dodao: formStavke.Free

Nakon toga mi radi ok. Ako izbacim jedno ili drugo, opet javlja grešku.


[Ovu poruku je menjao FranjoZG dana 23.03.2019. u 18:35 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: interface i korištenje23.03.2019. u 18:12 - pre 61 meseci
> 1. pozove se destroy TStavke (nigdje ga direktno ne pozivam)

Prilikom kreiranja si stavio da je owner forma tako da se prilikom oslobadjanja forme, oslobadja i panel.
Stavi da je owner nil i radice ti.


 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: interface i korištenje23.03.2019. u 20:18 - pre 61 meseci
e bedaka... hvala. Pa jasno...
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: interface i korištenje

[ Pregleda: 2607 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.