Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.04;
Скачать: CL | DM;

Вниз

Название ComboBox   Найти похожие ветки 

 
Eraser ©   (2002-01-17 13:39) [0]

В следующем коде при отладке ОК при работе - ошибка:
for i:=0 to componentCount-1 do
(Components[i] as TComboBox).Name:="cbCom"+inttostr(i);


 
MBo ©   (2002-01-17 13:42) [1]

Вставь
if (Components[i] is TComboBox) then ...


 
Digitman ©   (2002-01-17 13:42) [2]

вникай в сообщение об ошибке : какой-то объект из списка Components не является объектом класса TComboBox. При такой постановке проблемы это - однозначно


 
vlv ©   (2002-01-17 13:43) [3]

Забыл проверку:

for i:=0 to componentCount-1 do
if Components[i] is TComboBox then
(Components[i] as TComboBox).Name:="cbCom"+inttostr(i);


 
vlv ©   (2002-01-17 13:44) [4]

А еще: возможно ли изменять имя компонента, созданного не динамически?


 
Eraser ©   (2002-01-17 13:56) [5]

Ошибка осталась, та же самая . В принципе это было сделано для того чтобы менять номер КомбоБокса в следующем тексте:
Table1.FieldByName("ComPort").AsString:=cbCom<<номер>>.Text;
<<номер>> надо изменять чтобы писалось из разных Боксов в одну строку БД


 
Digitman ©   (2002-01-17 14:06) [6]

Правило : имя компонента (неважно как созданного - динам-ки или в design-time) должно быть либо пустой строкой либо уникальным в пределах владелька компонента.


 
Владислав ©   (2002-01-17 14:12) [7]

> Eraser © (17.01.02 13:56)

Ссылка на компонент и имя компонента - разные вещи. В первом случае это указатель на экземпляр компонента, во втором - строка.


 
Владислав ©   (2002-01-17 14:13) [8]

Опиши точнее, что ты хочешь получить?


 
Eraser ©   (2002-01-17 14:26) [9]

Есть 6 ComboBox cbPort1..cbPort6 чтобы не писать 6 раз
Table1.FieldByName("ComPort").AsString:=cbCom1.Text;
Table1.Next;
Table1.FieldByName("ComPort").AsString:=cbCom2.Text;
Table1.Next;
Table1.FieldByName("ComPort").AsString:=cbCom3.Text;
.....

можно написать через цикл

Table1.active:=true;
table1.First;
for RecNo:=1 to Table1.RecordCount do
begin
Table1.Edit;
Table1.FieldByName("ComPort").AsString:=cbCom<<номер Бокса>>. Text;
Table1.Post;
Table1.Next;
end;
Table1.active:=false;
end;



 
Владислав ©   (2002-01-17 14:30) [10]

Если имена компонентов такие же ("cbCom1".."cbCom7"), то можно использовать FindConpenent.

for RecNo:=1 to Table1.RecordCount do
begin
Table1.Edit;
Table1.FieldByName("ComPort").AsString:=FindComponent("cbCom"+IntToStr(<<номер Бокса>>).Text;
Table1.Post;
Table1.Next;
end;


 
Digitman ©   (2002-01-17 14:36) [11]

Можно использовать сч-к FOR-цикла для доступа к массиву ссылок на заранее созданные ComboBox"ы. Тогда ни именовать их ни искать потом по всей форме не нужно будет - вот они все, под рукой, обращайся к ним по индексу в массиве


 
Ally ©   (2002-01-17 14:41) [12]

Так ты напиши функцию:


function TForm1.GetCBText(No: Integer): string;
var
I: Integer;

begin
with Self do
for I := 0 to ComponentCount - 1 do
if (Components[I] is TComboBox) and ((Components[I] as TComboBox).Name = "cbCom"+IntToStr(No))
then begin
Result := (Components[I] as TComboBox).Text;
Break;
end;
end;


а потом свою строчку в цикле:

for RecNo:=1 to Table1.RecordCount do
...
Table1.FieldByName("ComPort").AsString := GetCBText(RecNo);
...
end;


 
Eraser ©   (2002-01-17 15:38) [13]

> to Владиславу
перед FindComponent надо указать класс компонента тогда все работает


 
Digitman ©   (2002-01-17 15:47) [14]

>Eraser © (17.01.02 15:38)
Неверно. Не класс, а объект, чей метод FindComponent() вызывается


 
Eraser ©   (2002-01-17 16:19) [15]

Вот пример с FindComponent из Delphi
with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
begin
Left := 10;
Top := i * 20;
Parent := self;
end;
я пишу по аналогии

Table1.FieldByName("ComPort").AsString:=TСomboBox(FindComponent("cbCom" + IntToStr(i))).text;

ОШИБКА при работе причем не сразу а через некоторое время


 
Digitman ©   (2002-01-17 16:24) [16]

ОШИБКА-то КАКАЯ ? Ты до сих пор вопрос этот игнорируешь.


 
McSimm ©   (2002-01-17 16:30) [17]

По-моему проблема все-таки с уникальностью имен. Возможно при в определенный момент при изменении имени, например на "cbCom1", такой уже существует.


 
Eraser ©   (2002-01-17 16:34) [18]

Извините каюсь был неправ:
Invalid class


 
Romkin ©   (2002-01-17 16:35) [19]

TComboBox - потомок TWinControl
Попробуй Application.ProcessMessages непосредственно перед присвоением нового имени


 
Digitman ©   (2002-01-17 16:58) [20]

>Eraser
Ну дык - о чем речь ! Тебе и говорят о том, что среди компонентов, класс каждого из которых ты в цикле без разбору пытаешься привести к типу TComboBox (с помощью AS), каким-то образом появляется объект, не являющийся потомком класса TComboBox (что-то другое : кнопка какая-нить или еще чего - мало ли ты там чего еще в динамике творишь с формой, мы же не знаем, полного кода твоего нет), что и портит всю идиллию "жутким" исключением Invalid class.
Заключи строчку, где происходит AS-приведение типа, в блок try..except, поставь туда брейкпойнт, поймай его и определись, на каком из компонентов, перечисляемых в цикле, происходит реальный "спотык" : его класс, имя и пр. Сразу станет ясно, кто виновник исключения. А уж дальше соображай сам, в какой момент времени и откуда он там взялся, если в списке, по-твоему, д.б. одни ComboBox"ы



Страницы: 1 вся ветка

Текущий архив: 2002.02.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
7-9015
fsp
2001-10-24 19:30
2002.02.04
Зацепить обьект из другого приложения


1-8899
Velocity
2002-01-15 12:28
2002.02.04
Потоки и динамическое выделение памяти


3-8775
Georg
2002-01-07 15:16
2002.02.04
Заковырочка-запупырочка...


3-8791
Agent Smith
2002-01-08 14:44
2002.02.04
Работа с файлами


1-8932
Станислав
2002-01-16 15:36
2002.02.04
Большие числа