Buttony i labele z form w zdarzeniu Main()

0

Witam

Mam mega podstawowe pytanie ale niestety muszę je zadać bo nie potrafię dojść do takiej dość podstawowej sprawy. Aż się boję tego pytania bo zaraz spotka mnie lincz słowny dlaczego zabieram się za programowanie jak mam taki podstawowy problem :)
Mam w C# aplikację podzieloną na różne klasy które dodatkowo mam podzielona na różne pliki .cs
Aplikacja formularzy - z pomocą Visual Studio układam sobie elementy w stylu label, button itd.
I tu pojawia się mój problem - wszystkie te elementy definiuję jako "public" a nie mogę się do nich odwołać w zdarzeniu Main() znajdującym się domyślnie w Program.cs. Przez to wszystkie działania wrzucam np do zdarzenia otwarcia Form1 zamiast do Main().

Ktoś pomoże w tej podstawowej kwestii??
Bardzo Was proszę o wyrozumiałość i darowanie mi linczu słownego :) :) :)

0

Wklej kawałek kodu o którym rozmawiamy i błąd jaki się wywala, inaczej nic nie wymyślimy...

0

Main() nie jest zdarzeniem tylko funkcją, a poza tym po co ci w tym miejscu dostęp do kontrolek?

1

Już mniej więcej wyobrażam sobie, co się święci ;)
Widząc Twój drugi temat, w którym kombinujesz z połączeniem do bazy danych, mogę dać Ci tylko jedną radę. Wróć do totalnych podstaw programowania obiektowego; przerób jakiś tutorial, prostą konsolową aplikację; potem dopiero przejdź dalej. Nie traktuj tego jako lincz, raczej jako życzliwą radę ;)

0
Hrypa napisał(a):

przerób jakiś tutorial, prostą konsolową aplikację

Dzięki za życzliwą radę :)
Non stop przerabiam tutoriale (na ich podstawach się uczę), konsolowe aplikacje na zasadzie "Hello World" itp już też przerabiałem :)
Nie jestem jakimś totalnym laikiem który nie wie co to komputer ;) Po prostu lubię uczyć się tego co jest mi potrzebne w życiu codziennym (np ciągle pracuję z bazami danych i nie bój się, nic nie zepsuję, znam dość dobrze SQL :) ). Fakt - programowania się uczę praktycznie od podstaw - na studiach pisałem trochę w C++ i w prologu ale to było 12 lat temu i od tego czasu nie programowałem więc traktuję siebie teraz jako newbie mimo że coś z C++ gdzieś mi tam świta :)

Azarien napisał(a):

Main() nie jest zdarzeniem tylko funkcją, a poza tym po co ci w tym miejscu dostęp do kontrolek?

Przepraszam, mój błąd - z "pośpiechu" funkcje nazwałem zdarzeniem.
Chcę mieć dostęp gdyż w zależności od parametrów programu ustawiam różne opisy labell i to głównie o dostęp do nich mi chodzi. W tej chwili wykonuję to podczas otwierania Form1 ale chciałbym to robić w Main(). Czy popełniam w ten sposób błąd?? Pozostawić ustawienia labeli w zdarzeniu otwarcia Form1??

Zellus napisał(a):

Wklej kawałek kodu o którym rozmawiamy i błąd jaki się wywala

Nie wywala błędu - chodzi o brak dostępu do tych kontrolek czyli program ich "nie widzi" mimo ustawienia ich jako public.
Co do kodu to jest to temat prosty gdyż jest to standardowy kod generowany automatycznie przy tworzeniu nowej aplikacji formularzy w VS

Program.cs

 static class Program
    {
        /// <summary>
        /// Główny punkt wejścia dla aplikacji.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new AxisForm1());
        }
    }

Form1.cs (fragment)

 
 public System.Windows.Forms.Label l_adresIP;
        public System.Windows.Forms.Label l_nrPortu;
        public System.Windows.Forms.Label l_ustawienia;
        public System.Windows.Forms.Label l_Autostart;
        public System.Windows.Forms.Label l_nrWagi;

Nie mogę wywołać np l_adresIP w Main()

0

Chcę mieć dostęp gdyż w zależności od parametrów programu ustawiam różne opisy labell i to głównie o dostęp do nich mi chodzi. W tej chwili wykonuję to podczas otwierania Form1 ale chciałbym to robić w Main().

Robisz to w złą stronę. Przekaż parametry do formy, np. jako parametry konstruktora, i w konstruktorze formy się tym zajmij.

0
Azarien napisał(a):

Przekaż parametry do formy, np. jako parametry konstruktora, i w konstruktorze formy się tym zajmij.

Parametry mam a pliku settings - nazwa źródła danych odbc, nr terminala wagowego i czy autostart. Przekazuję je do konstruktora (zdefiniowanego w klasie odpowiedzialnej za komunikację z terminalem wagowym) i na ich podstawie są pobierane dane z bazy (IP, nr portu, nr wagi) na podstawie których jest nawiązywane połączenie tcp i komunikacja z terminalem wagowym. Labell chcę ustawić przy starcie programu i mają one np wyświetlić jak są ustawione parametry w settings, podać datę i czas uruchomienia aplikacji.
Czy zostawić ich ustawianie przy otwarciu Form1?
Gdzie popełniam błąd że labeli i innych kontrolek nie mogę "wykorzystać" w innych plikach/klasach?

0
Hrypa napisał(a):

przerób jakiś tutorial

BTW, możesz polecić "początkującemu koledze" jakieś fajne źródło "pomocy naukowych" ?? :)

0

Czy zostawić ich ustawianie przy otwarciu Form1?
Chyba tak.

Gdzie popełniam błąd że labeli i innych kontrolek nie mogę "wykorzystać" w innych plikach/klasach?
Nie podałeś ani błędu, ani (istotnego) kodu.

Bo co to znaczy "nie widzi"? Pokaż błąd kompilacji, i kod który się nie kompiluje.

0
Azarien napisał(a):

Pokaż błąd kompilacji, i kod który się nie kompiluje.

Nigdzie nie napisałem że program się nie kompiluje. Nie widzi to tak jak pisałem nie mogę ich użyć.
C# IntelliSense "nie podpowiada" mi tych kontrolek poza daną klasą - to oznacza "nie widzi".
Nie wiem jak inaczej to opisać/nazwać.

Nie ma żadnego problemu kompilacji - po prostu tych kontrolek nie mogę wykorzystać poza Form1.

0

Próbujesz zrobić coś takiego:

Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Form1 myForm = new Form1();

            Application.Run(myForm);

            myForm.button1.Text = "test";
        }
    }
}

Taki kod mimo, że skompiluje się poprawnie*, nie zmieni właściwości Text dla button1.
Powinieneś podejść do tego trochę inaczej, tak jak doradzał Ci Azarien.

* przy ustawionym modyfikatorze dostępu innym niż private lub protected

Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(/* dane */));
        }
    }
}

Form1.cs

using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1(/* dane jako parametry */)
        {
            InitializeComponent();

            // gdzieś tutaj zmieniasz co chcesz na podstawie
            // przekazanych danych do konstruktora formy
        }
    }
}

Jeśli przekazujesz te dane jako argumenty wiersza poleceń, to zmieniasz:

Main() na Main(string[] args)
new Form1() na new Form1(args)
Form1() na Form1(string[] args)

i w args masz wszystko, czego potrzebujesz.

PS Szkoda, że formatowanie kodu (C#) nie działa czasami jak tekst o stałych odstępach TT).

0

Nigdzie nie napisałem że program się nie kompiluje. Nie widzi to tak jak pisałem nie mogę ich użyć.
C# IntelliSense "nie podpowiada" mi tych kontrolek poza daną klasą - to oznacza "nie widzi".

Nikogo nie interesuje czego ci IntelliSense nie podpowiada, bo nie widać jaki kod próbujesz napisać.

Tak więc:

  1. napisz kod, taki jaki chcesz, nie zwracając uwagi na IntelliSense.
  2. skompiluj
  3. podaj kod i treść błędu.

a szklana kula podpowiada mi, że próbujesz użyć typu formy zamiast zmiennej, albo traktujesz pola klasy jakby były zmiennymi globalnymi.

0
Azarien napisał(a):

Nikogo nie interesuje czego ci IntelliSense nie podpowiada, bo nie widać jaki kod próbujesz napisać.

Tak więc:

  1. napisz kod, taki jaki chcesz, nie zwracając uwagi na IntelliSense.
  2. skompiluj
  3. podaj kod i treść błędu.

Sorry, nie chciałem pisać "bzdur" w postaci błędnego kod dlatego opisałem problem w najprostszy sposób. Na przyszłość będę podawał kod z błędami - faktycznie wtedy jest szansa na szybszą pomoc bo można zauważyć błędy i je usunąć a tak błędu nie ma :)
Temat zamknięty - zostałem przy ustawianiu labeli podczas ładowania Form1.
Jako początkującemu wydawało mi się że główny kod programu "niezależny" od formularzy itp powinien znaleźć się z Program.cs gdzie mamy Main() ale skoro w Main() mam wywołanie Form1 a później cała reszta odbywa się w obrębie tego właśnie formularza to kod może być wykonywany po otwarciu formularza. Mam nadzieję że nie jestem w błędzie.

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