Dojście do metod i elementów formularza w C#

0

Używam Microsoft Visual Studio 2005.

Formularz definiuje następująca klasa, na przykład:

public partial class Form1 : Form
{
    List<Oprawa> Oprawy = new List<Oprawa>();
    List<Lampa> Lampy = new List<Lampa>();
    List<double> Wspolczyn = new List<double>();
    int NowaLampaInd;
    int Wybor;

    public int TestInt(string x)
    {
        int y, res;
        try
        {
            y = int.Parse(x);
            res = 1;
        }
        catch
        {
            res = 0;
        }
        return res;
    }

    public void Info(string Msg)
    {
        MessageBox.Show(Msg, "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    public Form1()
    {
        InitializeComponent();
    }
}

W tej klasie umieszcza sie metody wykonywane przy akcjach takich, jak klikanie przycisków. Można także umieścić dowolne dodatkowe definicje zmiennych i metody.

Program działa na obiektach między innymi klasy Oprawa:

public class Oprawa
{
    public bool Zmieniono;
    public string Nazwa;
    public int Sprawnosc;
    private Bitmap Rozsyl;
    public Bitmap Plan;
    public int IloscLamp;

    public Oprawa(string Nazw,string RozsylBmp)
    {
        IloscLamp = 0;
        Nazwa = Nazw;
        Sprawnosc = 100;
        Rozsyl = new Bitmap(RozsylBmp);
        BmpNazwa = RozsylBmp;
    }
}

Załóżmy, że w klasie Oprawa chcę dopisać metodę PokazInfo(), której efektem jest wywołanie metody Info z parametrem "To jest oprawa!".

Zrobiłbym tak:

public PokazInfo()
{
Form1.Info("To jest oprawa!");
}

W ten sposób to nie chce działać. W jaki sposób mam napisać metodę PokazInfo()? W analogiczny sposób chciałbym się dostać do elementów położonych na formularzu, np. w celu wykorzystania paska postępu w przypadku wykonywania pętli typu "for".

0

Zajrzyj do pliku program.cs - tam masz wszystkie referencje - można sobie przypisać.

0

Plik Program.cs u mine w całości wyglada następująco:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Oswietlenie
{
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());
}
}
}

Co tu właściwie można skopiować? Próbowałem przez Application, ale też coś nie wychodzi.

0

nie opisałeś dokładnie co rozumiesz przez stwierdzenie 'nie chce działać', ale cos mi sie rzucilo w oczy, a mianowicie błędne użycie metody PokażInfo. Metoda ta nie jest statyczna, więc musi sie wykonywac z jakiejś instancji obiektu, tzn:

public PokazInfo()
{
     Form1.Info("To jest oprawa!");
}

nie będzie działać, ponieważ program nie wie, ktorego okienka Info ma ustawić na "To jest oprawa". Powinno natomiast działać coś takiego:

public PokazInfo()
{
     this.Info("To jest oprawa!");
}

jakoże metodę PokazInfo wywołujesz wewnątrz którejś z metod klasy Form1, to wystarczy wywołanie
PokazInfo();
tak naprawdę wykonuje się instrukcja
this.PokazInfo();
ktora informuje program, ze metoda PokazInfo jest metodą składową klasy Form1.

</quote>
0
poorchava napisał(a)

nie opisałeś dokładnie co rozumiesz przez stwierdzenie 'nie chce działać', ale cos mi sie rzucilo w oczy, a mianowicie błędne użycie metody PokażInfo. Metoda ta nie jest statyczna, więc musi sie wykonywac z jakiejś instancji obiektu, tzn:

public PokazInfo()
{
     Form1.Info("To jest oprawa!");
}

nie będzie działać, ponieważ program nie wie, ktorego okienka Info ma ustawić na "To jest oprawa". Powinno natomiast działać coś takiego:

public PokazInfo()
{
     this.Info("To jest oprawa!");
}

jakoże metodę PokazInfo wywołujesz wewnątrz którejś z metod klasy Form1, to wystarczy wywołanie
PokazInfo();
tak naprawdę wykonuje się instrukcja
this.PokazInfo();
ktora informuje program, ze metoda PokazInfo jest metodą składową klasy Form1.
</quote>

Nie o to chodzi. Wywołanie przez "this" lub przez "form1" lub za pomocą samej nazwy metody nie jest możliwe w tym przypadku (kompilator zgłasza błąd). Chodzi mi o wywołanie metody zdefiniowanej w formularzu z innej klasy. Weźmiemy prostszy przykład:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Probka
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            JakasKlasa Obiekt = new JakasKlasa();
            textBox1.Text = "Klik";
            Obiekt.MetodaKlasy();
        }

        public void MetodaFormularza()
        {
            textBox1.Text = "Wykonano";
        }
    }


    public class JakasKlasa
    {
        int Zmienna;
        public JakasKlasa()
        {
            Zmienna = 2;
        }
        public void MetodaKlasy()
        {
            Zmienna = 5;
            //Tu chce wywolac metode MetodaFormularza() z klasy Form1
        }
    }

}

Jest zdefiniowana klasa o nazwie "JakasKlasa", która posiada metodę. Po uruchomieniu programu i kliknięciu przycisku tworzy się nowy obiekt tej klasy i wywołuje się zawarta w tym obiekcie metoda nazwana "MetodaKlasy()". Metoda wykonuje swoje instrukcje, ale również ma zmieniać jakiś element formularza, np. pasek postępu. Co wpisać w miejsce komentarza w tym przykładzie?

Jakby nie było, formularz Form1 też jest obiektem. Tylko, jak sie nazywa i jak do niego dojść?

0

Wyjsc jest kilka, jezeli chcesz cos zmieniac na form1 przy pomocy tej metody to musisz zmienic metode na statuczna to jest public static void ale w tedy musisz rowniez tego bex boxa zmienic na statycznego. jezeli nie chcesz nic zmieniac to po prostu tworzysz nowa instancje form1. Mozesz tez sprubowac ta druga klase umiescic w innej przestrzeni nazw i poprzez ussing skozystac z wybranej metody.

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