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

Вниз

Помогите найти ошибку   Найти похожие ветки 

 
Romm ©   (2007-04-14 09:37) [0]


var
 OptionForm: TOptionForm;
 ArCheckBox: array[1..12] of TCheckBox;

procedure TOptionForm.FormCreate(Sender: TObject);
var
 num,count:Byte;
begin
 num:=0;
 for count:=0 to OptionForm.ComponentCount do
   begin
     if (Components[count] is TCheckBox) then
       begin
         inc(num);
         ArCheckBox[num]:=TCheckBox(Components[count]);
       end;
   end;
end;


проект компилируется, но при запуске проги вылетает окно с сообщением о ошибке: List index out of bounds (30). Окно с легкостью закрывает и прога работает нормально... ничего не понимаю.. :)


 
ЮЮ ©   (2007-04-14 09:41) [1]

for count:=0 to OptionForm.ComponentCount - 1


 
MBo ©   (2007-04-14 09:42) [2]

for count:=0 to OptionForm.ComponentCount - 1


 
ЮЮ ©   (2007-04-14 09:43) [3]

Когда на форме появится 13-й TCheckBox ошибка будет страшнее :)


 
Romm ©   (2007-04-14 09:48) [4]


> ЮЮ ©   (14.04.07 09:41) [1]


> MBo ©   (14.04.07 09:42) [2]

Оо... спасибо!!!!! Прям как в Анекдоте:
Программист с женой отправились в супермаркет. Сделав все необходимые закупки, они вышли на улицу, и жена сказала:
- Стой здесь и смотри в оба за этими десятью сумками, пока я схожу и разыщу такси.
Когда жена вернулась, то увидела обалдевшего мужа, переставляющего сумки с места на место. Программист:
- Ты сказала, что здесь десять сумок, а я насчитал только 9!
Жена:
- Hо их было десять!
Программист:
- Hет, давай вместе считать: 0, 1, 2, 3...


 
Romm ©   (2007-04-14 12:03) [5]

опс, снова АшиПка...
написал процеДУРУ:

 public
   { Public declarations }
   SocketActive : array[1..12] of Boolean;
   procedure LoadList;

procedure TOptionForm.LoadList;
var
 F:TIniFile;
 i:Byte;
begin
 MainForm.ComboBox1.Clear;
 F:=TIniFile.Create(ExtractFilePath(ParamStr(0))+"option.ini");
 for i:=1 to 12 do
   if OptionForm.SocketActive[i] then
     begin
       MainForm.ComboBox1.Items.Add(F.ReadString(IntToStr(i),"name","Computer #"+IntToStr(i)));
     end;
 F.Free;
end;


в если вызывать ее из данной формы - все Ок. Пытаюсь вызвать из главной формы - ошибка..:(

procedure TMainForm.FormCreate(Sender: TObject);
begin
 OptionForm.LoadList;
end;


в чем дело обьясните пожалуйста!


 
ЮЮ ©   (2007-04-14 12:17) [6]

ошибка..:(Обычно она себя идентифицирует значительно шире :)


> написал процеДУРУ:

Во-первых, это метод.
Во-вторых, это метод экземпляра класса TOptionForm, в котором используются "левые" глобальные переменные MainForm и OptionForm

В соответствии с выше сказанным, метод класса TOptionForm должен выглядеть примерно так:

procedure TOptionForm.LoadList(ComboBox: TComboBox);
var
F:TIniFile;
i:Byte;
begin
ComboBox.Clear;
F:=TIniFile.Create(ExtractFilePath(ParamStr(0))+"option.ini");
for i:=1 to 12 do
  if SocketActive[i] then
    begin
      ComboBox.Items.Add(F.ReadString(IntToStr(i),"name","Computer #"+IntToStr(i)));
    end;
F.Free;
end;

и вызываться соответственно

procedure TMainForm.FormCreate(Sender: TObject);
begin
OptionForm.LoadList(ComboBox1); // надеюсьOptionForm уже создан
 // хотя вряд ли. Перенеси этот вызов в TMainForm.FormShow
 
end;


 
Romm ©   (2007-04-14 12:20) [7]

гы.. у меня сегодня вопросы не кончатся :))
как связать 2 компонента, например CheckBox и Button.
А если точнее, как изменить свойство любой n-кнопы если выбран n-CheckBox??

пробовал так:
procedure TOptionForm.CheckBox1Click(Sender: TObject);//процедура для 12-ти CheckBox"ов
begin
if TCheckBox(Sender).Checked then
 begin
   TButton(TCheckBox(Sender).Tag).Enabled:=true;{пытаюсь изменить св-во Button1, если кликнули на CheckBox1}
   SocketActive[TCheckBox(Sender).Tag]:=true;
 end
else
 begin
   TButton(TCheckBox(Sender).Tag).Enabled:=false;
   SocketActive[TCheckBox(Sender).Tag]:=false;
 end;
end;


 
Romm ©   (2007-04-14 12:25) [8]


> Во-первых, это метод....
> и вызываться соответственно...

вот за ЭТО спасибо ОГРОМНОЕ, а вот за это:
> // надеюсьOptionForm уже создан
>  // хотя вряд ли. Перенеси этот вызов в TMainForm.FormShow
>  
... Я тупой конечно, но не настолько :)))


 
ЮЮ ©   (2007-04-14 12:26) [9]

;{пытаюсь изменить св-во Button1, если кликнули на CheckBox1}

Оно и изменится, если, конечно в CheckBox1.tag стоит не 1, а указательна на Button1, установленные в RunTime. Если же стоит 1, то  Button1 надо сначала найти


 
Romm ©   (2007-04-14 12:30) [10]

Tag я у всех CheckBox"ов проставил с 1 по 12 для определения номера компонента.. Обьясни пожалуста как найти кнопу


 
ЮЮ ©   (2007-04-14 12:31) [11]


> ... Я тупой конечно, но не настолько :)))

Обсуждаемую величину на расстоянии не разглядеть, но:

Если MainForm - главная форма, а OptionForm - плдчиненная и не DataModule, то MainForm создается раньше OptionForm и с моменту выполнения TMainForm.FormCreate OptionForm просто обязан быть nil :)


 
ЮЮ ©   (2007-04-14 12:37) [12]

procedure TOptionForm.CheckBox1Click(Sender: TObject
var
 cb: TChechBox;
 bt: TButton;
begin
 if (Sender = nil) or not (Sender is TCheckBox) then exit;
 cb := TCheckBox(Sender);
 bt := FindComponent("Button" + IntToStr(cb.Tag));
 if (cb = nil)  then exit;
 bt.Enabled := cb.Checked;
 SocketActive[cbTag] := cb.Checked;
end;


 
ЮЮ ©   (2007-04-14 12:39) [13]

bt := TButton(FindComponent("Button" + IntToStr(cb.Tag)));


 
Romm ©   (2007-04-14 12:40) [14]


> ЮЮ ©   (14.04.07 12:31) [11]


дык это ясно. я торопился и "всунул" не туда. И в таком виде.. короч - это все работает. Кроме кнопок и чекбоксов :))


 
Romm ©   (2007-04-14 12:42) [15]

ЮЮ ©   (14.04.07 12:37) [12]
ЮЮ ©   (14.04.07 12:39) [13]

Благодаря Вам я сегодня СТОЛЬКО всего узнал, пасиб...


 
ЮЮ ©   (2007-04-14 12:43) [16]

SocketActive[cbTag].Active := cb.Checked;

Жаже не знаю, исправлять ли свои ошибки. Вдруг и это обидит :)


 
Romm ©   (2007-04-14 12:48) [17]


> Вдруг и это обидит

:)) ты еще точку забыл cb.Tag :))


 
Romm ©   (2007-04-14 13:24) [18]

И вот еще что.. :)
У TComboBox есть свойство, похожее на Tag, но для каждого итема.
Например если выбрать n-й итем, то Socket[n].adress:=Ip_adress[n];


 
Romm ©   (2007-04-14 13:24) [19]

???


 
Romm ©   (2007-04-14 13:42) [20]

Есть такое св-во или нет?! Если нет, то как можно по итему найти нужный адрес??


 
{RASkov}   (2007-04-14 13:48) [21]

> Есть такое св-во или нет?!

ItemIndex? Item.Object?


 
Romm ©   (2007-04-14 14:12) [22]


> ItemIndex?

несколько не то..

> Item.Object?

щас посмотрю..


 
Romm ©   (2007-04-14 14:17) [23]

Такс, а можно число присвоить обьекту? :)


 
{RASkov}   (2007-04-14 16:15) [24]

> [23] Romm ©   (14.04.07 14:17)

Можно
N:=555;
Object[i]:=TObject(N);
Вернуть
Integer(Object[i]);
Что-то в этом духе....


 
Romm ©   (2007-04-14 16:26) [25]


> {RASkov}   (14.04.07 16:15) [24]

ок


 
Romm ©   (2007-04-14 16:53) [26]

Что-то я растерялся совсем и забыл как из строки str удалить 3 первых символа... Напомните, люди добрые :)


 
Romm ©   (2007-04-14 17:02) [27]

Оп, придумал:

Edit1.Text:=Copy(Mes,2,Length(Mes)-1);

правильно написал?А то я сегодня столько ачепяток делаю.. :)



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

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

Наверх




Память: 0.53 MB
Время: 0.021 c
11-1155058319
Stals
2006-08-08 21:31
2007.05.06
Как прицепить словарь от Microsoft Office


1-1173099044
Zeleniy
2007-03-05 15:50
2007.05.06
прозрачный RichEdit


15-1176182477
vajo
2007-04-10 09:21
2007.05.06
Samsung представил двойника Renault Koleos


2-1176866712
VitAngel
2007-04-18 07:25
2007.05.06
Получить свой IP и блокировка запуска второй копии программы


3-1171883030
valua
2007-02-19 14:03
2007.05.06
База на сервере и IBExpert