Wyświetlanie zmiennych względem wybranek przycisku

0

Witam mam pewne pytanko ponieważ chciałem zrobić boczne menu w którym będą wyświetlane informacje na temat pozycji, nazwy itp. danego przycisku i wszystko jest dobrze, ale musiałem stworzyć na potrzeby programu customowe zmienne x i y i jak np. nazwę danego elementu da się łatwo wyświetlić za pomocą senderow tak nie wiem, jak zrobić wyświetlanie customowych zmiennych względem przycisku który edytujemy.

Dla lepszego zobrazowania wklejam tutaj kawałek kodu

label2.Text = ((Button)s).Name; // wyświetla nazwę przycisku

label5.Text = yPosition.ToString(); // Pokazuje pozycje Y
label1.Text = xPosition.ToString(); // Pokazuje pozycje X
4

nic z tego nie rozumiem...

0

A te "customowe" zmienne są jedne dla wszystkich przycisków? Czy dla każdego osobno?

0

A skad masz wartosc yPosition?
Co to znaczy "względem przycisku który edytujemy"? O jaka siatke chodzi?

Moze

var s = (Button)s; // wyświetla nazwę przycisku
label5.Text = s.Top.ToString(); // Pokazuje pozycje Y
label1.Text = s.LeftToString(); // Pokazuje pozycje X
0
jacek.placek napisał(a):

A skad masz wartosc yPosition?
Co to znaczy "względem przycisku który edytujemy"? O jaka siatke chodzi?

Moze

var s = (Button)s; // wyświetla nazwę przycisku
label5.Text = s.Top.ToString(); // Pokazuje pozycje Y
label1.Text = s.LeftToString(); // Pokazuje pozycje X

Jeżeli chodzi o customowe pozycje x,y to są one z voida (wyslalem tylko fragment bo troche sporo by tego bylo)

                public static int xPosition;
                public static int yPosition;

                if (b.Location.X < 0)
                {
                    b.Location = new Point(50 - (b.Width / 2), b.Location.Y);
                }
                if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= 0 && b.Location.Y <= 135)
                {
                    b.Location = new Point(50 - (b.Width / 2), 68 - (b.Height / 2));
                    xPosition = 0;
                    yPosition = 0;
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= 135 && b.Location.Y <= 270)
                {
                    b.Location = new Point(50 - (b.Width / 2), 204 - (b.Height / 2));
                    xPosition = 0;
                    yPosition = 1;
                }

Jeżeli chodzi o siatkę to jest ona rysowana w kodzie

           Pen p = new Pen(Color.Red);

            for (int y = 0; y < panel1.Width; y += 135)
            {
                e.Graphics.DrawLine(p, panel1.Width, y, 0, y);
            }

            for (int x = 0; x < panel1.Width; x += 100)
            {
                e.Graphics.DrawLine(p, x, panel1.Width, x, 0);
            }

dodam jeszcze zdjęcie siatki dla lepszego zobrazowania

0

Możesz zrobić tak jak napisał kolega wyżej, ale jeśli masz je w jakimś kontenerze to da Ci współrzędne względem kontenera. Możesz też użyć właściwości Tag buttona i przechowywać sobie w niej swoje zmienne.

0

Z jakiego kur... voida?
Po namyśli zakładam, ze rysujesz siatkę i wstawiasz tam przyciski. Przyciski maja pozycje w komórkach siatki.
Klikasz na przycisk i chcesz poznać jego pozycje.
Pozycję przycisku masz w ((Button)s).Left i ((Button)s).Top albo w ((Button)s).Location.
Jak chcesz poznać współrzędne komórki siatki dla przycisku to musisz porównać położenie przycisku ze współrzędnymi siatki.

Siatka jest 135 x 100 więc jak masz Left przycisku to dzielisz to przez 135 i masz mniej więcej Y siatki (może Y+1)
Jak podzielisz Top przez 100 to dostaniesz mniej więcej X siatki (może X+1)

Albo nic nie rozumiem i pisze głupoty.
Pokaż cały kod metod dodających przyciski i cały kod zdarzenia przycisków.

0
private Button CreateButton()
        {
            Button b = new Button();
            name++;

            b.BackColor = Color.White;
            b.Name = "button " + name;
            b.Text = "";
            b.MouseDown += (s, eb) =>
            {
                if (eb.Button == MouseButtons.Left)
                {
                    px = eb.X;
                    py = eb.Y;
                }
            };
            b.MouseMove += (s, me) =>
            {
                if (me.Button == MouseButtons.Left)
                {
                    b.Left += me.X - px;
                    b.Top += me.Y - py;
                }
            };
            b.MouseUp += (s, mu) =>
            {
                xPos = b.Location.X / 135;
                yPos = b.Location.Y / 100;

                Console.WriteLine("|X: {0}, Y: {1}| xPos: {2}, yPos: {3},", b.Location.X, b.Location.Y, xPos, yPos);
            };
            b.Click += (s, c) =>
            {
                var sa = (Button)s; 
                label5.Text = (sa.Left / 135).ToString(); 
                label1.Text = (sa.Top / 100).ToString(); 
                label2.Text = sa.Name; 
            };

            Timer t = new Timer();

            t.Tick += (s, st) =>
            {
                CoordinationSystem.CoordinationsCenter(b);
            };

            t.Start();

            panel1.Controls.Add(b);

            return b;
        }
0

Poza tym, ze nie przypisujesz nigdzie początkowych pozycji przycisków to chyba jest OK.

Wywołanie 10 razy tej metody tworzy 10 przycisków ale na wszystkie z left = 0 i top = 0. Jak przesuwam to jest OK.

Ustaw jeszcze b.Size = new Size(135, 100); będzie widać jak się układają.

No i nie wiem co ten timer ma robić.

0

Ten timer ustawia przycisk na środku prostokąta. Tam powyżej gdzie jest kawałek kodu z xPosition i yPosition to pod tymi int'ami sa if'y ktore wyśrodkowują przycisk na środek prostokątu

1

jak klikam na przycisk to pojawia mi się jego nazwa przycisku który klikam a jak chce dostać pozycje x lub y to w przypadku kiedy jest label5.Text = yPosition.ToString(); lub label1.Text = xPosition.ToString(); to te zmienne nakładają się na siebie i pytam się, co zrobić, żeby podczas kliknięcia przycisku pokazywały mi się te zmienne x, y względem klikniętego przycisku. -

Wydaje mi się, że chodzi o domknięcia lambd (tak to się chyba nazywa)

Jeżeli robisz jakąś pętle do rysowania oraz definiowania eventów przy czym korzystasz z jej iteratora w tych delegatach, to możesz się naciąć

Weźmy sobie taki kod:

var list = new List<Action>();

for (int i = 0; i < 5; i++)
{
    list.Add(() => Console.Write(i));
}

list.ForEach(x => x());

Wynikiem jest 55555, a po lekkiej modyfikacji:

var list = new List<Action>();

for (int i = 0; i < 5; i++)
{
    int temp = i;
    list.Add(() => Console.Write(temp));
}

list.ForEach(x => x());

01234

Chociaż pewnie lepiej expert @neves i @Afish to wytłumaczą :D

https://blogs.msdn.microsoft.com/ericlippert/2003/09/17/what-are-closures/

https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

https://blogs.msdn.microsoft.com/ericlippert/2009/11/16/closing-over-the-loop-variable-part-two/

https://stackoverflow.com/questions/271440/captured-variable-in-a-loop-in-c-sharp

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