Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
ВнизНазвание 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c