Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
IrishaJ
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 15
1

Работа с динамическими компонентами

03.07.2016, 22:40. Просмотров 286. Ответов 7
Метки нет (Все метки)

Здравствуйте. Нарисовалась такая проблема. На панели создаются динамические компоненты Image. По нажатии правой кнопки на компоненте, он удаляется. Удаляется любой, не только последний созданный. По панели ведется подстчет дохода - компонент создался, доходность панели увеличилась, компонент убрали, доходность должна уменьшиться. Тут и загвоздка. Доходность уменьшается только при удалении последнего созданного компонента, при удалении остальных - компонент исчезает, доходность остается прежней. Может быть, кто подскажет, в чем тут дело?

Процедура создания компонента:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm1.Panel1DblClick(Sender: TObject);
var
    T:TPoint;
    FileName,ExeDir,ImDir:String;
  begin
    inc(k);
    Image:=TImage.Create(Self);
    with Image do
    begin
       Parent:=Panel1;
       T:=ScreenToClient(Form1.FDesignSize);
       left:=Mouse.CursorPos.X+T.X;
       Height:=round(tbl1.fieldByName('Height(mm)').AsInteger*49/150);//Panel1.Height-2;
       Width:= round(tbl1.fieldByName('Width(mm)').AsInteger*641/2000);
       top:=panel1.height-2-Height;
       Stretch:=True;
       ExeDir:=ExtractFilePath(Application.ExeName);//папка, где лежит приложение
       ImDir:=ExeDir+'IMG\';//папка с базой данных
       FileName:=tbl1.FieldByName('DirPhoto').AsString;
       Image.Picture.LoadFromFile(ImDir+FileName);
       Name:='Im'+IntToStr(k);
       OnMouseDown:=Form1.ImageMouseDown;
       OnMouseUp:=Form1.ImageMouseUp;
       OnMouseMove:=Form1.ImageMouseMove;
       OnKeyDown:=Form1.ImageKeyDown;
       d1:=d1+tbl1.FieldByName('Dohod').AsFloat;
       end;
    label1.Caption:=floatToStr(d1);
  end;
Процедура его удаления:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       begin
         if Button=mbright then
             begin
              if Image.Parent=panel1 then
               begin
                 d1:=d1-tbl1.FieldByName('Dohod').AsFloat;
                 label1.Caption:=floatToStr(d1)
               end;
              FreeAndNil(Sender);
 
             end;
 
         if button<>mbLeft then flag:=false else
             begin
                flag:=true;
                x0:=0;y0:=0;
                d1:=d1-tbl1.FieldByName('Dohod').AsFloat;
             end;
              
       end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.ImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  begin
    flag:=false;
  end;
 
Перемещения:
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  begin
    if flag and (Sender=Image)
      then Image.Left:=Image.Left+x-x0;
  end;
кстати, перемещение работает тоже только на последний созданный компонент((((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2016, 22:40
Ответы с готовыми решениями:

Работа с динамическими компонентами
Ребята, помогите. Как определить едитку на которую я нажал, как узнать ее...

Работа с динамическими компонентами
Здравствуйте. Есть несколько вопросов по работе с динамическими...

Проблемы с динамическими компонентами
Добрый день, у меня есть динамически созданные компоненты на форме, TLabel и...

Переброс переменных между динамическими компонентами
Люди помогите пожалуйста:umnik:. Мне нужно создать динамически image и затем...

Работа с динамическими массивами
Создать одномерный динамический массив произ-вольного размера. Ввести значения...

7
planetoxod
250 / 161 / 24
Регистрация: 22.08.2014
Сообщений: 1,581
Записей в блоге: 1
03.07.2016, 23:35 2
В процедуры попадает ?
0
Пытливый
1381 / 692 / 249
Регистрация: 29.05.2013
Сообщений: 3,120
03.07.2016, 23:38 3
А у вас что все панели имеют одинаковое значение дохода?
0
IrishaJ
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 15
04.07.2016, 00:02  [ТС] 4
В процедуры попадает, т.к. удаляет любой, а перемещает только последний созданный компонент.
Панели имеют разные доходности, d1,d2 и т.д. Я просто пока тестирую первую, потом сеопировать код для остальных несложно.
0
northener
пофигист широкого профиля
3427 / 2326 / 631
Регистрация: 15.07.2013
Сообщений: 13,778
04.07.2016, 00:43 5
Delphi
1
2
3
4
5
6
7
Procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       begin
         if Button=mbright then
             begin
              if TImage(Sender).Parent=panel1 then
               begin
0
IrishaJ
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 15
04.07.2016, 06:18  [ТС] 6
спасибо огромное, получилось. Может, подскажете почему с перемещением такая же беда (перемещается только последний)?
0
krapotkin
3442 / 3045 / 1051
Регистрация: 14.04.2014
Сообщений: 14,762
Записей в блоге: 15
04.07.2016, 06:20 7
в этой программе нет главного элемента - модели данных
все, что на экране происходит, должно отражать состояние модели данных,
а не заменять ее
у вас глобальные переменные Image, d1 и еще 100500 да плюс какая-то таблица БД
а еще компоненты, которые живут своей жизнью
как вы это все вместе соберете?

должен быть некий класс, хранящий все данные, которые сейчас относятся к вашей панели, и список обхектов этого класса
в форме должна быть процедура, которая по этому списку создает все нужные панели, картинки и кнопки
другая процедура заведует чтением/записью этого списка на диск или в БД
тогда взаимодействие пользователя с компонентами приведет к изменениям в модели данных, останется только вызвать сохранение и отрисовку
все будет как бы само собой...
0
IrishaJ
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 15
04.07.2016, 07:36  [ТС] 8
Несомненно, вы правы- везде должен быть порядок. Но это мое первое приложение) ... в принципе, я все собрала, все работает, за исключением, перемещения не последнего созданного объекта... будем учиться)
0
04.07.2016, 07:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 07:36

Работа с динамическими массивами
Можно ли так делать? type TMass = array of Integer; function...

Работа с динамическими объектами
Всем привет. На динамически создаваемых TabSheet-ах пытаюсь открыть...

Работа с матрицами как с динамическими массивами
Какая-то фигня. Думал, умею работать с динамическими массивами и матрицами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru