Wyświetlanie zmiennych względem wybranek przycisku

Wyświetlanie zmiennych względem wybranek przycisku
J3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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

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

label5.Text = yPosition.ToString(); // Pokazuje pozycje Y
label1.Text = xPosition.ToString(); // Pokazuje pozycje X
abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
4

nic z tego nie rozumiem...

litrmleka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: lubuskie
  • Postów: 201
0

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

JP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1065
0

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

Moze

Kopiuj
var s = (Button)s; // wyświetla nazwę przycisku
label5.Text = s.Top.ToString(); // Pokazuje pozycje Y
label1.Text = s.LeftToString(); // Pokazuje pozycje X
J3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
jacek.placek napisał(a):

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

Moze

Kopiuj
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)

Kopiuj
                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

Kopiuj
           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

litrmleka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: lubuskie
  • Postów: 201
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.

JP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1065
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.

J3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Kopiuj
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;
        }
JP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1065
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ć.

J3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5227
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:

Kopiuj
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:

Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.