Jak usunąć obiekt?

Jak usunąć obiekt?
E1
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 4 lata
  • Postów:44
0

Tworzymy dynamicznie przycisk, nadajemy mu parametry i umieszczamy na oknie.

Kopiuj
            Button btn1 = new Button();
            btn1.Width = 60;
            btn1.Height = 20;
            btn1.Content = "przycisk1";
            grid1.Children.Add(btn1);

Jak teraz możemy usunąć w ten sposób utworzony przycisk?

DA
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 3 lata
  • Postów:25
0

Nie wiem, czy dobrze zrozumiałem ale, żeby usunąć z formatki przycisk spróbuj mniej więcej czegoś takiego:

Kopiuj
this.Controls.Remove(this.btn1)
E1
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 4 lata
  • Postów:44
0

W wpf kontrolki nie mają takiej metody.

edytowany 1x, ostatnio: Erwin14
AG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:77
1

grid1.Children.Remove(sender as Button);

E1
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 4 lata
  • Postów:44
0

A czy jest możliwość usunięcia obiektu który nie jest kontrolką tylko instancją własnej klasy?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Co próbujesz zrobić?


E1
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 4 lata
  • Postów:44
0

@Patryk27: W uproszczeniu robię małą gre w której mamy czołgi, będącą instancjami klasy Tank. Klasa ta m.in dynamicznie tworzy obraz czołgu oraz wątek odpowiadający za jego ruch. Jeżeli dany czołg zostanie zniszczony to chciałbym żeby był usuwany cały obiekt. Obecnie jest usuwany tylko Image czołgu sposobem Andrzeja Guźca napisanym 3 posty wcześniej oraz Abort()uje wcześniej wspomniany wątek.
Chodzi o te że działa strzelające w czołgi działają na zasadzie że wykrywają najbliższy czołg i w niego strzelają. Teraz jak czołg zostanie zniszczony i nawet jego obraz został usunięty to i tak jako obiekt istnieje i działa wciąż w niego strzelają.

EDIT: Udało mi się przestawić wskaźnik na dany czołg na null w momencie zniszczenia więc problem jest rozwiązany. Niemniej jeśli istnieje sposób na wymuszenie usunięcia obiektu to chętnie go poznam.

edytowany 4x, ostatnio: Erwin14
N0
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Kraków
  • Postów:767
0

zawsze dodatkowo możesz ręcznie wywołać GC, bo referencje usunąłeś ale czy on od razu zostanie usunięty z pamięci to raczej nie.


Pomogłem? To dobrze :)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Nie powinieneś bawić się w ręczne zarządzanie pamięcią - jeśli tak musisz robić, masz błąd projektowy.

W Twoim przypadku wydaje mi się, że masz niewłaściwie przemyślany sam mechanizm działania czołgów - dlaczego bawisz się w wielowątkowość, zamiast napisać zwyczajny game loop?


edytowany 1x, ostatnio: Patryk27
N0
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Kraków
  • Postów:767
0
Patryk27 napisał(a):

Nie powinieneś bawić się w ręczne zarządzanie pamięcią - jeśli tak musisz robić, masz błąd projektowy.

Dlaczego jest to błąd projektowy?


Pomogłem? To dobrze :)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
2

Ponieważ wykorzystywanie GC dodatkowo jako kontenera zawierającego spis encji gry zmienia jego sens istnienia [a] oraz utrudnia czytanie [b] (jak i również sensowne debugowanie [c]) kodu.

a) GC istnieje po to, aby zarządzać czasem istnienia obiektów w sensie czy należy go już usunąć, bo jest potrzebna wolna pamięć, a nie czy należy ten obiekt usunąć, ponieważ gracz umarł.

b, c) imho znacznie czytelniejsze będzie rozwiązanie wykorzystujące wprost spis obiektów w połączeniu z normalnym game loop zamiast tej całej wielowątkowości - dzięki temu w dowolnym momencie gry lista aktywnych statków/whatever będzie w stu procentach deterministyczna, a nie polegająca na implementacji GC/częstotliwości ręcznego jego wywoływania.


edytowany 2x, ostatnio: Patryk27
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:Wrocław
1

Jeśli dana jednostka/potwór/pojazd ma "zginąć" w grze, to po prostu należy go usunąć z kolekcji wszystkich obiektów gry. Nie trzeba żadnego ręcznego zarządzania pamięcią, zerowania ani nawet przypisywania null.
Oddzielny wątek dla każdej jednostki brzmi jak jakieś programistyczne piekło.

@Erwin14 - naucz się najpierw podstaw programowania w konsoli, potem bierz się za gry.

E1
Ale o jaką kolekcję chodzi? Obecnie mam tablicę obiektów. Jeżeli obiekt[i]==null to znaczy że jednostka zginęła lub jeszcze się nie pojawiła.
Patryk27
@Erwin14: ale że ktoś Ci broni po ludzku usunąć element z kolekcji czy co?
somekind
Nie tablicę tylko raczej listę (List<T>), bo jest wygodniejsza do dodawania i usuwania elementów. Reprezentowanie dwóch różnych stanów jedną wartością jest nierozsądne.
AG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:77
0

Ja mam takie pytanie, czy aby nie masz nieskończonej pętli w nowych wątkach? W takim razie wywołanie abort niewiele daje, z tego co pamiętam.

E1
W jednych mam, w innych nie. Nie zauważyłem problemów z działaniem Abort.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.