Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уникальное имя [D7, WinXP]


Страницы:   1 2

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)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо