Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

Как правильно переименовать компонент в runtime ?   Найти похожие ветки 

 
alextov   (2002-10-18 11:32) [0]

Нужно скопировать кнопку через Clipboard и работать с обеими кнопками. При следующем коде возникает Access Violation :
Var OldButton: TButton;
Begin
Clipboard.SetComponent(Button1);//копируем Button1 в клиппбоард
Button1.Name := "OldButton"; //
Clipboard.GetComponent(Self, GroupBox1); //вставляем Button1 из клиппбоарда
oldButton.Caption:="ok"; //--------Access Violation
End;
Может кто подскажет что изменить надо....(менять ДНК не предлагать :))))


 
han_malign ©   (2002-10-18 11:56) [1]

из Clipboard вставляем анонимный компонент, потом вызываем property у неинициализировнного объекта oldButton - и это должно работать???
Может всетаки
oldButton:=Clipboard.GetComponent(Self, GroupBox1); //вставляем Button1 из клиппбоарда
З.Ы. Менять ДНК тогда всем придется, ты бы видел какие ляпы опытные программисты допускают(чем элементарнее ошибка, тем сложнее ее найти), правда не в таком объеме кода, а побольше(на пару порядков).


 
Kibitzer ©   (2002-10-18 12:01) [2]

Шутник ты однако :-)

procedure TForm1.Button1Click(Sender: TObject);
var
OldButton: TButton;
begin
Clipboard.SetComponent(Button1);
Button1.Name := "OldButton";
OldButton := Button1;
Button1 := Clipboard.GetComponent(Self, GroupBox1) as TButton;
Button1.Caption:="ok";
end;


 
han_malign ©   (2002-10-18 12:16) [3]

и не проще ли
OldButton:=TButton.Create(GroupBox1);//или к Form1- что по умолчанию делается(Create(nil))
OldButton.Assign(Button1);
OldButton.Name:="OldButton";
OldButton.Parent:=GroupBox1;
OldButton.Caption:="ok";



 
alextov   (2002-10-18 12:48) [4]

Вполне логично. И довольно просто. Что называется "за деревьями леса не увидел".
Всем спасибо.


 
Le Taon   (2002-10-18 14:28) [5]

han_malign ©
К сожалению, в компонентах Assign не реализован.

А зачем, кстати, изменять Имя компонента? - зачем оно нужно?
Дело в том, что имя - не простое свойство, а автоматически создаваемые поля формы с этими именами - не простые переменные.
Они связаны и в рантайме через метод SetReference + RTTI.

Пример:

TForm1 = class(TForm)
Button1: TButton;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Name := "Test";
Button1.Caption := "Ok"; // - здесь уже Button1 = nil;
end;

PS я советую не трогать имена в рантайме, они никакой смысловой нагрузки там уже не несут.



Страницы: 1 вся ветка

Текущий архив: 2002.10.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
3-92322
battar
2002-09-20 22:45
2002.10.28
dxdbgrid - выделенный столбец


14-92702
Wonder
2002-10-08 12:33
2002.10.28
Нервным, с больным сердцем и детям не смотреть!!!


14-92721
NewI
2002-10-08 11:37
2002.10.28
Кто-нибудь знает есть ли Service Pack для Delphi_6


3-92377
Cossys
2002-10-04 17:37
2002.10.28
Динамически добавлять поле к запросу


1-92567
blackweber
2002-10-16 19:16
2002.10.28
1с совсем разжижает мозги, блин