Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-49500
Gnom
2004-01-03 17:30
2004.01.16
редактирование текста


3-49446
www
2003-12-18 11:56
2004.01.16
TUpdateSQL для 2-х таблиц


4-49799
Morpheus
2003-11-13 09:01
2004.01.16
Как считать инфу из консольного процесса ?


7-49795
V-Isa
2003-11-04 13:05
2004.01.16
Звуковая карта


1-49572
Cardinal
2004-01-02 20:47
2004.01.16
Помогите пожалуйста! Как добавить в popup свой пункт?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский