Цикл For

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Цикл For

Сообщение resident » 25.03.2016 18:48:49

KenDari писал(а):Изображения кнопки?

Да
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 18:51:55

Снег Север писал(а):
Код: Выделить всё
procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

Но у меня нет кнопки Lvi
У меня есть кнопки Lv1, Lv2, Lv3...
И в том то и проблема, что я не могу заключить это в цикл, так как For может быть только внутри процедуры, а не процедуры "procedure TForm1.Lv1MouseDown, procedure TForm1.Lv2MouseDown, procedure TForm1.Lv3MouseDown..." внутри цикла for

Добавлено спустя 2 минуты 3 секунды:
resident писал(а):
KenDari писал(а):Изображения кнопки?

Да

Я же прикрепил их к предыдущему сообщению, просто мне проблематично будет их заархивировать
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 18:54:24

KenDari писал(а): просто мне проблематично будет их заархивировать

Zip уже из Windows выпилили? :)
Тогда прикрепляю пример на тексте

Кстати, там еще можно в цикл добавить строку
Код: Выделить всё
MouseLeave(Form1.Controls[i]);

чтобы при создании формы кнопки заполнились соответствующим "контентом"
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось resident 25.03.2016 19:06:20, всего редактировалось 1 раз.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение Снег Север » 25.03.2016 19:03:22

KenDari писал(а):Но у меня нет кнопки Lvi

Вам не нужен никакой цикл.
Создаете обработчик только для первой кнопки (или любой). Всем остальным назначаете его же. И всё.
Sender в параметрах обработчика - это тот конкретный контрол, который в данный момент вызвал обработчик.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Цикл For

Сообщение resident » 25.03.2016 19:09:48

Снег Север писал(а):Вам не нужен никакой цикл.
Создаете обработчик только для первой кнопки (или любой). Всем остальным назначаете его же.

Не понимаю, почему вы против того, чтобы назначить "его же" в цикле.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение Снег Север » 25.03.2016 19:11:03

resident писал(а):Не понимаю, почему вы против того, чтобы назначить "его же" в цикле.

Лишняя сущность. Обработчик всегда получает ссылку на вызвавший контрол - на фига что-то перебирать???
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Цикл For

Сообщение resident » 25.03.2016 19:20:07

Я думал, что сущность это нечто иное.
По моему лучше "сущность" в несколько строк цикла чем сотня щелчков мышью, где можно и что-нить упустить. Потом еще тестировать, все ли назначено правильно. А если у него сотня таких форм? Сто на сто = 10000 щелков мышью. И подозреваю, что я прав, иначе тема не была бы создана при уже имеющемся решении.

Добавлено спустя 3 минуты 22 секунды:
Снег Север писал(а): на фига что-то перебирать???

Ответ можете посмотреть в архиве (это совсем другое решение, и другой архив)
viewtopic.php?f=5&t=11005&p=94962#p94954
Снег Север писал(а):Обработчик всегда получает ссылку на вызвавший контрол

Так и есть
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение Снег Север » 25.03.2016 19:31:57

resident писал(а):А если у него сотня таких форм?

Для таких экзотических случаев пишут свой генератор форм с динамическим созданием контролов. Да, там без циклов не обойтись. А если у вас на одна форма на десять кнопок, то назначить вручную намного проще и надежнее.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Цикл For

Сообщение KenDari » 25.03.2016 19:41:44

resident писал(а):
KenDari писал(а):Тогда прикрепляю пример на тексте


Вот что я написал по вашему примеру, все скомпилировалось без ошибок, но при наведении курсора ничего не происходит. Что я сделал не так?

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
  var
    i: integer;
  begin
    for i := 0 to 2 do
      if (Form1.Controls[i].ClassNameIs('TImage')) then
        begin
          (Form1.Controls[i] as TImage).OnMouseMove := @MouseMove;
          (Form1.Controls[i] as TImage).OnMouseLeave := @MouseLeave;
          (Form1.Controls[i] as TImage).OnMouseDown := @MouseDown;
        end;
  end;

  procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  begin
    (Sender as TImage).Picture.LoadFromFile('Ур' + IntToStr((Sender as TImage).Tag) + '.png');
  end;

procedure TForm1.MouseLeave(Sender: TObject);
begin
   (Sender as TImage).Picture.LoadFromFile('Ур' + IntToStr((Sender as TImage).Tag) + '.1.png');
end;

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
    (Sender as TImage).Picture.LoadFromFile('Ур' + IntToStr((Sender as TImage).Tag) + '.2.png');
  end;
end.
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 19:46:14

KenDari писал(а):Что я сделал не так?

Вы счетчик запустили до 2, цикл до TImage наверное и не дошел :mrgreen:
Там все контролы перебираются, а их кроме TImage еще много. Вся суть, что вы должны перебрать все контролы на форме и найти среди них TImage.
Верните как у меня Pred(Form1.ControlCount)

Добавлено спустя 57 секунд:
И, кстати, вы Tag задали?

Добавлено спустя 1 минуту 4 секунды:
А MouseUp не нужен чтоль?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 20:05:37

resident писал(а):
KenDari писал(а):Что я сделал не так?

Вы счетчик запустили до 2, цикл до TImage наверное и не дошел :mrgreen:
Там все контролы перебираются, а их кроме TImage еще много. Вся суть, что вы должны перебрать все контролы на форме и найти среди них TImage.
Верните как у меня Pred(Form1.ControlCount)

Добавлено спустя 57 секунд:
И, кстати, вы Tag задали?

Добавлено спустя 1 минуту 4 секунды:
А MouseUp не нужен чтоль?


Tag задал, MouseUp не нужен, контрол вернул и все равно ничего не работает :D
А в этом месте а все правильно написал?
Код: Выделить всё
procedure TForm1.MouseLeave(Sender: TObject);
begin
   (Sender as TImage).Picture.LoadFromFile('Ур' + IntToStr((Sender as TImage).Tag) + '.png');
end;


Добавлено спустя 52 минуты 35 секунд:
У МЕНЯ НАКОНЕЦ-ТО ЗАРАБОТАЛО
Сделал без цикла с одним обработчиком
Огромное спасибо!!! :roll: всем, кого я сегодня помучил (и сам измучился)
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение Alex2013 » 26.03.2016 03:01:26

Извиняюсь за офтоп... но чем "Sender as " лучше "My_type(Sender)" ? :roll:
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Цикл For

Сообщение скалогрыз » 26.03.2016 05:26:32

Alex2013 писал(а):Извиняюсь за офтоп... но чем "Sender as " лучше "My_type(Sender)"

Безопасностью, если при Sender as My_Type, sender окажется не My_Type (или его наследником), то возникнет exception.
Код проверки и создания исключения неявно генерируется компилятором!

My_Type(Sender) приведёт всё что соразмерно указателю к My_Type без проверок и гарантий. Кстати, nil он тоже безропотно приведёт к нужному типу ;)

Очевидно что, "as" несколько медленнее. Использовать его лучше всего, в тех случаях, когда источник "Sender-а" неизвестен. (Например при получении объектов от плагинов, или когда пишешь библиотеку).

Но лучше всего использовать связку "is", тогда можно писать код так:
Код: Выделить всё
  if  (Sender is My_Type) then begin
   My_Type(Sender).dostuff()
  end;

Почему это хорошо. Потому что "is" удостоверится что это объект нужного типа (а если nil, то is вернёт false). Ну и при этом не пытается создавать каких-либо исключений, так что не нужно возится с try .. except
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Цикл For

Сообщение Deimos » 26.03.2016 12:57:01

Снег Север писал(а):я делал бы так:


а не проще было-бы обозвать картинки и кнопки одинаково и опираться на имя контрола при загрузке картинки, не используя Tag?
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30

Re: Цикл For

Сообщение vitaly_l » 26.03.2016 12:59:26

Может лучше тогда загрузить картинки в TimageList? Раз уж это кнопки.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 227

Рейтинг@Mail.ru