Текущий архив: 2004.12.19;
Скачать: CL | DM;
Вниз
Уникальное имя Найти похожие ветки
← →
Viktop (2004-11-30 10:41) [0]Как создавать я знаю! А вот как задать уникальное имя - нет :cry:
Есть некий компонент (TImage) на форме с именем Pic, при нажатии на который создаётся такой же объект , но с именем Pic1, т.е. надо проверить существует ли объект с таким именем и если нет, присвоить ему имя
← →
Думкин © (2004-11-30 10:43) [1]CoCreateGuid
← →
TUser © (2004-11-30 10:51) [2]FindComponent, но обычно при динамическом создавании объектов присваивать им имена не требуется
← →
Alexander Panov © (2004-11-30 11:03) [3]Можно это делать весьма просто:
Например,
1. "MyComponent"+IntToStr(ComponentCount)
2. "MyComponent"+FormatDateTime("nnzzz",now)
← →
cae © (2004-11-30 11:22) [4]
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 ;
← →
Viktop (2004-11-30 11:48) [5]
> FindComponent, но обычно при динамическом создавании объектов
> присваивать им имена не требуется
Вот такой я человек! Мне это жизненно необходимо.
Остальные советы проверю попозже.
← →
Anatoly Podgoretsky © (2004-11-30 12:32) [6]Alexander Panov © (30.11.04 11:03) [3]
1. Красиво, но не работает в случае динамического удаления компонент
2. Не подходит в случае массового добавления компонент в цикле.
Надо комбинировать с [2]
← →
Viktop (2004-12-01 13:43) [7]Проблема как раз в этом комбинировании и заключается.
Если использовать [4], то получается, но только для одного компонента (задаётся имя + цифра 1), а иногда странные имена (имя родителя + 270 (откуда 270)). И зачем нужна эта строка:if S[1] = "T" then delete(S,1,1);
← →
TUser © (2004-12-01 13:52) [8]
> И зачем нужна эта строка: if S[1] = "T" then delete(S,1,1);
Чтобы компонент класса TButton назывался ButtonXXX
← →
Viktop (2004-12-01 13:56) [9]А у меня имя должно быть Terminator1, а получается erminator1
← →
cae © (2004-12-01 13:58) [10]Виноват...
Конечно, цикл не нужен.
← →
TUser © (2004-12-01 14:09) [11]
> А у меня имя должно быть Terminator1, а получается erminator1
Проверяй еще и вторую букву. Интересно все-таки, - нафига имена присваивать?
← →
Viktop (2004-12-01 14:32) [12]
> Конечно, цикл не нужен.
Разве этот цикл надо убирать:for i := 0 to Parent.ComponentCount -1 do
while Parent.FindComponent(S+IntToStr(Ind)) <> nil do
Inc(Ind);
> Интересно все-таки, - нафига имена присваивать?
А там (в проге) БУДЕТ алгоритм, проверяющий правильность соединения элементов сети (терминаторы, кабели, адаптеры и пр.). Доступ к этим объектам буду осуществлять по имени.
← →
TUser © (2004-12-01 14:34) [13]
> Доступ к этим объектам буду осуществлять по имени
Осуществляй доступ по индексам в массиве.
Цикл For - не нужен
← →
Viktop (2004-12-01 14:49) [14]А как я узняю, что это, например терминатор или коннектор? Тем более, что создаю я их не массово.
← →
ЮЮ © (2004-12-02 04:16) [15]>А как я узняю, что это, например терминатор или коннектор?
if (Sender is TTerminator) then
...
else if (Sender is TConnector) then
...
где Seder: TObject
← →
Экспериментатор (2004-12-02 09:20) [16]a какой-нибудь
TComponentType = (ctTerminator, ctConnector, ctAdadpter, ctCable и т.д.)
в свои объекты добавить не судьба?
Имхо сделай свой объект
с ComponentType : TComponentType;
а при создании
присваивай :
если коннектор, то
ComponentType:=ctConnector;
если адаптер, то
ComponentType:=ctAdadpter;
и вперед с песней.
Потом хоть запроверяйся
ComponentType подскажет что за объект перед тобой
← →
Anatoly Podgoretsky © (2004-12-02 09:25) [17]Viktop (01.12.04 13:56) [9]
Не слушаешься Борланда, типы должны быть с приставкой Т, не Terminator, а ТTerminator
← →
TUser © (2004-12-02 10:56) [18]Еще есть ClassName
← →
Viktop (2004-12-03 04:57) [19]Хотелось бы по подробнее (если можно)
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
← →
cae © (2004-12-03 09:07) [20]Вместо TImage.Create(Self) нужно поставить TImage.Create(FramePole21)
← →
Viktop (2004-12-03 14:09) [21]
> Вместо 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 14:39) [22]Хорошо, тогда пиши Self.FindComponent
Посмотри в исходниках, что происходит при вызове Create(Self) и присвоении Pаrent. И потом реализацию FindComponent.
Страницы: 1 вся ветка
Текущий архив: 2004.12.19;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.03 c