![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с AdvStringGrid 2.0 в delphi 5 [D5, WinXP]
Seally © (2010-06-22 09:22:00)Всем доброго дня )
Вопрос у меня, возможно, и неправильно сформулирован, но в голову ничего не приходит. С Делфи я не работала особо много, так что разбираюсь не очень.
Проект не моей разработки, так случилось, что разработчики поддерживают его параллельно с нами. И консультируют тоже они. Даже они разводят руками... :/
Проблема в следующем. Имеется проект (oracle 9.2.01, delphi 5.0 (да, ммм... не современно, но так уж сложилось... увы) ), который в числе прочих использует библиотеку компонент TAdvStringGrid 2.01 (тоже не первой свежести, но что поделать).
При запуске проекта на исполнение в процессе создания одной из форм (отследила пошагово до куда пустил, дальше вылазит дебагер cpu) вылазит ошибка на строчке Self.SetColumnWidth := False; в процедуре TrfmProgs.CreateForm.
Ошибка гласит "Project xxx.exe raised exception class ECovertError with message ''' is not a valid integer value'." Дальше как обычно. Далее, после того, как кликну ОК, вылазит следующее окно, в котором мне сообщается, что Source file not found и этот файл AdvGrid.pas и предлагается его указать вручную.
Разработчики сказали, что "Файла AdvGrid.pas в исходниках нет, а есть его скомпилированный модуль AdvGrid.dcu. Просто при запуске из Delphi, когда генерится ошибка, оболочка пытается спозиционироваться в то место кода, где она произошла." Охотно верю, но все равно не понимаю.
Попросила у разработчиков текущую компоненту, которой они пользуются - дали, установила, все прописала - эффект тот же. Попробовала закаментить эту злосчастную строчку, ошибка не вылезла, зато как только процедурка подошла к концу вылезло окно с требование этого AdvGrid.pas. Поискала в Инете, может, кто тоже мучался - не нашла.
Вполне возможно, что сама библиотека ни в чем не виновата, но у меня предположений других нет - требует-то AdvGrid.pas из этой компоненты. Сам екзешник уже скомпиленый разработчиками работает, а вот проект из делфи - нет.
Если у кого-то будут какие-нибудь предположения как с этим справиться или хотя бы почему такая ошибка лезет, буду весьма и весьма благодарна.
Seally (2010-06-24 09:21:00) [1]вот, если кому интересно...
Нужно было в параметрах отладки для оболочки (Tools -> Debugger Options -> Language Exceptions) снять галочку Stop on Delphi Exceptions.
и все заработало )
Seally (2010-06-24 09:01:00) [2]ладно, поскольку обсуждение уходит в неперспективное русло переругиваний - всем большое спасибо за помощь )) и удачи
Плохиш (2010-06-23 20:32:00) [3]
> Я в Делфи не работала никогда раньше, это не моя специализация,
> а когда дают еще и чужие коды
А зачем взяла? Вот честно не понимаю, что ж за контора-такая рога и копыта, где исходники дают кому попало для разбираний.
Плохиш (2010-06-23 20:27:00) [4]
> но вот можно обойтись без колкостей?
А смысл?
Seally (2010-06-23 17:36:00) [5]Можете не обращать внимания на это исключение, оно обрабатывается в секции except .. end;
Получается, что StrtoInt не может преобразовать пустую строку и ошибка все равно вылетает, попробую написать обработчик ошибки и посмотрю
Странно, почему сразу не решили, что это биллагейтса виноват?
а Вы почему такой язвительный? Я честно сказала, не знала, как докопаться. Я в Делфи не работала никогда раньше, это не моя специализация, а когда дают еще и чужие коды в них разбираться приятного мало, особенно если не работает и особенно если разработчики не знают, отчего у меня трудности и проблемы. И я честно в первом посте призналась, что не знаю отчего трудности, а на компоненту подумала, потому что элементы от нее упоминались в ошибках.
Спасибо Вам за помощь большое, но вот можно обойтись без колкостей?
Плохиш (2010-06-23 16:57:00) [6]Можете не обращать внимания на это исключение, оно обрабатывается в секции except .. end;
> Seally (23.06.10 16:17) [23]
>
> ну, не знала я как докопаться...
>
Странно, почему сразу не решили, что это биллагейтса виноват?
Seally (2010-06-23 16:17:00) [7]ну, не знала я как докопаться...
а равно оно пустому значению т.е. ''
icWasya (2010-06-23 16:12:00) [8]Вот с этого
curLev:=StrToInt(AGrid.Cells[indLevel,ARow]);
и надо было начинать.
Чему в этот момент (indLevel=8 ARow=0) равно AGrid.Cells[8,0] ?
Seally (2010-06-23 15:29:00) [9]ок, поставила на все процедуры которые нашла в коде
да из TfrProgs.SetColumnWidth пошло на процедуру TfrProgs.stgrProgsGetCellColor
procedure TfrProgs.stgrProgsGetCellColor(Sender: TObject; ARow, ACol: Integer;
AState: TGridDrawState; ABrush: TBrush; AFont: TFont);
const
arFnColor : array [0..indProg] of integer = ($00A40606,$00206020,$00A2A240,$00000000);
var
AGrid: TAdvStringGrid;
indImage, curLev: integer;
begin
AGrid:=Sender as TAdvStringGrid;
if not (gdFixed in AState) then begin
if (AGrid.GetImageIdx(ACol,ARow,indImage)) or (ARow <> Self.selRow) then
ABrush.Color:=AGrid.Color
else ABrush.Color:=$00E0E0E0;
try
curLev:=StrToInt(AGrid.Cells[indLevel,ARow]);
except
curLev:=indProg;
end;
if curLev < indProg then AFont.Style:=[fsBold];
indImage:=curLev*Ord(curLev < indProg)+indProg*Ord(curLev >= indProg);
AFont.Color:=arFnColor[indImage];
end;
end;
Ошибка появляется на curLev:=StrToInt(AGrid.Cells[indLevel,ARow]);
Cells я нашла
синтаксис Cells (c:integer, r:integer):String
исходные данные, при которых появляется ошибка: indLevel=8 ARow=0, руками написала curLev:=StrToInt(AGrid.Cells[indLevel,1]); проскочило, но в конце процедуры опять потребовало указать ему, где AdvGrid.pas …
Может, я еще какие манипуляции могу совершить?
Плохиш (2010-06-23 13:02:00) [10]Все procedure/function описанные в классе формы являются её методами. А то что вы написали есть частный случай методов, автоматически создаваемых для обработки событий.
Seally (2010-06-23 11:24:00) [11]я поставила во всех методах в которых нашла, их там всего 6
OnActivate
FormCanResize
FormClose
FormCreate
FormKeyPress
FormShow
Как я писала, самой первой отрабатывает процедура TfrProgs.FormCreate, из нее управление переходит в процедуру TfrProgs.SetColumnWidth, потом возвращается обратно (если ошибка не валит)
Плохиш (2010-06-23 11:10:00) [12]goto [8]
Seally (2010-06-23 11:08:00) [13]Я делаю так ставлю точку останова в самом начале, с чего начинает работать модуль, и дальше пошагово иду, заходя по ходу дела во все вызываемые процедуры.
Ошибка и впрямь вылазит на строкеstgrProgs.AutoSizeRow(ind);</
CODE>
Ищу неправильно? А как тогда, не подскажете?
Плохиш (2010-06-23 10:34:00) [14]Требуемая ошибка не в этом коде.
Seally (2010-06-23 09:23:00) [15]почему дневник? просто написала, какие у меня продвижения...
Код процедур привожу полностью, они не такие большие
1) основная процедура, из которой вызывается SetColumnWidth
procedure TfrProgs.FormCreate(Sender: TObject);
begin
frMain.tcMain.Tabs.Append(Self.Caption);
Self.IsUpdated:=False; Self.flRowVisible:=True;
Self.curYear:=frMain.IniF.ReadInteger('General','infYear',frMain.plYear);
Self.curTseh:=frMain.IdTseh;
Self.Caption:='Программы ('+IntToStr(Self.curYear)+')';
frMain.tcMain.Tabs[frMain.tcMain.TabIndex]:=Self.Caption;
NotProvide:=frMain.IniF.ReadString('Texts','NotProvide','Не передбачена Переліком');
NotProvideShort:=frMain.IniF.ReadString('Texts','NotProvideShort1',NotProvide);
arShort[True]:=frMain.IniF.ReadString('Texts','NotProvideShort2',NotProvide);
AboutPPR:=frMain.IniF.ReadString('Texts','AboutPPR','Стосовно ППР');
AboutPPRShort:=frMain.IniF.ReadString('Texts','AboutPPRShort1',AboutPPR);
arShort[False]:=frMain.IniF.ReadString('Texts','AboutPPRShort2',AboutPPR);
Self.selRow:=1; stgrProgs.Cells[indLevel,stgrProgs.Row]:='-1';
Self.SetColumnWidth(False);
algrWorkers.FixedColFont[0].Color:=algrWorkers.FixedColor;
algrCompos.Options:=algrCompos.Options-[goHorzLine];
arGetNodes[0]:=Self.GetPlaceTrain; arGetNodes[1]:=Self.GetDeparts;
arGetNodes[2]:=Self.GetTrainType; arGetNodes[3]:=Self.GetProgs;
frMain.clDefFace:=clBtnFace;
Self.IsUpdated:=True; stgrProgs.BeginUpdate;
Self.GetPlaceTrain;
stgrProgs.EndUpdate; Self.IsUpdated:=False;
end;
2) процедура SetColumWidth
procedure TfrProgs.SetColumnWidth(IsResize: boolean);
var
ind: byte;
begin
if not IsResize then begin
for ind:=indLevel to stgrProgs.ColCount-1 do
stgrProgs.HideColumn(ind);
for ind:=0 to indProg-1 do
stgrProgs.ColWidths[ind]:=18;
stgrProgs.ColWidths[indProg+1]:=65;
for ind:=indPlan to indFact do
stgrProgs.ColWidths[ind]:=45;
stgrProgs.MergeCells(0,0,indPlan,1);
stgrProgs.Cells[0,0]:='Программы подготовки (рядом указана полная продолжительность)';
stgrProgs.Cells[indPlan,0]:='План'; stgrProgs.Cells[indCancel,0]:='Отм.';
stgrProgs.Cells[indFact,0]:='Факт';
algrCounts.ColWidths[0]:=indProg*18+1; algrCounts.Cells[0,0]:='Всего:';
for ind:=2 to algrCounts.ColCount-1 do
algrCounts.ColWidths[ind]:=stgrProgs.ColWidths[indProg+ind]-1;
end;
ind:=Ord((stgrProgs.TopRow + stgrProgs.VisibleRowCount <> stgrProgs.RowCount) or
(stgrProgs.TopRow <> 1));
stgrProgs.ColWidths[indProg]:=stgrProgs.Width-ind*(stgrProgs.ScrollWidth+1)
-(indProg*18+200)-indProg*stgrProgs.GridLineWidth;
//ошибка возникает как раз здесь, но, когда я в качестве эксперимента заменила ind:=0 на ind:=1, все отработало без проблем, а проект потребовал файл, когда уже вернулся в процедуру TfrProgs.CreateForm в самом ее конце на строчке end;
for ind:=0 to stgrProgs.RowCount-1 do
stgrProgs.AutoSizeRow(ind);
algrCounts.ColWidths[1]:=stgrProgs.ColWidths[indProg]
+stgrProgs.ColWidths[indProg+1]-1;
end;
>Anatoly Podgoretsky © (22.06.10 18:19) [13]
Да, когда я только с этим столкнулась, то вычитала в Инете, что у меня некорректная версия файла dcu, но дело в том, что я попросила разработчиков дать мне именно то, с чем они работают, и они выслали. Вообще-то, в их интересах, чтобы у меня иде нормально работало, т.к. им тогда работы меньше с нашей поддержкой.
Я вообще-то думала, может у меня с делфи проблемы, потому что там уже много чего ставилось-удалялось и т.д. Однако на другой машине пробовали этот проект открыть - тоже самое.
Джакузи (2010-06-22 18:30:00) [16]
Попробовала закаментить эту злосчастную строчку, ошибка не вылезла, зато как только процедурка подошла к концу вылезло окно с требование этого AdvGrid.pas
Как насчет привести код процедурки?
Anatoly Podgoretsky (2010-06-22 18:19:00) [17]> Seally (22.06.2010 17:48:11) [11]
Это означает, что у вас нет версии DCU для Дельфи 5
Владельцы не хотят давать его, как я понял.
Плохиш (2010-06-22 18:13:00) [18]Это, типа, ваш дневник такой?
Хотите что бы вас полечили, давайте фотографию. Здесь без фотографии только в конференции "Прочее" лечат.
Seally (2010-06-22 17:48:00) [19]короче говоря, при отрабатывании этого свойства не с 0, а например с 1, все хорошо, ошибка больше not a valid integer value не лезет, но в конце процедуры на end; все равно требует файл AdvGrid.pas
Seally (2010-06-22 17:03:00) [20]так, получилось закопаться поглубже )
ошибка выпадает на строке stgrProgs.AutoSizeRow(ind);
тогда когда ind=0
a stgrProgs - это элемент TAdvStringGrid