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

Вниз

Странная ошибка (иначе не скажешь)   Найти похожие ветки 

 
olookin ©   (2004-01-05 08:13) [0]

Здравствуйте господа!
Возникает странная ошибка при вызове следующей процедуры
...
with PageControl1 do
for i:=0 to PageCount-1 do
Pages[i].TabVisible:=false;
...

Ошибка тем более странная что она 1) является типом EListError (List index out of bounds (number_of_pages_in_pagecontrol)) 2) не возникает, если писать TabVisible:=true. Еще страннее, что на пустом новом проекте все то же самое идет без ошибки. Разумеется, у меня где то в другом месте кода зарыт баг, вызывающий эту ошибку (косвенно видимо, поскольку как я не проверял - нигде не нашел ничего напоминающего неправильный код). Но в данном случае я не понимаю другого - КАК вообще может возникать EListError при назначении булевой переменной? Каким образом он возникает при назначении переменной false, и не возникать при true?
В общем вопрос такой - какая приблизительная последовательность действий (кода) может привести к такому поведению программы?

Спасибо.


 
Zergling ©   (2004-01-05 08:28) [1]

Искать, искать и искать!
Хотел в премер свою недавнюю ветку привести, но уже убили. Может ошибка назло перед самым носом :)


 
olookin ©   (2004-01-05 08:32) [2]

to Zergling

Искал уже... Уже устал искать - не знаю решительно что может быть причиной. Ведь этот EListError напрямую связан с PageControl (поскольку значение out of bounds строго равно кол-ву табов в pagecontrol).


 
Zergling ©   (2004-01-05 08:36) [3]

А так :-)

with PageControl1 do
>> BEGIN
for i:=0 to PageCount-1 do
Pages[i].TabVisible:=false;
>> END;


 
olookin ©   (2004-01-05 08:43) [4]

Ага... Не знаю какая связь но так или иначе если вызвать эту процедуру ПОСЛЕ (а я вызывал ДО) открытия формы, то все работает без ошибки (явной ошибки)... Хотя баг все равно где то остался собака такая...


 
Zergling ©   (2004-01-05 08:49) [5]

olookin © (05.01.04 08:43) [4]

Это не баг. Форма еще несозданна и следовательно не соданны ее дочерние компоненты. Отсюда вывод: объект PageControl1 несуществует


 
Рамиль ©   (2004-01-05 08:53) [6]


> ПОСЛЕ (а я вызывал ДО)

Конечно ошибка будет. Если ты к несозданному списку несозданных PageControl пытаешься обратиться, то какую ошибку еще хочешь?


 
olookin ©   (2004-01-05 08:53) [7]

to Zergling

Ага...Я тоже сначала так думал... Первое что я проверил при вызове процедуры (до открытия формы) это кол-во табов в Pagecontrol. Оно оказалось равным тому кол-ву табов которое я задал в дизайне... Кроме того, эта форма СОЗДАЕТСЯ при запуске программы... Она лишь не видна мне... Так что это не объясняет появление ошибки...


 
olookin ©   (2004-01-05 08:54) [8]

to Рамиль

Читайте выше на одно сообщение... Тема та же... И еще раз поясню - все делается до ОТКРЫТИЯ формы а не до СОЗДАНИЯ


 
Zergling ©   (2004-01-05 09:00) [9]

Тогда будь любезен привести код пополнее. А то так и будем пальцем в небо тыкать :)


 
olookin ©   (2004-01-05 09:13) [10]

to Zergling

Да я б рад... Но кода то много... А в каком месте ошибка я не могу даже предположить.... К сожалению...


 
Zergling ©   (2004-01-05 09:25) [11]

olookin © (05.01.04 08:54) [8]

>> И еще раз поясню - все делается до ОТКРЫТИЯ формы а не до СОЗДАНИЯ

в OnShow формы это запихать не поможет?


 
jack128 ©   (2004-01-05 09:36) [12]

Project|Options|Compiler - поставь галку use debug DCU"s - лезь в код VCL, где там конкретно вылезает ошибка..Авось на какие нить мысли наведет..


 
Zergling ©   (2004-01-05 09:47) [13]

jack128 © (05.01.04 09:36) [12]

А VCL причем? Глючные шибко?


 
olookin ©   (2004-01-05 10:08) [14]

to jack128

Спасибо попробую

to Zergling

Да ведь разницы то - баг то как был так и останется... Я напомню - я уже избавился явным образом от этой ошибки... EListError больше не лезет... Однако уверен что сама ошибка где то лежит....


 
Семен Сорокин ©   (2004-01-05 10:13) [15]

Pages[i].TabVisible:=false, если Pages[i] - текущая (активная), приводит к смене активной страницы, вызывая соответсвенно onPageControlChanging, onPageControlChange может обработчики в этих событиях виноваты?


 
Broot   (2004-01-05 10:21) [16]

когда именно вызывается эта процедура, из какого модуля?


 
olookin ©   (2004-01-05 10:34) [17]

to Семен Сорокин

Нет, обработчика на OnChange нет...

to Broot

Как я уже упоминал, кода много и я так и не смог выявить источник ошибки... А конкретно эта процедура вызывается перед вызовом OnShow формы, на которой этот Pagecontrol и лежит


 
Ega23 ©   (2004-01-05 10:37) [18]

Попробуй With убрать и прописать всё в явном виде.


 
Sandman25 ©   (2004-01-05 10:46) [19]

Только что вставил текст из первого сообщения в программу. Все сработало. У автора должен быть обработчик, как писал [15] Семен Сорокин © (05.01.04 10:13)


 
olookin ©   (2004-01-05 10:54) [20]

to Ega23

Ну это уже фантастику вы предлагаете... Даже и пробовать не буду.

to Sandman25

Нет, у меня нет обработчика OnChange. Уверенно вам говорю, потому что это так... Теперь предположим что это не так. Откуда возникает EListError (почитайте об этом типе ошибки), если я даже близко не работаю со строками, массивами строк, листами и пр. В самом начале ветки подробно описаны действия который вызывали эту ошибку. Я напомню, при назначении TabVisible:=false эта ошибка возникает, при назначении TabVisible:=true - не возникает...


 
Zergling ©   (2004-01-05 11:02) [21]

Откуда возникает EListError
Обращаешся к несушествующему индексу массива т.е. к массиву вкладок - TPage.
Пока не приведешь более детальный код, будут тебе такие ответы. Необязательно приводить весь код, приведи ту часть, которую ты считаещь подозрительной (строчек поболее, не жадничай, не 3 как в первом посте)


 
olookin ©   (2004-01-05 11:15) [22]

to Zergling

Да я бы говорю привел бы хоть весь код... Но я не знаю в какой части он возникает... Вот к примеру процедура из которой вызывается искомая с ошибкой...

procedure TFileWindowAcq.Manualstimul1Click(Sender: TObject);
var b: boolean;
i: integer;
begin
if MessageDlg("!!!",mtWarning,[mbYes,mbNo],0)=mrYes then
b:=true else
b:=false;
PageControl1.ActivePageIndex:=0;
manualstimul:=true;
if WindowState<>wsMaximized then
Flingopen1Click(Flingopen1); //ее код ниже
with Shape1 do begin
case ChartIndex of
0: Parent:=Chart1;
1: Parent:=Chart2; end;
Height:=Chart1.ChartHeight;
Top:=Chart1.ChartRect.Top;
Left:=Chart1.ChartXCenter;
Visible:=true; end;

if not b then begin
CorrectionTool.ListBox1.Clear;
SquareSeriesF.Clear;
SquareSeriesL.Clear;
end else
with CorrectionTool do begin
for i:=0 to Length(Data.ExactStimul)-1 do
ListBox1.Items.Add(IntToStr(Data.ExactStimul[i]));
ParentWindow:=Handle;
WndTag:=Tag;
ShowTab(1); //это и есть та самая процедура в которой ошибка
Show;
TrackBar1.OnChange(TrackBar1); //ее код ниже
(sender as TMenuItem).Enabled:=false;
CorrectionTool.CallingMenuItem:=(sender as TMenuItem);
end;
end;

procedure TFileWindowAcq.Flingopen1Click(Sender: TObject);
begin
Foldup1.Enabled:=true;
WindowState:=wsMaximized;
Panel1.Visible:=false;
TrackBar1.Width:=PageControl1.Pages[0].Width;
TrackBar1.Top:=trunc(PageControl1.Pages[0].Height/2-TrackBar1.Height/2);
with Chart1 do begin AxisVisible:=true; MarginBottom:=3;
MarginTop:=3; MarginLeft:=3; MarginRight:=3;
Title.Visible:=true; Title.Text.Text:="Force";
LeftAxis.Title.Caption:="Force, mg";
Height:=TrackBar1.Top-4; BackWall.Pen.Color:=clWhite; end;

with Chart2 do begin AxisVisible:=true; MarginBottom:=3;
MarginTop:=3; MarginLeft:=3; MarginRight:=3;
Title.Visible:=true; Title.Text.Text:="Length";
LeftAxis.Title.Caption:="Length, mkm";
Height:=Chart1.Height; BackWall.Pen.Color:=clWhite; end;

with Chart3 do begin AxisVisible:=true; MarginBottom:=3;
MarginTop:=3; MarginLeft:=3; MarginRight:=3; Title.Visible:=true;
Height:=PageControl1.Pages[1].Height-ListView4.Height-2;
BackWall.Pen.Color:=ColorTool.Scheme.ChartColors[6]; end;

ListView4.Arrange(arDefault); Application.ProcessMessages;
StringGrid1.Visible:=true;
PageControl2.Visible:=true;
StringGrid1.DefaultColWidth:=89;
StringGrid1.Height:=PageControl2.Top;
StringGrid1.Repaint;
Flingopen1.Enabled:=false;
end;

procedure TFileWindowAcq.TrackBar1Change(Sender: TObject);
begin
ChartShift(Chart1,TrackBar1,Data.FileInfo.TimeScale);
ChartShift(Chart2,TrackBar1,Data.FileInfo.TimeScale);
if manualstimul then begin
Shape1.OnMouseDown(Shape1,mbLeft,[],0,0);
Shape1.OnMouseMove(Shape1,[],0,0);
Shape1.OnMouseUp(Shape1,mbLeft,[],0,0);
end;
end;

Дальше приводить код не буду поскольку тут уже разветвления на другие модули с процедурами и функциями выполняющими абсолютно не связанные с моим первым кодом задачи...

Уверяю что тут не найдете ошибки отвественной за EListError... Но все равно спасибо за помощь...


 
Ega23 ©   (2004-01-05 11:19) [23]

Так а где сама ShowTab?


 
olookin ©   (2004-01-05 11:20) [24]

to Eqa32

Вот и она...

procedure TCorrectionTool.ShowTab(Index: integer);
var i: integer;
begin
SuperTag:=TCorrectionType(Index+1);
with PageControl1 do
for i:=0 to PageCount-1 do
if Pages[i].PageIndex=Index then
Pages[i].TabVisible:=true else
Pages[i].TabVisible:=false;
end;


 
Ega23 ©   (2004-01-05 11:23) [25]

А TCorrectionTool это у тебя какой-то свой собственный класс?
И где ты его объявляешь?


 
Семен Сорокин ©   (2004-01-05 11:30) [26]

нда, попробуй всеже поменять цикл с
for i:=0 to PageCount-1 do
на
for i:=PageCount-1 downto 0 do
может поможет


 
olookin ©   (2004-01-05 11:30) [27]

to Ega23

Ошибка точно не связана с TCorrectionTool. Я строку с этим типом поставил уже после появления ошибки


 
olookin ©   (2004-01-05 11:31) [28]

to Семен Сорокин

Это я попробовал с самом начале. Результат тот же...


 
panov ©   (2004-01-05 11:35) [29]

Проверяй обработчики на других списках(ListView, Listbox и т.п.).
Возможно, ошибка в этом...


 
olookin ©   (2004-01-05 11:35) [30]

Поскольку ветка как я понимаю плавно перетекает в Потрепаться, напоследок выскажу свои соображения... Ошибка в одном куске кода похоже может вызвать непредсказуемый ход событий в другом куске... Непредсказуемый не с точки зрения программы, а с точки зрения разработчика программы... С чем я видимо и имею дело... Такие вещи возможно не поддаются решению иначе как полной переработкой кода на предмет возможных ошибок...


 
olookin ©   (2004-01-05 11:36) [31]

to panov

В последнем своем высказывании я приблизительно это и имел в виду... Надо смотреть в другое место кода (причем пока я даже не представляю в какое)... Например, как и предложено, в обработчики других списков...


 
Sandman25 ©   (2004-01-05 11:38) [32]

Что-то я не понимаю

with CorrectionTool do begin
Parent := Handle.

Может все-таки Parent := Self.Handle???


 
Ega23 ©   (2004-01-05 11:40) [33]


> to Ega23
>
> Ошибка точно не связана с TCorrectionTool. Я строку с этим
> типом поставил уже после появления ошибки

Я это к тому, что насколько реально виден PageControl1 из этого класса? Попробуй пропусать в явном виде без With и посмотреть значения PageCount, Pages[i].
Просто я такие циклы на Form.Create всегда клал и всё срабатывало нормально.


 
Ega23 ©   (2004-01-05 11:42) [34]


> Что-то я не понимаю
>
> with CorrectionTool do begin
> Parent := Handle.
>
> Может все-таки Parent := Self.Handle???

Вот поэтому with"ом и надо осторожно пользоваться. Метод перекрытый вызвать можно.


 
panov ©   (2004-01-05 11:43) [35]

Кстати, процедура твоя вызвывается всегда с параметром 1, почему-то
ShowTab(1); //это и есть та самая процедура в которой ошибка;


 
olookin ©   (2004-01-05 11:48) [36]

to panov

Нет, не всегда с параметром равным 1... Это лишь пример.

to Sandman25

Спасибо за верное замечание (насчет ParentWindow)... Поправлю обязательно эту двусмысленность... Однако ошибка возникала при таком коде

CorrectionTool.ParentWindow:=Handle;

(который я ПОСЛЕ обнаружения ошибки исправил на теперешний - через with)


 
Sandman25 ©   (2004-01-05 11:50) [37]

Все же не понимаю, почему не получается найти ошибку через use debug dcu и отладку.


 
Zergling ©   (2004-01-05 11:51) [38]

как я понял по коду - оставить видной вкладку определенного индекса.
убрал из приведенного кода всю ахинею и оставил только связанное с PageControl. Работатет. Ошибка в другом месте. Офигенной тебе отладки, денька на два :-]. Навернека ошибка предносом.

panov © (05.01.04 11:43) [35]
в процедуре проверка
if Pages[i].PageIndex=Index then


 
olookin ©   (2004-01-05 11:59) [39]

to Zergling

Спасибо за поддержку (хе-хе)! Вообще говоря, в самом начале я упомянул что сделал аналогичное в пустом новом проекте... И у меня все получилось просто без сучка и задоринки... Вывод - ошибка в другом куске кода (также упомянул об этом)...

to Sandman25

Отладка дает мне как раз EListError. А что касается debug dcu - я пока еще не пробовал (я к сожалению сейчас на работе, и мне велено другим заниматься)... Но обязательно попробую позже...

Пожалуй что на данный момент обсуждение темы выходит на уровень Потрепаться... Потому что я сам как постановщик вопроса не могу конкретизировать проблему на достаточном уровне. Всем спасибо за участие


 
Zergling ©   (2004-01-05 12:07) [40]

olookin © (05.01.04 11:59) [39]

Всегда пожалуйста! Заходите еще! :-)


 
olookin ©   (2004-01-05 12:13) [41]

Итак, решение найдено. С помощью Sandman25. Я посмотрел код ошибки - он равен 1400 (Invalid window handle). Я посмотрел внимательнее на код... И исправил вот что:

...было
with CorrectionTool do begin
for i:=0 to Length(Data.ExactStimul)-1 do
ListBox1.Items.Add(IntToStr(Data.ExactStimul[i]));
ParentWindow:=self.Handle;
...
end;

а стало
with CorrectionTool do begin
ParentWindow:=self.Handle;
for i:=0 to Length(Data.ExactStimul)-1 do
ListBox1.Items.Add(IntToStr(Data.ExactStimul[i]));

Ошибка исчезла... Еще раз всем спасибо...



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

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

Наверх




Память: 0.58 MB
Время: 0.023 c
6-49656
Timerman
2003-11-10 23:10
2004.01.16
Как синхронизировать время с локалкой?


1-49592
_Mad_
2004-01-05 13:08
2004.01.16
масвсив случайных чисел


3-49391
Крутыш
2003-12-20 15:10
2004.01.16
Action какие может принимать значения


6-49678
hawkins
2003-11-16 08:45
2004.01.16
где можно взять заголовочные файлы для Winsock2?


14-49747
Denis
2003-12-24 16:49
2004.01.16
Как определить номер недели в году?