Цикл For

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

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

Цикл For

Сообщение KenDari » 25.03.2016 16:25:54

Доброго времени суток
Помогите советом
Как можно заключить в цикл for процедуры?
У меня куча одинаковых кнопок и все события к ним абсолютно одинаковые кроме номера кнопки
Попыталась тупо впихнуть процедуру в цикл, но компилятор ругается
"unit1.pas(215,11) Fatal: Syntax error, ";" expected but "identifier TFORM1" found"
Наверняка тут грубая ошибка, не подскажите что можно с этим сделать?

begin
For i:=1 to 10 do begin
procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Lvi.Picture.LoadFromFile('ур'i'.png');
end;
end;
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение vitaly_l » 25.03.2016 16:40:30

Код: Выделить всё
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;

procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
   For i:=1 to 10 do begin
     SomeFunction( 'урi.png' );
     end;
end;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Цикл For

Сообщение KenDari » 25.03.2016 16:46:46

vitaly_l писал(а):
Код: Выделить всё
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;

procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
   For i:=1 to 10 do begin
     SomeFunction( 'урi.png' );
     end;
end;


TForm1.LviMouseDown
Но вот здесь тоже должен прогоняться цикл
У меня как бы кнопки - изображения с названиями Lv1, Lv2, Lv3...

Добавлено спустя 4 минуты 12 секунд:
vitaly_l писал(а):
Код: Выделить всё
begin
   For i:=1 to 10 do begin
     SomeFunction( 'урi.png' );
     end;


И разве в названии изображения будет меняться i? Оно же в апострофах
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение vitaly_l » 25.03.2016 16:54:19

Код: Выделить всё
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;

procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i:byte;
begin
   For i:=1 to 10 do begin
     SomeFunction( 'ур' + IntToStr(i) + '.png' );
     end;
end;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Цикл For

Сообщение resident » 25.03.2016 17:09:50

KenDari писал(а):У меня куча одинаковых кнопок и все события к ним абсолютно одинаковые кроме номера кнопки

Привет :)
Можно сделать вот так, самое простое.
Кнопка - это контрол. Делаем цикл по всем контролам формы и выискиваем среди них кнопки (ClassNameIs('TButton')), еще можно дифференцировать кнопки свойством Tag
Код: Выделить всё
  for i := 0 to Pred(Form1.ControlCount) do
    if (Form1.Controls[i].ClassNameIs('TButton')) and (Form1.Controls[i].Tag = 0)
      then (Form1.Controls[i] as TButton).Caption := 'NewText';

Свойство Tag - целое число заполнять необязательно. Это если вы хотите, чтобы именно для кнопок с конкретным значением Tag (в данном примере Tag = 0) срабатывал цикл.
Я меняю в примере Caption, вы там легко можете поставить загрузку картинки или что там требуется.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 17:12:12

vitaly_l писал(а):
Код: Выделить всё
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;

procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i:byte;
begin
   For i:=1 to 10 do begin
     SomeFunction( 'ур' + IntToStr(i) + '.png' );
     end;
end;


Выдало кучу ошибок и я окончательно запутался

unit1.pas(195,18) Error: method identifier expected
unit1.pas(197,1) Error: Identifier not found "Lvi"
unit1.pas(217,18) Error: method identifier expected
unit1.pas(217,18) Error: Duplicate identifier "SomeFunction"
unit1.pas(219,1) Error: Identifier not found "Lvi"
unit1.pas(222,18) Error: method identifier expected

Код: Выделить всё
195
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;   


Код: Выделить всё
217
procedure TForm1.SomeFunction(name:string);
begin
Lvi.Picture.LoadFromFile( name );
end;
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 17:14:34

KenDari писал(а):procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

А что в итоге требуется, зачем у вас событие MouseDown в первом посте темы?

Добавлено спустя 7 минут 18 секунд:
KenDari писал(а):И разве в названии изображения будет меняться i? Оно же в апострофах

Вы мыслите правильно, в кавычках - константа. Подозреваю, что вам нужно вместо константы вычислять эту строку на основе счетчика цикла или еще как-то.
А у вас и названия картинок разные?
Т.е. в кнопку Lv1 должно закачатся изображение '1.png', в кнопку Lv2 изображение '2.png'?
Сколько их всего? Сотня, больше?

Добавлено спустя 2 минуты 11 секунд:
Ага, таким образом можно поставить кнопкам различные свойства Tag.
А в загрузке подсовывать строку на основе этого свойства. Тогда получится, что, например, в кнопку с Tag=3 будет закачана картинка yp3.png. Названия кнопок в данном случае могут быть любыми, главное Tag.
Код: Выделить всё
'ур' + IntToStr(Form1.Controls[i].Tag) + '.png'
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 17:31:58

resident писал(а):
KenDari писал(а):procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);


А у вас и названия картинок разные?
Т.е. в кнопку Lv1 должно закачатся изображение '1.png', в кнопку Lv2 изображение '2.png'?
Сколько их всего? Сотня, больше?


Да, я писал в начале темы
KenDari писал(а):TForm1.LviMouseDown
Но вот здесь тоже должен прогоняться цикл
У меня как бы кнопки - изображения с названиями Lv1, Lv2, Lv3...


Их всего 10, но если писать на каждую, получается очень много текста
Они меняют изображения при наведении на них мышкой, отпускании мышки и щелчке
И того уже 3*10=30 процедур
Плюс и в друих местах у меня будет похожая проблема
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 17:38:27

KenDari писал(а):Они меняют изображения при наведении на них мышкой, отпускании мышки и щелчке

Вы не поняли моего вопроса, отличаются ли по сути кнопки между собой?
Т.е. при наведении, к примеру, на 1-ю или 2-ю или еще какую кнопку мышкой изображение грузится в них одинаковое?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 17:43:12

resident писал(а):Вы не поняли моего вопроса, отличаются ли по сути кнопки между собой?
Т.е. при наведении, к примеру, на 1-ю или 2-ю или еще какую кнопку мышкой изображение грузится в них одинаковое?


Да, но оно отличается опять же одной цифрой
Для кнопки Lv1 изображение ур1.png, для кнопки Lv2 изображение ур2.png, для кнопки Lv3 изображение ур3.png...
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 17:47:59

KenDari писал(а):Да, но оно отличается опять же одной цифрой
Для кнопки Lv1 изображение ур1.png, для кнопки Lv2 изображение ур2.png, для кнопки Lv3 изображение ур3.png...

Ок, прикрепите изображения к посту. Тут вроде все просто, только не на чем проверить.
з.ы. Для каждой кнопки одно изображение? Или три (при наведении на них мышкой, отпускании мышки и щелчке)?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 17:53:06

resident писал(а):Ок, прикрепите изображения к посту. Тут вроде все просто, только не на чем проверить.
з.ы. Для каждой кнопки одно изображение? Или три (при наведении на них мышкой, отпускании мышки и щелчке)?


Три изображенияИзображение
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение resident » 25.03.2016 18:19:25

Может заархивируете их? Что-то я трех не вижу.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Цикл For

Сообщение KenDari » 25.03.2016 18:28:58

resident писал(а):Может заархивируете их? Что-то я трех не вижу.

Кого именно? Изображения кнопки?
Третье - имитация нажатия
Изображение
Изображение
Изображение
KenDari
новенький
 
Сообщения: 12
Зарегистрирован: 25.03.2016 16:18:09

Re: Цикл For

Сообщение Снег Север » 25.03.2016 18:40:35

я делал бы так:
1) каждой кнопке назначил бы значение свойству Tag от 1 до 10.
2) всем кнопкам назначил бы один и тот же обработчик.
3) код обработчика:
Код: Выделить всё
procedure TForm1.LviMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
        with (Sender as {тут пишите тип вашей кнопки}) do
        begin
                Picture.LoadFromFile('yp'+IntToStr(Tag)+'.png');       
        end;
end;
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru