2 / 2 / 0
Регистрация: 22.05.2013
Сообщений: 136
1

Не создает кнопки в рантайм

09.11.2014, 21:06. Показов 1202. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите с лабой) мне нужно что бы на 1 копку создавалось окно где все элементы уже находились на нем (сделал и все норм пашет), а второе окно где они создавались бы в ручную ) и вот он почему то не хочет создавать ничего кроме пустого окна ! хелп плиз


RuntimeForm
Кликните здесь для просмотра всего текста
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
45
46
unit Unit3;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Unit4,
  ExtCtrls, StdCtrls;
type
  { TRuntimeForm }
  TRunTime = class(TForm)
 
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  private
  Manager: TComponentManager;
  public
  end;
 
var
  RunTime: TRunTime;
 
implementation
 
{$R *.lfm}
 
 
 
{ TRunTime }
 
procedure TRunTime.FormCreate(Sender: TObject);
begin
     Manager:=TComponentManager.Create(RunTime);
     Manager.SetF();
 
end;
 
procedure TRunTime.FormDestroy(Sender: TObject);
begin
  Manager.Free;
end;
 
 
 
end.

ComponentManager
Кликните здесь для просмотра всего текста
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
unit Unit4;
 
{$mode objfpc}{$H+}
 
 
interface
 
uses
  SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls,ExtCtrls;
 
type
  TComponentManager = class  (TForm)
 
  private
    Form: TForm;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Conf: TIniFile;
  public
    constructor Create(fform: TForm);
    procedure ShowPic(Sender: TObject);
    procedure CloseP(Sender: TObject);
   procedure SetF();
    destructor Destroy;
    { Public declarations }
  end;
 
 
implementation
 
uses Unit3;
{ TComponentManager }
constructor TComponentManager.Create(fform: Tform);
  begin
    Form:=fform;
    Button1:=TButton.Create(fform);
    Button2:=TButton.Create(fform);
    Label1:=TLabel.Create(fform);
    Image1:=TImage.Create(fform);
  end;
 
 
procedure TComponentManager.SetF();
begin
  Conf:=TiniFile.Create(extractfilepath(Application.ExeName)+'lb2.ini');
  Label1.Parent:=RunTime;
  Label1.Caption:=Conf.ReadString('LABELS', 'Label1', 'fail');
  Label1.Top:=16;
  Label1.Left:=200;
  Label1.Width:=119;
 
  Button1.Parent:=RunTime;
  Button1.Caption:=Conf.ReadString('BUTTONS', 'Button1', 'fail');
  Button1.Top:=48;
  Button1.Left:=120;
  Button1.Width:=75;
 
  Button1.OnClick:=@ShowPic;
 
 
  Button2.Parent:=RunTime;
  Button2.Caption:=Conf.ReadString('BUTTONS', 'Button2', 'fail');
  Button2.Top:=48;
  Button2.Left:=232;
  Button2.Width:=75;
 
  Button2.OnClick:=@CloseP;
 
  Image1.Parent:=RunTime;
  Image1.Height:=250;
  Image1.Top:=88;
  Image1.Left:=16;
  Image1.Width:=384;
  Image1.Picture.LoadFromFile(Conf.ReadString('IMAGES', 'Image1', 'fail'));
  Image1.Visible:=False;
end;
 
procedure TComponentManager.ShowPic(Sender: TObject);
begin
     Image1.Visible:=True;
end;
procedure TComponentManager.CloseP(Sender: TObject);
begin
     Image1.Visible:=False;
end;
destructor TComponentManager.Destroy;
begin
  Button1.Free;
  Button2.Free;
  Label1.Free;
  Image1.Free;
  Button1:=nil;
  Button2:=nil;
  Label1:=nil;
  Image1:=nil;
end;
 
end.


могу скинуть архив с проэктом если вдруг кто сможет помочь но из этого кода нефига не понял
Миниатюры
Не создает кнопки в рантайм  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 21:06
Ответы с готовыми решениями:

Проблема со скриптом, который создает кнопки
У меня проблема со скриптом.Вот что он должен делать: В текстовом файле(catalognames.txt)...

Нужно сделать функцию, которая стирает все имеющиеся кнопки и создает новую матрицу с произвольными размерами.
Я создаю матрицу из кнопок. for i in range(self.size): for j in...

Визуализация компонентов в рантайм
Всем привет. Работаю с визуализацией информации. Внизу вложил изображение схемы. Собственно -...

Рантайм егог на потоке
type TCaluculateThread=class(TThread) end; var...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
09.11.2014, 21:10 2
Присоединяй. Только ini-файл не забудь включить в проект. А EXE-шник можешь убрать, незачем мегабайты просто так перекачивать...
0
2 / 2 / 0
Регистрация: 22.05.2013
Сообщений: 136
09.11.2014, 21:13  [ТС] 3
вот
Вложения
Тип файла: rar laba2.rar (623.2 Кб, 16 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
09.11.2014, 21:37 4
Лучший ответ Сообщение было отмечено kyzavr как решение

Решение

Pascal
1
2
3
4
5
procedure TRunTime.FormCreate(Sender: TObject);
begin
     Manager:=TComponentManager.Create(Self); // Раз
     Manager.SetF();
end;
Pascal
1
2
3
4
5
6
7
8
procedure TComponentManager.SetF();
begin
  Conf:=TiniFile.Create(extractfilepath(Application.ExeName)+'lb2.ini');
  Label1.Parent:=Form; // Два, и так далее, всем Parent-ам...
  Label1.Caption:=Conf.ReadString('LABELS', 'Label1', 'fail');
  Label1.Top:=16;
  Label1.Left:=200;
  Label1.Width:=119;
Причина понятна, или объяснить?
1
2 / 2 / 0
Регистрация: 22.05.2013
Сообщений: 136
09.11.2014, 22:29  [ТС] 5
Спасибо)) да понял)))

Добавлено через 45 минут
А не подскажешь как удалить кнопку? допустим после того как она нажалась ее удалить? как создать я понял) а вот как удалить чет не очень))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
09.11.2014, 23:30 6
Лучший ответ Сообщение было отмечено kyzavr как решение

Решение

Поскольку удалить кнопку изнутри ее же обработчика OnClick нельзя - придется задействовать механизм отсылки сообщений. В класс TRunTime добавляешь:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  TRunTime = class(TForm)
  // ...
  private
    Manager: TComponentManager;
  public
    procedure MyHandler(var Message: TMessage); message WM_USER; // вот такой метод
  end;
 
// вот с такой реализацией:
procedure TRunTime.MyHandler(var Message: TMessage);
begin
  TButton(Message.lParam).Free;
end;
, а в обработчике ShowPic - отсылаешь сообщение форме, чтобы она уничтожила кнопку:
Pascal
1
2
3
4
5
procedure TComponentManager.ShowPic(Sender: TObject);
begin
     Image1.Visible:=True;
     PostMessage(Form.Handle, WM_USER, 0, LongInt(Sender));
end;
Не забудь добавить в обоих модулях в список Uses еще и модуль Windows...
1
2 / 2 / 0
Регистрация: 22.05.2013
Сообщений: 136
09.11.2014, 23:57  [ТС] 7
Спасибо) но как я понял это для одноразового использования)? потому что если заново зайти и при попытке отобразить ее получается ошибка маленькая)) Я так понял кнопку он удаляет с концами? и типо опять не может создать ее и вылетает эта ошибка))
Миниатюры
Не создает кнопки в рантайм  
Вложения
Тип файла: rar laba2.rar (620.7 Кб, 9 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
10.11.2014, 00:29 8
Лучший ответ Сообщение было отмечено kyzavr как решение

Решение

Цитата Сообщение от kyzavr Посмотреть сообщение
потому что если заново зайти
Если заново создать форму в рантайме, то все будет прекрасно работать, проверено.

Добавлено через 7 минут
А для того, чтобы твой код не вылетал - достаточно просто перенести создание кнопки из TComponentManager.Create в ShowPic
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TComponentManager.ShowPic(Sender: TObject);
begin
  Button1.Left:=8;
  Form.Top :=  10;
  Form.Left := 10;
  Form.ClientHeight:=850;
  Form.ClientWidth:=800;
  Image1.Visible:=True;
  Label1.Left:=400;
 
  Button2:=TButton.Create(form); // <--- !!!
 
  Button2.Parent:=Form;
  Button2.Caption:=Conf.ReadString('BUTTONS', 'Button2', 'fail');
  Button2.Top:=24;
  Button2.Left:=450;
  Button1.Left:=390;
  Button2.Width:=56;
  Button2.Height :=31;
  Button2.OnClick:=@CloseP;
  Image1.Visible:=True;
end;
, а в конструкторе - закомментируй аналогичную строку... Тогда можно будет многократно жать "Yes" и "Close", пока не надоест
1
2 / 2 / 0
Регистрация: 22.05.2013
Сообщений: 136
10.11.2014, 00:47  [ТС] 9
Спасибо большое )))
0
10.11.2014, 00:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2014, 00:47
Помогаю со студенческими работами здесь

Рантайм компиляция и выполнение C# кода
Добрых времени суток. Собственно возможно ли это сделать в Unity? Допустим есть игровой объект, и...

ошибка рантайм эррор 6 оверфлоу
здравствуйте, есть макрос в ворде выделяющий по определенному алгоритму созвучные слова. в...

SQLite Entity Framework 6. Не находит провайдер. Не создаёт таблицу, если даже создаёт БД
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;configuration&gt; &lt;configSections&gt; &lt;!-- For...

Ошибка рантайм при обращении к пустой строке
Привет всем. Не могу понять, что за странная рантайм ошибка. Есть строка, и эту строку я разбираю...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru