Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизПодмена имени Найти похожие ветки
← →
Areon (2003-01-31 08:22) [0]Есть вопросик!
Допустим имеется две метки label1 и label2
Задача такая необходимо поменять имена этим меткам
т.е.
label1 присвоить имя label2
а label2 присвоить имя label1.
Есть какие нибудь идеи по этому поводу?
← →
Digitman (2003-01-31 08:31) [1]это очень сложно)
вряд ли у тебя получится сделать так :
var
s1, s2: string;
...
s1:= label1.Name;
s2:= label2.Name;
label1.Name := "";
label2.Name := "";
label1.Name := s2;
label2.Name := s1;
← →
bis (2003-01-31 08:32) [2]а у тебя самого совсем ни одной?
← →
Areons (2003-01-31 09:17) [3]А ты попробуй этот пример он не работает.
так как при присвоении label1 нового имени старое удаляется т.е. небудет имени label1
← →
Спрашивающий (2003-01-31 09:35) [4]Совет:
Строй алгоритм без смены имен.
← →
Digitman (2003-01-31 09:39) [5]
> этот пример он не работает.
> так как при присвоении label1 нового имени старое удаляется
> т.е. небудет имени label1
Чушь какая)
Ты не путай св-во объекта "Name" с именем программного идентификатора !
← →
Archon Kazansky (2003-01-31 10:44) [6]Интересно, зачем такое понадобилось?
← →
mrcat (2003-01-31 10:54) [7]Digitman © (31.01.03 08:31)
...
вряд ли у тебя получится сделать так
...
попробовал - не работает
← →
Digitman (2003-01-31 12:22) [8]Specifies the name of the control as referenced in code.
property Name: TComponentName;
Description
Use the Name property to assign a new name to the control or to find out what the name of the control is.
By default, the IDE assigns sequential names based on the type of the control, such as "Button1", "Button2", and so on. Change these to more meaningful names that make the application’s code more readable. The Name must be a valid Object Pascal identifier.
If the control’s Caption has not already been modified, Caption is changed to match a new control name.
Warning: Change control names only at design time.
← →
han_malign (2003-01-31 12:28) [9]var lb: TLabel;
nm: string;
begin
lb:=Label1;
nm:=lb.Name;
Label1:=Label2;
Label2:=lb;
Label2:=Label1.Name;
Label1.Name:=nm;
end;
← →
REA (2003-01-31 12:32) [10]А ты им координаты поменяй. Эффект примерно тот же.
2Digitman: Спасибо за критику - ошибка совсем в другом месте у меня вчера была.
← →
Digitman (2003-01-31 12:36) [11]
> han_malign
Label2:=Label1.Name; - это нонсенс
А уж если
Label2.Name:=Label1.Name;
то такой фокус не прокатит
← →
Digitman (2003-01-31 12:37) [12]
> REA
Да не за фто)
← →
D (2003-01-31 12:45) [13]Странно, зачем это нужно?..
procedure TForm1.BitBtn1Click(Sender: TObject);
var name1,name2:string; P:^TLabel;
begin
name1:=Label1.Name;
name2:=Label2.Name;
New(p);
P^:=Label1; // Запоминаем адрес, чтоб потом было к чему
//обращаться
Label1.Name:="promezutochnoeImja";
label2.Name:=name1;
P^.Name:=name2;
end;
← →
han_malign (2003-01-31 12:56) [14]>А уж если
>Label2.Name:=Label1.Name;
>то такой фокус не прокатит
- если..., а фокус прокатит, у меня прокатывал, правда не в таком извратном варианте, я динамически созданной компоненте имя присваивал.
З.Ы. Правда нужно это, только если RX Lib - FormStorage юзать... В моем конкретном случае, это было нужно для смены языка интерфейса на лету, с использованием RTTI(для автоматической смены Caption-ов по всем компонентам) и языковых файлов в формате INI...
← →
Digitman (2003-01-31 13:31) [15]
> а фокус прокатит, у меня прокатывал, правда не в таком извратном
> варианте, я динамически созданной компоненте имя присваивал.
В пределах одного и того же Owner"а имя компонента д.б. уникальным ! При динамической попытке конструирования компонента его св-во Name инициализируется в "", и это не противоречит требованию уникальности, тем более если Owner = nil. Но как только следом за конструированием ты попытаешься изменить Name на "SomeName" и в этот момент Owner <> nil уже имеет хотя бы один доч.компонент с именем "SomeName", то исключение по неуникальности имени компонента тебе гарантировано.
← →
han_malign (2003-01-31 13:54) [16]ну тады:
var lb: TLabel;
nm1,nm2: string;
begin
lb:=Label1;
nm1:=Label1.Name;
nm2:=Label2.Name;
Label1.Name:="";
Label1:=Label2;
Label2:=lb;
Label1.Name:=nm1;
Label2.Name:=nm2;
end;
- по исходникам никаких препятствий не нашел, надо-бы проверить на деле, но в преддверии китайского нового года - в лом...
← →
Darkwin (2003-01-31 13:58) [17]Я так понял ему в какое то время необходимо работать с Label1 так ка с Label2 и наоборот. Ето очень просто делается:
procedure TForm1.Button2Click(Sender: TObject);
var
p1,p2:pointer;
begin
ShowMessage(Label1.Caption+ Label2.Caption);
p1:=Label1;
p2:=Label2;
Label1:=p2;
Label2:=p1;
ShowMessage(Label1.Caption+ Label2.Caption);
end;
← →
Digitman (2003-01-31 14:33) [18]
> han_malign
Label1.Name:="";
..
Label1.Name:=nm1; // здесь ты 100%-но схлопочешь AV ! Ибо Label1 уже = nil !
← →
eheyler (2003-01-31 14:41) [19]Так должно сработать (но не проверял)
var L1, L2: TLabel;
N1, N2: string;
L1 := Label1;
L2 := Label2;
N1 := L1.Name;
N2 := L2.Name;
L2.Name := "";
L1.Name := N2;
L2.Name := N1;
Вся проблема в ф-и SetReference, вызываемой при изменении имени:
procedure TComponent.SetReference(Enable: Boolean);
var
Field: ^TComponent;
begin
if FOwner <> nil then
begin
Field := FOwner.FieldAddress(FName);
if Field <> nil then
if Enable then Field^ := Self else Field^ := nil;
end;
end;
← →
Darkwin (2003-01-31 15:29) [20]если надо поменять только имя, то:
procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2:TComponentName;
p1,p2:Pointer;
begin
ShowMessage(Label1.Name+Label2.Name);
p1:=@(Label1.Name);
p2:=@(Label2.Name);
s1:=Label1.Name;
s2:=Label2.Name;
string(p1^):=Label1.Name+Label2.Name;
string(p2^):=s1;
string(p1^):=s2;
ShowMessage(Label1.Name+Label2.Name);
end;
работает на все 100%
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c