Obiekt ktorego nie ma

0

Czy istnieje jakas mozliwosc sprawdzenia czy obiekt do ktorego metody sie chce odwolac istnieje czy nie?
Nastepnie w zaleznosci od wyniku tego sprawdzenia podjac odpowiednie dzialanie?

najchetniej widzialbym to w taki sposob:

TMojLog = class(TListbox)
  ...
  class procedure komunikat(napis: string); static;
end;

class TMojLog.komunikat(napis: string)
var plik: textfile;
begin
  if assigned(self) then  // teoretycznie w metodach statycznych nie ma dostepu do SELF
    items.add(napis)
  else begin
    assignfile(plik,'log.txt');
    append(plik);
    writeln(plik,napis);
    closefile(plik);
  end;
end;

var Log: TMojLog;
begin
  Log.komunikat('jakis komunikat');  //tu wywoluje metode niezainicjowanego obiektu
end;

W programie w wielu miejscach wykonuje metode Log.komunikat(); i chcialbym zeby program dzialal rownie skutecznie z utworzonym obiektem klasy TMojLog jak i bez niego.

//dopisane
Zapomnialem dodac, ze chce uniknac tego sprawdzania przed kazdym wywolaniem funkcji (unikniecie tego sprawdzania jest istota problemu:D )

  if Log <> NIL then 
    Log.komunikat();

przed kazdym wywolaniem metody Log.komunikat().

Czy (a jesli tak to jak??) da sie cos takiego zrobic??

0

Sprawdzic czy nie jest przypadkiem = nil, ewentualnie po tym sprawdzic jakiej jest klasy (operatos is).

0

zapomnialem dopisac ze chodzi mi o unikniecie tego sprawdzania przed kazdym wywolaniem metody Log.komunikat(); -poprawilem juz

0

Tak to chyba tylko w Erze...

0

Możesz dać:

try
items.add
except
tutaj piszesz do pliku
end;

ale to będzie bardzo brzydko : )

Poza tym nie pamiętam dokładnie, ale chyba procedury/funkcje klasowe nie będą się odnosiły do każdego utworzonego obiektu - one są wywoływane na rzecz klasy (składniowo działa też wywołanie na rzecz obiektu). Zresztą w tychże nie można się chyba odwoływać do pól obiektu - nie dam głowy dawno tego nie stosowałem.

0
b0bik napisał(a)

Możesz dać:
try
items.add
except
tutaj piszesz do pliku
end;

Ale o so chodzi? Wywolanie metody dla nieistniejacego (nil) obiektu i tak wygeneruje AV...

0

@spc:
zwroc uwage ze mowimy o metodach STATYCZNYCH (static), mozna je wywolywac dla niezainicjowanych obiektow, lub nawet samych klas.

@b0bik:
no wlasnie na tym polega caly problem...
w metodach klasowych (ktorych podkategoria sa metody statyczne) nie ma dostepu do pol obiektow (ogolnie do obiektu self - ale to juz napisalem;)

zastanawiam sie czy istnieje jakis pokretny sposob sprawdzenia czy wskaznik spod ktorego wywolalem w kodzie ta metode wskazuje na obiekt czy tez ma wartosc NIL.

0

class procedure komunikat(napis: string); static;
Jeżeli chodzi o powyższą metodę to przyjmuje ona tylko jeden parametr mianowicie napis, do niej nie są przekazywane żadne dodatkowe parametry w stylu instancja czy klasa niezależnie od kontekstu w jakim się to wywołuje.

class procedure komunikat(napis: string);
natomiast do tej metody przekazywane są defakto dwa parametry pierwszy typu TClass (niezależnie od kontektu wywołania) oraz drugi jawnie napis.

Tak więc w obu przypadkach nie możesz <ort>skożystać </ort>z self do rozwiązania swojego problemu.

procedure komunikat(napis: string);
Kozystając z takiej funkcji możliwe jest otrzymanie nieprawidłowej instancji lub nil'a ale niestety nie można tego wywołać TClassName.komunikat('dfsdfs');

1 użytkowników online, w tym zalogowanych: 0, gości: 1