Підміна імені

Є питання! Припустимо є дві мітки label1 і label2 Завдання таке необхідно поміняти імена цим міткам тобто. label1 присвоїти ім'я label2 а label2 присвоїти ім'я label1.

Є якісь ідеї з цього приводу?

це дуже складно)

навряд чи в тебе вийде зробити так:

var s1, s2: string;

. s1:= label1.Name; s2:= label2.Name; label1.Name := ""; label2.Name := ""; label1.Name: = s2; label2.Name: = s1;

а в тебе самого зовсім жодної?

А ти спробуй цей приклад, він не працює. оскільки за присвоєння label1 нового імені старе видаляється тобто. не буде імені label1

Порада: Буд алгоритм без зміни імен.

> цей приклад не працює. > оскільки при присвоєнні label1 нового імені старе видаляється > тобто. не буде імені label1

Ти не плутай св-во об'єкта "Name" з ім'ям програмного ідентифікатора!

Цікаво, навіщо таке знадобилося?

спробував - не працює

Специфікація кнопки керування як відповідь в коді.

property Name: TComponentName;

Використовуйте Name property to assign a new name to control or to find out what the name of the control is.

Залежно від того, IDE assigns sequential names базуються на типу контролю, так як "Button1", "Button2", і so on. Зміна є більше more meaningful names that make the application’s code more readable. The Name повинен бути valid Object Pascal identifier.

Якщо control's Caption не має жодного зміни, Caption is changed to match a new control name.

Warning:Зміна control names only at design time.

var lb: TLabel; nm: string; begin lb:=Label1; nm:=lb.Name; Label1:=Label2; Label2:=lb; Label2:=Label1.Name; Label1.Name:=nm; end;

А ти їм координати поміняй. Ефект приблизно той самий.

2Digitman: Дякую за критику – помилка зовсім в іншому місці у мене вчора була.

Label2:=Label1.Name; - це нонсенс

А якщо вже Label2.Name:=Label1.Name; то такий фокус не прокотить

Дивно, навіщо це потрібне.

>А якщо >Label2.Name:=Label1.Name; >то такий фокус не прокотить - якщо. а фокус прокотить, у мене прокочував, правда не в такому химерному варіанті, я динамічно створеній компоненті ім'я надавав. З.И. Правда потрібно це, тільки якщо RX Lib – FormStorage юзати. У моєму конкретному випадку це було потрібно для зміни мови інтерфейсу на льоту, з використанням RTTI (для автоматичної зміни Caption-ів по всіх компонентах) і мовних файлів у форматі INI.

> а фокус прокотить, у мене прокочував, правда не в такому химерному > варіанті, я динамічно створеній компоненті ім'я надавав.

У межах одного і того ж Owner"а ім'я компонента д.б. унікальним ! При динамічній спробі конструювання компонента його св-во Name ініціалізується в "", і це не суперечить вимогі унікальності, тим більше якщо Owner = nil. Але як тільки слідом за конструюванням ти спробуєш змінити Name на "SomeName" і в цей момент Owner <&nil вже має хоча б один доч.компонент з ім'ям "SomeName", то виняток по неунікальності імені компонента тобі гарантовано.

ну тоді: 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; - за вихідцями ніяких перешкод не знайшов, треба перевіритинасправді, але напередодні китайського нового року – у брухт.

Я так зрозумів йому в якийсь час необхідно працювати з 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;

Label1.Name:=""; .. Label1.Name:=nm1; // Тут ти 100%-но зробиш AV ! Бо Label1 вже = nil!

Так має спрацювати (але не перевіряв) 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;

якщо треба поміняти лише ім'я, то: 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%