C# grafika a MainForm-on kívül - hogyan?

C# grafika a MainForm-on kívül - hogyan?
2017-10-21T19:10:58+02:00
2017-10-22T17:11:30+02:00
2022-10-15T21:26:37+02:00
Tomi_T2
Sziasztok, kedves szakemberek!
Mint kezdő C# felhasználó azzal a kérdéssel/kéréssel fordulok hozzátok, hogy egy általam létrehozott osztály változóit hogyan lehet felhasználni más függvényekből, hogy abból egy grafikus objektumot építsek fel? Mellékeltem a teljes kódot, és azt nem értem, hogy az ujjatekos objektum változóértékei miért nem elérhetők máshol és hogyan lehet ezt megcsinálni? Semmi ezt elmagyarázó, leíró, részletező, kifejtő példát nem találtam a neten, úgyhogy bennetek van az utolsó bizodalmam. Azt írja ki a SharpDevelop, hogy: "Az "ujjatekos" név nem szerepel ebben a környezetben."

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

namespace valami
{
    public class jatekos
    {
            public int xhely;
            public int yhely;
            public int szel;
            public int mag;
            public jatekos()
            {
                xhely=10;
                yhely=10;
                szel=50;
                mag=50;
            }
    }
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        
            jatekos ujjatekos=new jatekos();
            Paint += new PaintEventHandler(Rajzol); 
        }
        
        void Rajzol(object sender, PaintEventArgs e) 
        { 
                e.Graphics.FillRectangle(Brushes.BlueViolet,new Rectangle(ujjatekos.xhely,10,50,50)); 
        }
            
    }
    
}
Mutasd a teljes hozzászólást!
Tegnap én külön kódba raktam a formot és a jatekos  osztalyt, így azok nálam külön névtérbe kerültek, de most láttam, hogy nálad egy névtérben lettek létrehozva. Azaz ez esetben nem kell felvenned a using valami; sort a kódodba.  (Egyébként a sok usingból kettő is elég lenne.)

A var kulcsszóra sincs szükséged  a tipusod a jatekos lesz, a tipus neve ujjatekos
Azaz így néz ki a deklarációja mint ahogy azt a lenti kódban láthatod:
jatekos ujjatekos;
A példányosítás már a konstruktorban történik meg,de a dekraláció nem!

ujjatekos = new jatekos();
Nincs az ujjatekos előtt a jatekos osztaly név, mert a változót már osztály mezőjeként deklaráltuk!

A tegnap leírtak továbbra is érvények, rossz helyen volt, vagy van  deklarálva a változód, azért nem látszott a függvényből. A névtérről írt dolgokat viszont figyelmen kívül hagyhatod, mert csak az én példakódomba került a jatekos osztály eltérő névtérbe a formtól. Elnézésed kérem ha ezzel megzavartalak volna.
Alább az egy névtérbe szervezett kód:

using System.Drawing; using System.Windows.Forms; namespace valami { class jatekos { public int xhely; public int yhely; public int szel; public int mag; public jatekos() { xhely = 10; yhely = 10; szel = 50; mag = 50; } } public partial class Form1 : Form { jatekos ujjatekos; public Form1() { InitializeComponent(); ujjatekos = new jatekos(); Paint += new PaintEventHandler(Rajzol); } void Rajzol(object sender, PaintEventArgs e) { e.Graphics.FillRectangle(Brushes.BlueViolet, new Rectangle(ujjatekos.xhely, 10, 50, 50)); } } }
Mutasd a teljes hozzászólást!

  • Használd a forráskód gombot.

    Én nem értek a c#-hez, de ránézve a kódodra alap hiányosságaid vannak a programozásról.

    A {} nem dísznek van. Ezek egy obejctum határát jelentik. Te létrehozol egy ujjatekost egy Mainform nevű helyen, majd egy másik helyen akarod módosítani.
    Át kell adnod a "ujjatekos" referenciáját a Rajzol nevű függvénybe, különben nem fogja tudni módosítani.


    Amúgy ha megnéznéd a hibát amit kaptál, a környezet a { és } közötti rész, és mint láthatod sehol nem hoztál létre "ujjatekos" nevű dolgot a "Rajzol" nevű helyen.

    Konyhanyelven, te építesz otthon egy autót, majd azt mondod egy random embernek az utcán, hogy fesse be pirosra, de nem mondod meg hol és mit.
    Mutasd a teljes hozzászólást!
  • Igen, próbáltam a Rajzol-ban is létrehozni az ujjatekost, de attól félek, hogy az egy ciklusos esemény és akkor folyamatosan hozza létre az ujjatekosokat. Ennél jobb lenne az ujjatekos osztály változóinak értékeit átadni a Rajzol függvénynek, de nem tudom hogy kell. Csekély C# tudásom nem terjed ki arra, hogy egyik osztály adatait hogy kell átadni egy másik függvénynek, metódusnak. Pont ez az, amit nem tudok, ez a nagy kérdés, amire nem találtam sehol még példát.
    Mutasd a teljes hozzászólást!
  • Így csak a form konstruktorában látszik a jatekos osztályod példánya, mert ott deklaráltad.
    Deklarált a jatekost a MainForm osztályod változójaként és működni fog a dolog, akkor viszont a konstruktorban nem kell deklarálni csak példányosítani. (namespace-re figyelj majd oda én mástt használtam) Ha eltérő nemaspaceben van a használni kívánt osztály és a form, akkor célszerű egy using alkalmazásával ezt tudatni a formoddal, vagy minősített osztály nevet kellene használnod.

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using valami; namespace WindowsFormsApplication5 { public partial class Form1 : Form { jatekos ujjatekos; public Form1() { InitializeComponent(); ujjatekos = new jatekos(); Paint += new PaintEventHandler(Rajzol); } void Rajzol(object sender, PaintEventArgs e) { e.Graphics.FillRectangle(Brushes.BlueViolet, new Rectangle(ujjatekos.xhely, 10, 50, 50)); } } }
    Mutasd a teljes hozzászólást!
  • Akkor a var kulcsszóval deklaráljam a jatekost a MainForm változójaként? És arra a sok using...-ra is szükség van a program elején?
    Mutasd a teljes hozzászólást!
  • Tegnap én külön kódba raktam a formot és a jatekos  osztalyt, így azok nálam külön névtérbe kerültek, de most láttam, hogy nálad egy névtérben lettek létrehozva. Azaz ez esetben nem kell felvenned a using valami; sort a kódodba.  (Egyébként a sok usingból kettő is elég lenne.)

    A var kulcsszóra sincs szükséged  a tipusod a jatekos lesz, a tipus neve ujjatekos
    Azaz így néz ki a deklarációja mint ahogy azt a lenti kódban láthatod:
    jatekos ujjatekos;
    A példányosítás már a konstruktorban történik meg,de a dekraláció nem!

    ujjatekos = new jatekos();
    Nincs az ujjatekos előtt a jatekos osztaly név, mert a változót már osztály mezőjeként deklaráltuk!

    A tegnap leírtak továbbra is érvények, rossz helyen volt, vagy van  deklarálva a változód, azért nem látszott a függvényből. A névtérről írt dolgokat viszont figyelmen kívül hagyhatod, mert csak az én példakódomba került a jatekos osztály eltérő névtérbe a formtól. Elnézésed kérem ha ezzel megzavartalak volna.
    Alább az egy névtérbe szervezett kód:

    using System.Drawing; using System.Windows.Forms; namespace valami { class jatekos { public int xhely; public int yhely; public int szel; public int mag; public jatekos() { xhely = 10; yhely = 10; szel = 50; mag = 50; } } public partial class Form1 : Form { jatekos ujjatekos; public Form1() { InitializeComponent(); ujjatekos = new jatekos(); Paint += new PaintEventHandler(Rajzol); } void Rajzol(object sender, PaintEventArgs e) { e.Graphics.FillRectangle(Brushes.BlueViolet, new Rectangle(ujjatekos.xhely, 10, 50, 50)); } } }
    Mutasd a teljes hozzászólást!
  • Ujjé, köszönöm szépen! Kiegészítésed alapján már működik a program!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd