[ buha18 @ 07.11.2009. 19:52 ] @
ovako...
2 klase

Code:

TNadredeni = class()
 procedure jedi();
end;


Code:

TPodredeni = class()
 procedure pij();
end;


pitanje je sljedece. da li mogu deklarirat globalnu varijablu, ali tijekom izvodjenja programa mijenjat njezin tip?
konkretno ne mijenjat tip, nego odredit tip u nekom trenutku kada mi je poznato kojeg tipa je varijabla?

npr prvo mi je var a:TNadredeni;

pokusao sam destroy-at a, i napravit a:=TPodredeni.Create; sto prolazi, ali ne mogu koristit funkciju a.pij(); nigdje u pisanju koda.
[ xenox @ 07.11.2009. 23:39 ] @
pa deklarisi tu globalnu kao pointer, pa je rokaj kako god hoces...
[ buha18 @ 07.11.2009. 23:42 ] @
moze primjer?
[ franjo_tahi @ 09.11.2009. 07:50 ] @
može i variant...
Code:

procedure TForm1.Button1Click(Sender: TObject);
var a: Variant;
    b: string;
    c: Integer;
begin
   b := '123';
   a := b;
   c := a;
   ShowMessage(IntToStr(c));
end;


samo treba paziti, asko se pretvara iz jednog tipa u drugi, da je to moguće, jer ako umjesto '123' naipšeš 'abc', compiler neće javiti grešku, ali će se javiti greška kod izvršavanja programa.
[ stankons @ 09.11.2009. 08:16 ] @
Evo još jedan predlog:

Code:

  TAbstract = class
     procedure jedi();  virtual; abstract;
     procedure pij();  virtual; abstract;
  end;

  TNadredeni = class(TAbstract)
     procedure jedi(); override;
  end;

  TPodredeni = class(TAbstract)
     procedure pij();  override;
  end;
[ buha18 @ 09.11.2009. 08:37 ] @
zahvaljujem svima.

Code:
 variant
ne prolazi
Code:
[Error] Unit1.pas(257): Incompatible types: 'Variant' and 'Sustav'


najvjerojatnije cu napravit kao sto stankons rece.
[ tkaranovic @ 11.11.2009. 06:12 ] @
Citat:
buha18: ovako...
2 klase

Code:

TNadredeni = class()
 procedure jedi();
end;


Code:

TPodredeni = class()
 procedure pij();
end;


pitanje je sljedece. da li mogu deklarirat globalnu varijablu, ali tijekom izvodjenja programa mijenjat njezin tip?
konkretno ne mijenjat tip, nego odredit tip u nekom trenutku kada mi je poznato kojeg tipa je varijabla?



Mogu da se pozovu samo ovako:

Code:

 TNadredeni(nil).jedi;
 TPodredeni(nil).pij;


Uz napomenu da ovakav poziv kao primer nema u helpu, knjigama, Internetu (nisam video) a u Delphi help(ovima)u ima ovaj primer:

Code:

type
  TFigure = class
    procedure Draw;
  end;
  TRectangle = class(TFigure)
    procedure Draw;
  end;
...
var
  Figure: TFigure;
begin
  Figure := TFigure.Create;
  Figure.Draw;  // calls TFigure.Draw
  Figure.Destroy;
  Figure := TRectangle.Create;
  Figure.Draw;  // calls TFigure.Draw
  TRectangle(Figure).Draw;  // calls TRectangle.Draw
  Figure.Destroy;
...


U pretposlednjem redu citata (TRectangle(Figure).Draw;) poziva se metoda klase TRectangle a koristi se za taj poziv objekat klase TFigure. Objekat Figure je instanca klase TFigure a ta klasa nema metodu klase TRectangle koja se poziva. Kreirani objekat Figure nema metodu koja se poziva na ovaj način. To onda znači da se taj poziv odvija u okviru klase TRectangle i ako nije kreiran objekat te klase. Što znači da je preko metaobjekta klase TRectangle pozvan metod. Pošto se može pozvati ovako metoda klase (TRectangle) čiji objekat nije kreiran onda se može pozvati i bez bilo kakvog objekta (nil), jer metaobjektu klase TRectangle nije potrebna instanca klase TFigure.
[ Rapaic Rajko @ 16.11.2009. 12:35 ] @
Code:

 TNadredeni(nil).jedi;
 TPodredeni(nil).pij;


Ovo moze da radi SAMO AKO u metodama jedi() i pij() nema poziva self; inace, karambol (EAccessViolation). Za detaljnije objasnjenje, pogledati u help-u TMethod (doduse, izgleda da ovoga nema u novijim Delphi-jima, posle 7-ice).

Onaj primer sa TFigure ce raditi sasvim drugacije ako se iskoriste virtual i override sluzbene reci. Ali to ovde nije tema...


Rajko
[ tkaranovic @ 16.11.2009. 15:59 ] @
Citat:
Rapaic Rajko:

Ovo moze da radi SAMO AKO u metodama jedi() i pij() nema poziva self; inace, karambol (EAccessViolation). Za detaljnije objasnjenje, pogledati u help-u TMethod (doduse, izgleda da ovoga nema u novijim Delphi-jima, posle 7-ice).

Onaj primer sa TFigure ce raditi sasvim drugacije ako se iskoriste virtual i override sluzbene reci. Ali to ovde nije tema...


Jeste sve to tema u smisu da se mora voditi računa o svemu što je vezano za metodu a može da radi samo kada je kreiran objekat, kome pripada metoda koja se poziva.

Evo primera u kojem se koristi TMethod:

Code:

var  
     JedIiliPijP: procedure() of object;
begin
  TMethod(JedIiliPijP).Code := addr(TNadredeni.jedi);
  //if assigned(JedIiliPijP) then
    JedIiliPijP();
  TMethod(JedIiliPijP).Code := addr(TPodredeni.pij);
  //if assigned(JedIiliPijP) then
    JedIiliPijP();