Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.027 c
14-1101969297
Layner
2004-12-02 09:34
2004.12.19
Кто нибудь плотно занимался SFX архивами в WinRAR?


4-1099905979
ZedeS
2004-11-08 12:26
2004.12.19
Работа со CMOS в Win XP


4-1099606582
jek_
2004-11-05 01:16
2004.12.19
WinExec


14-1101655076
tw
2004-11-28 18:17
2004.12.19
Заставка


3-1100772558
MakNik
2004-11-18 13:09
2004.12.19
dxDBGrid