Kezdőoldal » Számítástechnika » Programozás » Miért állítja 0, 0-ra a...

Miért állítja 0, 0-ra a koordinátákat a C# program Point változónál?

Figyelt kérdés

Üdv, a problémám az, hogy amikor ez a kód lefut, a programban elso X és Y értéke is 0, pedig a metódus beállítja. Arra gondoltam, hogy a referenciaértéknél ugye csak mutatót állít ha egyenlőségjel van, és mivel a p Point eltűnik, visszaáll alapértelmezettre. Van ennek értelme?


[link]


2013. ápr. 28. 02:41
 1/2 anonim ***** válasza:
Anélkül, hogy kitérnénk a kód _egyéb_ problémáira, a válasz a kérdésedre jóeséllyel az lesz, hogy az "if (elsokatt)" blokkod nem fut le adott esetben, így egy üres Point objektummal vágsz neki a kalandnak. Hogy miért nem fut le? Nos, alapvetően a kódstílus-problémák, illetve figyelmetlenség folytán: a semmi közepén árválkodó "elsokatt" változód példányváltozó, míg az "elso" objektum lokális változóban van. Nem tudom, mit szeretnél ezzel csinálni, de 100% -ig biztos vagyok benne, hogy nem ez lesz a jó megoldás :)
2013. ápr. 28. 06:39
Hasznos számodra ez a válasz?
 2/2 anonim ***** válasza:

Nézd, mivel a elso az egy lokális változó, csak addig él, amíg a MouseClick függvény fut.

Továbbá, azt is vegyük figyelembe, hogy az elsokatt nevű bool-od viszont példány-szintű.

Tehát a következő dolog történik:

1. Első kattintás, belefut a Form1_MouseClick-be a vezérlés.


2. Létrejön 0,0 értékekkel az elso Point(new Point() miatt).


3. Mivel az elsokatt true, belefut az if ágba, ahol inicializálod az elso Pointot, és az elsokatt-ot átbillented.


4. Kilép a függvényből, az elso Point megszűnik létezni.(Persze nem rögtön, a C#-ban GC van, de ebbe ne menjünk bele)


5. Második kattintás: Újra belefut a Form1_MouseClick-be a vezérlés.


6. Létrejön megint az elso nevű lokális változó 0,0 értékekkel(new Point() ugye). Az elsokatt már false, tehát az else ágba megyünk, így az elso nevű lokális Point-od nem inicializálódik.


Ennyi.


Hotfix-ként azt mondanám, hogy példányszintű mezőként vedd fel az elso nevű Point-ot, így működni fog. De persze ez még mindig sz*r megoldás, one-shot system lesz belőle, mert az elsokatt-ot soha nem billented vissza false-ra, így már pl. a 3. egérkattintásra nem azt az eredményt fogod kapni, mint amire számítanál :):)


Ugye az nyilvánvaló, hogy ami itt lezajlik, az egy több felhasználói interakcióból álló workflow; Két kattintásból áll, a második kattintásra befejeződik a workflow. Tehát kell egy átmeneti állapottárolás a két click között, és a végén pedig reset-elni kéne az állapotot.


Tehát én csinálnék egy EllipseDrawWorkflow nevű osztályt, amiben tárolva lenne az aktuális workflow állapota, referenciája lenne a UI-ra, valamint meglenne az a képessége, hogy maga kezelje le az egérkattintásokat.

A Form-nak csak annyi lenne a feladata, hogy delegálja a kattintás eseményeket ennek a workflow példánynak, szükség esetén pedig létrehozza/kinullázza az aktuális workflow-ra mutató referenciát.


tehát:


class EllipseDrawWorkflow

{


public EllipseDrawWorkflow(Form1 form)

{

this._form = form;

}


private Form1 _form;


private Point? _elso = null;



public void HandleClick(MouseEventArgs e)

{

if (this._elso == null)

{

//ez az első kattintás, eltárolni az _elso-be

}

else

{

// végrehajtani a rajzolást


// Kinullázni a form workflow referenciáját

this._form.worklfow = null;

}

}

}



A Form1 pedig így nézzen ki:


public EllipseDrawWorkflow workflow = null;


void Form1_MouseClick(object sender, MouseEventArgs e)

{

if (this.workflow == null)

{

this.workflow = new EllipseDrawWorkflow(this);

}


this.workflow.HandleMouseClick(e);

}

2013. ápr. 28. 11:27
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!