Nefunkčnost proměnných   otázka

C#, WinForms, .NET

Zdravím, učím se se C# a narazil jsem na jednu zajímavou věc, nad kterou sedím už několik dní a zkouším na to přijít.

Ve VB.NET když potřebuji, aby se provedla nějaká procedura z jiného formuláře, tak si vytvořím proměnnou za tento formulář a pomocí proměnné odkážu na tu proceduru, vše funguje jak má, ale když to samé chci udělat v C# tak se neprovede nic.

private void dalsilevl_Click(object sender, EventArgs e)
        {
            Labyrint laby = new Labyrint();
            promenne pr = new promenne();

            pr.x = 10;
            pr.y = 10;
            
            laby.level(1);
        }

V ukázce mám na začátku deklaraci jednoho formuláře a třídy. Třídu mám plnou vlastností, které v programu využívám. A ve formuláři mám pár procedur (např. level()). Jenže když tento kod proběhne nestane se vůbec nic.

Možná dělám někde chybu. Díky za odpovědi

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ověřte, že třídy Labyrint i Promenne jsou označeny jako public a že metoda Level je také označena jako public. Obyčejné proměnné public nedávejte, udělejte vlastnosti, které je vrací a nastavují.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vlastnosti v třídě jsou Public, proměnné které se k vlastnosti vztahují jsou naopak private, protože do nich ukládám pomocí vlastnosti. Divné je, že když chci tuto proměnnou naplnit tak se nenaplní.

Takto vypadá jedna z vlastností:

private int _X;
public int X
{
   get { return _X; }
   set { _X = value; }
}

Velmi podivné je, že to jednou chodí a jednou ne.. v jednom projektu mi to ukládá a čte tak jak má a v druhém zase ne.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Opět se vracím k tomuto problému, protože jsem jej ještě nevyřešil a nevím kde je ta pravá chyba.

Všechny proměnné, vlastnosti, funkce i třídy mám deklarované jako public. Vše mám pod stejným jmenným prostorem, ale i tak to nefunguje. Hodnoty se prostě odmítají posílat.

Přikládám část zdr. kódu hl. formuláře a část vedlejší třídy s vlastností:

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

namespace GPS_Reciever
{
    public partial class HlOkno : Form
    {
        #region Promenne
        GPS Gps = new GPS();
        Calculations Calc = new Calculations();
        Drawing drw = new Drawing();
        #endregion

        private void Updater_Tick(object sender, EventArgs e)
        {
            Gps.Reading(SPort);
            vypis();

            textBox1.Text += SPort.ReadExisting() + "\n";
        }
    }
}

a třída vypadá takto

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

namespace GPS_Reciever
{
    public class GPS
    {
        string[] GPGGA; // Global Positioning System Fix Data

        /// <summary>
        /// Zeměpisná délka
        /// </summary>
        public double Latitude
        {
            get { return Convert.ToDouble(GPGGA[2].Replace('.', ',')); }
        }
    }
}

Už nevím kde mám chybu, že se hodnoty neukládají. Dost mě tento problém štve, protože kvůli němu musím všechno rvát do jednoho formuláře, aby to fungovalo.

Kdyby se našel někdo kdo by aspoň trošku věděl co s tím, prosím poraďte...

Díky za jakoukoliv radu

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A co přesně Vám nefunguje? musíte mít někde chybu,protože tohle je standard v C# a určitě to funguje na 100%...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No právě že nefunguje nic co se má provádět z jiné třídy. Když mám jednu třídu plnou funkcí nebo procedur, tak ani jedna z procedur nezpracuje hodnoty. Např. funkce, která by měla něco sečíst, tak se neprovede vůbec nic, ani nevrátí.

public double secti(double x, double y)
        {
            return x + y;
        }

Toto je snad dobře ne:-)

Nezdá se mi, že bych měl chybu někde v deklaracích...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak si to oddebugujte a podívejte se kde je problém :) já ted zkoušel jednoduchý kód a vše mi funguje,takže chyba nebude v jazyku nebo tak :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak voláš členy třídy? Z předtím vytvořené instance příslušné třídy nebo zase tak kreténsky jako ve VB6?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Deklarace

        GPS Gps = new GPS();
        Calculations Calc = new Calculations();
        Drawing drw = new Drawing();

a volání

        private void Updater_Tick(object sender, EventArgs e)
        {
            Gps.Reading(SPort);
            vypis();
        }

takže z instance. Kreténský volání jsem se už odnaučil:-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A co má udělat? z tohoto to není vůbec jasné.Pokud volaná metoda má něco vracet,tak je třeba výsledek někam uložit,atd..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je procedura, která plní podle čtených informací z portu stringová pole.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to nezkoušejte na takovém případě,ale zkusite si udělat jednoduchou třídu,například s metodou co sečte dvě čísla a vrátí výsledek.Tuto metodu pak zavolejte přes instanci třídy a uvidíte,že vše funguje jak má..

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback