Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
ВнизСтранная ошибка (иначе не скажешь) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.009 c