Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Deadeye

c# - dostep do klasy okna z drugiego okna

Rekomendowane odpowiedzi

zaczalem pisac w c# i mam banalny problem, ale jak sie nie czyta jakichs tutoriali od poczatku jak to dziala, to ciezko odnalezc odpowiedz. pisze w windows forms i mam klase mojego glownego okna:

 

public partial class logowanie : Form

{

public cSystem system;

....

cSystem to moja klasa ktora jest mi potrzebna, przechowuje w niej wszystkie dane. i tu pierwsze pytanie - jaki model object flow przyjmuje c#? nie mozna deklarowac zmiennych globalnych, wiec chcac miec klase przechowujaca ogolne dane aplikacji musze ja podpiac do klasy jakiegos okna? poki co nie znalazlem lepszego sposobu, wiec tak zrobilem.

teraz mam drugie okno, ktore wywoluje z metody pierwszego

okno2 a = new okno2();

a.show();

 

 

i wszystko fajnie, tylko teraz gdziekolwiek w kodzie obslugi zdarzen drugiego okna (ktore sa w osobnym pliku) nie moge sie odwolac do klasy system (moge stworzyc nowa klase tego typu, ale nie moge uzyc tej instancji nalezacej do logowanie). oczywiscie obie klasy okienek sa w tym samym namespace.

probowalem zrobic cos takiego

 

public partial class okno2: Form

{

public dodaj()

{

InitializeComponent();

}

 

private void button1_Click(object sender, EventArgs e)

{

logowanie.system.costam()

}

 

ale nie dziala (logowanie to klasa pierwszego okna). wiec jak to mozna zrobic? :> bo logowanie to nazwa typu klasy, z ktorej tworzone jest glowne okno. a jak dorwac sie do instancji tej klasy, ktora jest tworzona automatycznie przy uruchomieniu programu?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Napisz jeszcze raz o co ci chodzi. Masz jakas swoja klase i metody i co chcesz z tym zrobic? Chcesz miec glowne okno aplikacji i oprocz tego okienko male logowania, tak? Klikasz gdzies zaloguj i jak jest login i haslo ok to wtedy sie wlacza jakas tam inna czesc programu? Slyszales moze o czyms takim jak modal i modless window?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
a jak dorwac sie do instancji tej klasy, ktora jest tworzona automatycznie przy uruchomieniu programu?

Przekaz ta instancje jako parametr w konstruktorze okno2.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisz jeszcze raz o co ci chodzi. Masz jakas swoja klase i metody i co chcesz z tym zrobic? Chcesz miec glowne okno aplikacji i oprocz tego okienko male logowania, tak? Klikasz gdzies zaloguj i jak jest login i haslo ok to wtedy sie wlacza jakas tam inna czesc programu? Slyszales moze o czyms takim jak modal i modless window?

modeless jak juz cos :P wiem co to jest, ale zupelnie nie o to mi chodzi. nie chodzi mi o wywolanie okna, tylko o metode dostania sie do instancji klasy glownego okna. po prostu mam jakas dana jako pole klasy glownego okna, i pytanie - jak do niej dojsc z poziomu kodu innego okna (innej klasy).

 

Przekaz ta instancje jako parametr w konstruktorze okno2.

no wlasnie pytam, jak ta instancja sie nazywa? przeciez sam jej nie tworze, wiec nie mam jej nazwy, tworzy ja windows forms przy uruchomieniu programu. gdybym wiedzial jak sie do niej dobrac, juz dawno bym to zrobil. zreszta wtedy nie trzeba byloby, bo ta instancja pewnie jest globalna, wiec wystarczyloby jej uzyc.

 

//edit: uzyskalem ta instancje przez cos takiego

 

logowanie b = (logowanie) logowanie.ActiveForm;

 

ale to pozyskuje zawsze instancje aktywnej formy (nawet jesli nie jest klasy logowanie), wiec nie jest zbyt wygodne. jestem pewny ze jest lepszy sposob zeby to zrobic?

 

//edit2: w c# tez jest this ;] co rozwiazalo sprawe, bo wystarczylo

okno2.Show(this);

i pozniej w klasie okno2 odwolywac sie do glownego okna jako owner (mozna bylo tez tak jak Zahariash proponowal, ale tak jest prosciej). ale dalej nie rozwiazalo to moich watpliwosci - nie ma jakiejs ogolnej nazwy na glowne okno windows forms? zeby sie do niego odwolac nie majac zadnej referencji na niego?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
jestem pewny ze jest lepszy sposob zeby to zrobic?

Skoro tworzysz okno2 w metodzie klasy logowanie to szukanym przez ciebie uchwytem jest this.

 

//edit2: w c# tez jest this ;] co rozwiazalo sprawe, bo wystarczylo

okno2.Show(this);

i pozniej w klasie okno2 odwolywac sie do glownego okna jako owner (mozna bylo tez tak jak Zahariash proponowal, ale tak jest prosciej).

Przeciez ja wlasnie to proponowalem.

 

Glowna forma nie jest zmienna globalna. Zajrzyj do glownego pliku programu (chyba Program.cs).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Skoro tworzysz okno2 w metodzie klasy logowanie to szukanym przez ciebie uchwytem jest this.

do tego juz doszlem :)

 

 

Przeciez ja wlasnie to proponowalem.

nie, show() nie jest przeciez konstruktorem. show przyjmuje w parametrze dowolny obiekt, i ustawia go jako owner pokazywanej formy. gdybym chcial to zrobic konstruktorem, to musialbym zrobic dokladnie to samo, ale sam (czyli dodac nowe pole na klase i w konstruktorze przepisywac do niej podany parametr) - czyli wyszloby na to samo, ale byloby mniej przejrzyste. tak czy siak dzieki, naprowadziles mnie na rozwiazanie :)

Glowna forma nie jest zmienna globalna. Zajrzyj do glownego pliku programu (chyba Program.cs).

tak myslalem, ale wydawalo mi sie ze jest cos w stylu

Application.GetMainWindow()

czy cos ;) ale chyba nie ma. niemniej juz sobie poradze, dzieki :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
nie, show() nie jest przeciez konstruktorem. show przyjmuje w parametrze dowolny obiekt, i ustawia go jako owner pokazywanej formy. gdybym chcial to zrobic konstruktorem, to musialbym zrobic dokladnie to samo, ale sam (czyli dodac nowe pole na klase i w konstruktorze przepisywac do niej podany parametr) - czyli wyszloby na to samo, ale byloby mniej przejrzyste. tak czy siak dzieki, naprowadziles mnie na rozwiazanie :)

Pisząc "to" miałem na myśli this ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Pisząc "to" miałem na myśli this ;)

 

widze ze przydalyby sie wam wzorce projektowe, na poczatek singleton bo wlasnie tego potrzebujesz. w tym wzorcu zostal podjety problem stworzenia obiektow do ktorych dostep bylby mozliwy bez potrzeby inicjalizacji i umozliwiajacy dostep z dowolnego miejsca (w wiekszosci dla ograniczenia ilosci polaczen z baza danych). polega na zadeklarowaniu wewnetrznej prywatnej zmiennej o typie odpowiadajacym typowi klasy ktora chcesz przerobic na singleton - ta zmienna bedzie przechowywala instancje (ma byc static), do odwolywania sie do tyej instancji wykorzystuje sie metode ktora automatycznie sprawdza czy jest zainicjowana, jezeli nie to tworzy taka instancje. w ten sposob mozna wykorzystywac jedna instancje i obslugiwac ja jak zmienna globalna (w ponizszym przykladzie jest konstruktor publiczny ktory pozwala na stworzenie poza klasa instancji tej klasy, w przypadku private - tak powinno byc - odwolywanie do obiektu mozliwe byloby tylko z poziomu metody wyciagajacej "instance"). w ponizszej klasie zastosowano rowniez blokowanie zmian jezeli ten obiekt mialby byc wykorzystywany w aplikacji wielowatkowej.

 

using System;
using System.Collections.Generic;
using System.Text;

namespace singleton
{
class Program
{
	static void Main(string[] args)
	{
		Console.Clear();
		Console.WriteLine("-----test wzorca singleton-----\ninicjalizacja dwoch zmiennych i przypisanie im obiektu implementujacego wzorzec singleton");
		singleton ob1 = singleton.Instance;
		singleton ob2 = singleton.Instance;
		Console.WriteLine("ob1: " + ob1.ct + "\nob2: " + ob2.ct);
		Console.WriteLine("zamiana wartosci ct obiektu ob1 bedzie odwzorowana na obiekcie ob2");
		ob1.ct="singleton";
		Console.WriteLine("ob1.ct=\"singleton\"");
		Console.WriteLine("ob2.ct: "+ob2.ct);
		Console.WriteLine("-----koniec testu singleton-----");
	}
}
public sealed class singleton
{
	public string ct="glupota";
	static singleton instance = null;
	static readonly object padlock = new object();
	public singleton()
	{ 
	}
	public static singleton Instance
	{
		get
		{
			lock (padlock)
			{
				if (instance == null)
				{
					instance = new singleton();
				}
				return instance;
			}
		}
	}
}
}

 

mysle ze to ci pomoze, przerob w ten sposob swoja klase cSystem i po sprawie. poszukaj w google "Design pattern" dla C# a zobaczysz dopiero jak sie programuje profesjonalnie (i do tego kur...sko szybko)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...