Miért állítja 0, 0-ra a koordinátákat a C# program Point változónál?
Ü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?
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);
}
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!