Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 5

Как динамично создать объекты\элементы на форме? Сохранить и загрузить их состояние после запука приложения?

17.10.2023, 07:50. Показов 749. Ответов 14

Студворк — интернет-сервис помощи студентам
Доброго времени уважаемые форумчане. Поставил себе задачу сделать приложение. Выглядеть должно примерно так: на главной форме план-схема этажа здания, на ней расположены иконки компьютеров и принтеров, в соответствии с их реальным расположением в помещении. Это основная тема, остальное пока вторично. Так вот сама задача: нужно реализовать инструмент пользователя позволяющий создавать и размещать иконки на плане этажа, их расположение должно сохраняться при закрытии формы\приложения и восстановляться при запуске программы.

Начал разбираться, думаю использовать этот код для создания иконок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  SetLength(MyButtons, StrToInt(Edit1.Text)); // задаёшь разиер массива (кол-во кнопок)
  for I := 0 to Length(MyButtons) - 1 do
  begin  // в цикле создаёшь кнопки и сохраняешь указатели на них в массиве
    MyButtons[i] := TButton.Create(Form1);
    // здесь делаешь с созданной кнопкой что нужно
    MyButtons[i].Parent := Form1;
    // и т. д.
  end;
end;
Надеюсь, понятно донес мысль. Поделитесь своим мнением пожалуйста: как такое в принципе реализуется? Пните на книги или статьи, буду рад любой помощи.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2023, 07:50
Ответы с готовыми решениями:

Как сохранить и загрузить объекты в WPF?
Есть программа, пустая. Хочу при нажатии "кнопки" открывать (внешний)файл с настройками. Который бы содержал информацию об объектах и их...

Как сохранить состояние приложения и восстановить его при следующем запуске
Здравствуйте! Я использую <NSCoding>, реализую необходимые методы, сохраняю в файл типа plist, в application...

Сохранить состояние в реестр, считать и загрузить combobox items
Надо чтобы при следующих запусках программы, combobox1 сохранял то что было выбрано из списка. И подгружал его при запуске формы. ...

14
Модератор
 Аватар для D1973
9905 / 6442 / 2455
Регистрация: 21.01.2014
Сообщений: 27,346
Записей в блоге: 3
17.10.2023, 09:19
Цитата Сообщение от Hermanone Посмотреть сообщение
код для создания иконок
Цитата Сообщение от Hermanone Посмотреть сообщение
MyButtons[i] := TButton.Create(Form1);
??? Казалось бы, при чем тут "иконки"?

По сабжу:
обыкновенный ini-файл вполне себе подходит для данной цели. Не нравится INI - используйте XML, JSON, базу данных, файл своего собственного формата. Основная идея в том чтобы записывать координаты объекта во внешний файл при добавлении этого объекта на форму и считывать этот файл, создавая объекты в требуемых местах при старте.

Добавлено через 3 минуты
Цитата Сообщение от Hermanone Посмотреть сообщение
Пните на книги или статьи
работа с текстовыми и INI-файлами описана в любом учебнике.
работа с другими средствами требует знания мат.части и вот так, с кондачка, не решается, но если будет желание, то нагуглите учебники самостоятельно.
1
Злостный нарушитель
 Аватар для Verevkin
10231 / 5660 / 1260
Регистрация: 12.03.2015
Сообщений: 26,228
17.10.2023, 09:19
Цитата Сообщение от Hermanone Посмотреть сообщение
Delphi
1
SetLength(MyButtons, StrToInt(Edit1.Text)); // задаёшь разиер массива (кол-во кнопок)
Не делай этого: пожалеешь.
Используй списки.
Про кнопки вместо изображений сказали выше, повторять не буду.
0
0 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 5
17.10.2023, 10:55  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
??? Казалось бы, при чем тут "иконки"?
Сделать кнопку квадратной и налепить на нее маленькую картинку, типо превратив её в значок. В Delphi есть нужный элемент на самом деле, и кнопку мучать не нужно. Давно не запускал редактор, трудно слова подобрать верные)

Но суть я понял. При закрытии приложения\формы редактируется некий ini-файл, в который заносятся описание всех нужных элементов формы. И при запуске соответственно, приложение руководствуясь этим ini "расставляет" все элементы обратно по местам. Спасибо за подсказку, этот механизм я практиковал с содержимым MEMO полей.

Цитата Сообщение от Verevkin Посмотреть сообщение
Используй списки.
На данном этапе меня интересует, как реализовать следующее: пользователь наводит курсор мыши на определенную область поля формы, щелкает левой клавишей, и там под курсором что-то создается (для примера кнопка). Переместить заранее созданный элемент под курсор я смог, но мне нужно именно программное создание элемента. Вопрос в том, как сделать новый элемент на форме? Не сделать типо видимым до этого скрытую кнопку, и переместить её под курсор, мол готово. Ну конечно, это на крайний случай: налепить 200+ кнопок, стащить их в угол, visible=false на них, и подбрасывать их под нажатый пользователем курсор мыши каждый раз, мол оба - создалась новая... Хотя пока писал, подумал в принципе неплохая идея.
300 кнопок с иконками PC, 100 c иконками принтеров - когда для рабочих нужд кнопок не будет хватать, просто выпущу обновление для проги отсыпав еще сотню другую кнопок.

Я это к тому, что в говнокод я умею, хотелось-бы что-то более практичное.
0
Злостный нарушитель
 Аватар для Verevkin
10231 / 5660 / 1260
Регистрация: 12.03.2015
Сообщений: 26,228
17.10.2023, 11:01
Цитата Сообщение от Hermanone Посмотреть сообщение
Я это к тому, что в говнокод я умею
Это не есть полезное умение.
Цитата Сообщение от Hermanone Посмотреть сообщение
хотелось-бы что-то более практичное.
Поэтому я про списки написал.
Цитата Сообщение от Hermanone Посмотреть сообщение
мне нужно именно программное создание элемента.
И в чём проблема? Что именно тебе мешает?
1
0 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 5
17.10.2023, 11:07  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
И в чём проблема? Что именно тебе мешает?
А как будет писаться код? Использовать пример с массивом, что я нашел?
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,331
17.10.2023, 11:08
Лучший ответ Сообщение было отмечено Hermanone как решение

Решение

Цитата Сообщение от Hermanone Посмотреть сообщение
как сделать новый элемент на форме?
Легко. При нажатии на Button1 создаётся кнопка и ей назначается обработчик щелчка. В обработчике выводится название этой кнопки в Label.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure btnClick(Sender: TObject);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btnClick(Sender: TObject);
begin
  Label1.Caption := TButton(Sender).Caption;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton.Create(Form1) do begin
    Parent := Form1;
    Caption := IntToStr(Random(1000));
    Left := Random(Form1.ClientWidth - Width);
    Top := Random(Form1.ClientHeight - Height - 40) + 40;
    OnClick := btnClick;
  end;
end;
 
end.
1
0 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 5
17.10.2023, 11:15  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Легко. При нажатии на Button1 создаётся кнопка и ей назначается обработчик щелчка. В обработчике выводится название этой кнопки в Label.
Госпои, вот я болван. TButton.Create(Form1) - этож основы, капец.

Господа, спасибо за помощь! Пойду ваять.
0
Злостный нарушитель
 Аватар для Verevkin
10231 / 5660 / 1260
Регистрация: 12.03.2015
Сообщений: 26,228
17.10.2023, 11:22
Цитата Сообщение от Hermanone Посмотреть сообщение
Использовать пример с массивом, что я нашел?
Не надо массив, используй список, блин!
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,331
17.10.2023, 12:54
Цитата Сообщение от Hermanone Посмотреть сообщение
TButton.Create(Form1) - этож основы, капец.
Но ведь, ты тоже самое написал:
Цитата Сообщение от Hermanone Посмотреть сообщение
Delphi
1
    MyButtons[i] := TButton.Create(Form1);
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
17.10.2023, 13:19
Цитата Сообщение от Verevkin Посмотреть сообщение
Не надо массив, используй список, блин!
Ну вообще тут и списки и массивы не нужны. Сама форма уже является контейнером/списком и нет необходимости заводить еще один.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,331
17.10.2023, 13:28
Пытливый, смотря для чего. Для задачи, описанной ТС, лучше использовать отдельный список, в котором находятся именно нужные компоненты.
1
 Аватар для Beltar
802 / 418 / 36
Регистрация: 05.05.2022
Сообщений: 2,894
17.10.2023, 13:44
Я делал как-то схему цеха из набора TImage и пары TLabel сверху и снизу. Создал такой компонент на основе TImage и даже не добавлял его в палитру. Там ничего сложного нет, может быть несколько муторно.

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
30
31
32
33
34
35
36
procedure TfmMain.CreatePlanPicture(Id, Left, Top: Integer);//Id и координаты
var Img:TLabeledImage;
    BMP:TBitmap;
begin
BMP:=TBitMap.Create;
{Создание обычное, создается компонент с владельцем и родителем.
У тебя это уже есть, еще в конструкторе ставится DragMode:=dmAutomatic;
т. у. у меня эти штуки можно мышкой таскать, как Drag and drop делается
в любом учебнике есть}
Img:=TLabeledImage.Create(sbPLan,sbPlan,Left,Top,32,32);
Img.ObjId:=Id;//Присваивается Id
{Присваиваются событийные процедуры, у меня это onClick
и onMouseDown}
Img.OnClick:=ImgClick;
Img.OnMouseDown:=ImgMouseDown;
DM.ilPlantImages.GetBitmap(0,BMP);//картинка
Img.Picture.Bitmap.Assign(BMP);
Img.Label1Text:='0';
Img.Label2Text:=Img.ObjId.ToString;
Img.PopupMenu:=pmObjPict;//Попап меню.
BMP.Free;
end;
 
constructor TLabeledImage.Create(AOwner, AParent: TWinControl;
  ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited Create(AOwner) ;
Parent:=AParent;
DragMode:=dmAutomatic;
Left:=ALeft;
Top:=ATop;
Width:=AWidth;
Height:=AHeight;
//Дальше таким же макаром создаются и выравниваются 2 TLabel
 
end;
Сохранение я сделал в текстовый файл. Не ини, но похоже, т. к. у меня всего 3 целых числа: координаты и Id.
0
0 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 5
18.10.2023, 04:54  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Но ведь, ты тоже самое написал:
Да я его просто закопипастил, бегло пробежал и не успел использовать.

Beltar, хотел посмотреть как работает пример, но не понял как работать с TLabeledImage.
Это ведь компонент? Как его объявлять или я что-то не понял?
0
 Аватар для Beltar
802 / 418 / 36
Регистрация: 05.05.2022
Сообщений: 2,894
18.10.2023, 10:21
Это мой компонент. Я же написал.

TImage и пары TLabel сверху и снизу. Создал такой компонент на основе TImage
Ну возьми TImage стандартный. Вместо ObjId можно Tag использовать.

Впрочем, мне не жалко. Потому что ты можешь захотеть подписи.
Вложения
Тип файла: rar LabeledPictureBox.rar (1,011 байт, 3 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2023, 10:21
Помогаю со студенческими работами здесь

Как сохранить состояние Service после перезагрузки телефона?
Как сохранить состояние Service после перезагрузки телефона??? т.е мне нужно чтоб сервис начал работать не сначала, а на том месте где...

Как сохранить состояние кнопки (цвет) после закрытия программы?
на форме накидано несколько кнопок, при нажатии на кнопку она выделяется цветом, как сделать так, чтобы при следующем запуске программы...

Как сохранить состояние TreeView после открытия закрытия формы?
На форме расположено "TreeView". Node_1 -- Node_1_1 -- Node_1_2 Node_2 -- Node_2_1 -- Node_2_2 Сеанс 1 Открываем...

Как сохранить состояние формы и все её элементы созданнные программно?
Всем привет, подскажите, пожалуйста, возможно ли как то сохранить состояние формы в Windows Forms. У меня есть кнопка, после нажатия...

Как сохранить динамические объекты после завершения программы
Всем доброго времени суток. У меня программе пользователь, например, может добавить Label и задать его свойства, но как сделать, чтобы он...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru