![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уникальное имя [D7, WinXP]
Viktop © (2004-11-30 10:41:00)Как создавать я знаю! А вот как задать уникальное имя - нет :cry:
Есть некий компонент (TImage) на форме с именем Pic, при нажатии на который создаётся такой же объект , но с именем Pic1, т.е. надо проверить существует ли объект с таким именем и если нет, присвоить ему имя
cae (2004-12-03 14:39:00) [1]Хорошо, тогда пиши Self.FindComponent
Посмотри в исходниках, что происходит при вызове Create(Self) и присвоении Pаrent. И потом реализацию FindComponent.
Viktop (2004-12-03 14:09:00) [2]
> Вместо TImage.Create(Self) нужно поставить TImage.Create(FramePole21)
А зачем? У меня ведь есть такая строчка
Parent := FramePole21;
и проблема в этом участке:
:= (Sender as TImage).Name;
Ind := 1;
while Parent.FindComponent(S + IntToStr(Ind)) <> nil do
Inc(Ind);
name := S + IntToStr(Ind);
cae (2004-12-03 09:07:00) [3]Вместо TImage.Create(Self) нужно поставить TImage.Create(FramePole21)
Viktop (2004-12-03 04:57:00) [4]Хотелось бы по подробнее (если можно)
procedure TMainForm.AnyImageClick(Sender: TObject);
var
S: string;
Ind: Integer;
begin
StretchHandle.Detach;
with TImage.Create(Self) do
begin
Parent := FramePole21;
Top := 100;
Left := 100;
Width := (Sender as TImage).Width;
Height := (Sender as TImage).Height;
Picture.Bitmap.Width := Width;
Picture.Bitmap.Height := Height;
Autosize := True;
Transparent := True;
Picture.Bitmap.Canvas.StretchDraw(ClientRect, (Sender as TImage).Picture.Graphic);
OnMouseDown := AnyImageMouseDown;
//Далее идёт присвоение уникального имени
S := (Sender as TImage).Name;
Ind := 1;
while Parent.FindComponent(S + IntToStr(Ind)) <> nil do
Inc(Ind);
name := S + IntToStr(Ind);
hint := name;
showhint := True;
end;
end;
Посмотри пожалуйста, что в последних строчках не так. Первый компонент (Detal1) добавляется нормально, а при попытке добавить второй (Detal2) - выдаёт сообщение: A component named Detal2 already exists
TUser (2004-12-02 10:56:00) [5]Еще есть ClassName
Anatoly Podgoretsky (2004-12-02 09:25:00) [6]Viktop (01.12.04 13:56) [9]
Не слушаешься Борланда, типы должны быть с приставкой Т, не Terminator, а ТTerminator
Экспериментатор (2004-12-02 09:20:00) [7]a какой-нибудь
TComponentType = (ctTerminator, ctConnector, ctAdadpter, ctCable и т.д.)
в свои объекты добавить не судьба?
Имхо сделай свой объект
с ComponentType : TComponentType;
а при создании
присваивай :
если коннектор, то
ComponentType:=ctConnector;
если адаптер, то
ComponentType:=ctAdadpter;
и вперед с песней.
Потом хоть запроверяйся
ComponentType подскажет что за объект перед тобой
ЮЮ (2004-12-02 04:16:00) [8]>А как я узняю, что это, например терминатор или коннектор?
if (Sender is TTerminator) then
...
else if (Sender is TConnector) then
...
где Seder: TObject
Viktop (2004-12-01 14:49:00) [9]А как я узняю, что это, например терминатор или коннектор? Тем более, что создаю я их не массово.
TUser (2004-12-01 14:34:00) [10]
> Доступ к этим объектам буду осуществлять по имени
Осуществляй доступ по индексам в массиве.
Цикл For - не нужен
Viktop (2004-12-01 14:32:00) [11]
> Конечно, цикл не нужен.
Разве этот цикл надо убирать:
for i := 0 to Parent.ComponentCount -1 do
while Parent.FindComponent(S+IntToStr(Ind)) <> nil do
Inc(Ind);
> Интересно все-таки, - нафига имена присваивать?
А там (в проге) БУДЕТ алгоритм, проверяющий правильность соединения элементов сети (терминаторы, кабели, адаптеры и пр.). Доступ к этим объектам буду осуществлять по имени.
TUser (2004-12-01 14:09:00) [12]
> А у меня имя должно быть Terminator1, а получается erminator1
Проверяй еще и вторую букву. Интересно все-таки, - нафига имена присваивать?
cae (2004-12-01 13:58:00) [13]Виноват...
Конечно, цикл не нужен.
Viktop (2004-12-01 13:56:00) [14]А у меня имя должно быть Terminator1, а получается erminator1
TUser (2004-12-01 13:52:00) [15]
> И зачем нужна эта строка: if S[1] = 'T' then delete(S,1,1);
Чтобы компонент класса TButton назывался ButtonXXX
Viktop (2004-12-01 13:43:00) [16]Проблема как раз в этом комбинировании и заключается.
Если использовать [4], то получается, но только для одного компонента (задаётся имя + цифра 1), а иногда странные имена (имя родителя + 270 (откуда 270)). И зачем нужна эта строка:if S[1] = 'T' then delete(S,1,1);
Anatoly Podgoretsky (2004-11-30 12:32:00) [17]Alexander Panov © (30.11.04 11:03) [3]
1. Красиво, но не работает в случае динамического удаления компонент
2. Не подходит в случае массового добавления компонент в цикле.
Надо комбинировать с [2]
Viktop (2004-11-30 11:48:00) [18]
> FindComponent, но обычно при динамическом создавании объектов
> присваивать им имена не требуется
Вот такой я человек! Мне это жизненно необходимо.
Остальные советы проверю попозже.
cae (2004-11-30 11:22:00) [19]
function GetNewNameComp(Parent : TWinControl ; _Class : TClass ) : String;
var
S : String ;
i,Ind : Integer ;
begin
S := _Class.ClassName ;
if S[1] = 'T' then
delete(S,1,1);
Ind := 1 ;
for i := 0 to Parent.ComponentCount -1 do
while Parent.FindComponent(S+IntToStr(Ind)) <> nil do
Inc(Ind);
result := S + IntToStr(Ind) ;
end ;
Alexander Panov (2004-11-30 11:03:00) [20]Можно это делать весьма просто:
Например,
1. 'MyComponent'+IntToStr(ComponentCount)
2. 'MyComponent'+FormatDateTime('nnzzz',now)