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

Вниз

проблема с AdvStringGrid 2.0 в delphi 5   Найти похожие ветки 

 
Seally   (2010-06-22 09:22) [0]

Всем доброго дня )

Вопрос у меня, возможно, и неправильно сформулирован, но в голову ничего не приходит. С Делфи я не работала особо много, так что разбираюсь не очень.
Проект не моей разработки, так случилось, что разработчики поддерживают его параллельно с нами. И консультируют тоже они. Даже они разводят руками... :/

Проблема в следующем. Имеется проект (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 из этой компоненты. Сам екзешник уже скомпиленый разработчиками работает, а вот проект из делфи - нет.

Если у кого-то будут какие-нибудь предположения как с этим справиться или хотя бы почему такая ошибка лезет, буду весьма и весьма благодарна.


 
DimaBr ©   (2010-06-22 15:22) [1]

Укажите путь к AdvGrid.pas и удилите предыдущий AdvGrid.dcu


 
DimaBr ©   (2010-06-22 15:23) [2]

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


 
Seally   (2010-06-22 16:27) [3]

я бы указала путь к AdvGrid.pas, да ведь нет его в исходниках же, просто физически... а удалить этот AdvGrid.dcu наверняка вообще работать перестанет


 
DimaBr ©   (2010-06-22 16:32) [4]


> Попросила у разработчиков текущую компоненту, которой они пользуются - дали



> да ведь нет его в исходниках же


 
Seally   (2010-06-22 16:34) [5]

возможно, я неправильно поняла ответ разработчика
я так поняла что был когда-то файл такой там на стадии разработки, там проект или что комплировали и он все сидит теперь где-то в AdvGrid.dcu
а когда валит ошибка, то она возникает именно в AdvGrid.dcu, а уже в нем видимо есть указание на этот pas...
опять-таки не сильна в делфи, не ручаюсь за тех.сторону процесса)


 
Плохиш ©   (2010-06-22 16:38) [6]


> Ошибка гласит "Project xxx.exe raised exception class ECovertError
> with message """ is not a valid integer value"."

Вы пытаетесь в своей программе, в каком-то из событий, обработать содержимое ячейки как целое число, а в ячейке пустая строка. Ищите эту обработку в своей программе, AdvGrid.pas Вам не поможет.


 
Seally   (2010-06-22 16:45) [7]

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


 
Плохиш ©   (2010-06-22 16:50) [8]

Поставь точки остановки во всех методах формы TrfmProgs и попадёте, 90%, туда где возникает эта ошибка.


> еще вариант, попробую поискать

рекомендую, если телевизор не включается, сначала поменять предохранитель, а не кинескоп.


 
Seally   (2010-06-22 16:53) [9]

хорошо, попробую


 
Seally   (2010-06-22 17:03) [10]

так, получилось закопаться поглубже )
ошибка выпадает на строке stgrProgs.AutoSizeRow(ind);
тогда когда ind=0
a stgrProgs - это элемент TAdvStringGrid


 
Seally   (2010-06-22 17:48) [11]

короче говоря, при отрабатывании этого свойства не с 0, а например с 1, все хорошо, ошибка больше not a valid integer value не лезет, но в конце процедуры на end; все равно требует файл AdvGrid.pas


 
Плохиш ©   (2010-06-22 18:13) [12]

Это, типа, ваш дневник такой?
Хотите что бы вас полечили, давайте фотографию. Здесь без фотографии только в конференции "Прочее" лечат.


 
Anatoly Podgoretsky ©   (2010-06-22 18:19) [13]

> Seally  (22.06.2010 17:48:11)  [11]

Это означает, что у вас нет версии DCU для Дельфи 5
Владельцы не хотят давать его, как я понял.


 
Джакузи   (2010-06-22 18:30) [14]

Попробовала закаментить эту злосчастную строчку, ошибка не вылезла, зато как только процедурка подошла к концу вылезло окно с требование этого AdvGrid.pas

Как насчет привести код процедурки?


 
Seally   (2010-06-23 09:23) [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-23 10:34) [16]

Требуемая ошибка не в этом коде.


 
Seally   (2010-06-23 11:08) [17]

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

Ошибка и впрямь вылазит на строке stgrProgs.AutoSizeRow(ind);</
CODE>

Ищу неправильно? А как тогда, не подскажете?


 
Плохиш ©   (2010-06-23 11:10) [18]

goto [8]


 
Seally   (2010-06-23 11:24) [19]

я поставила во всех методах в которых нашла, их там всего 6

OnActivate
FormCanResize
FormClose
FormCreate
FormKeyPress
FormShow

Как я писала, самой первой отрабатывает процедура TfrProgs.FormCreate, из нее управление переходит в процедуру TfrProgs.SetColumnWidth, потом возвращается обратно (если ошибка не валит)


 
Плохиш ©   (2010-06-23 13:02) [20]

Все procedure/function описанные в классе формы являются её методами. А то что вы написали есть частный случай методов, автоматически создаваемых для обработки событий.


 
Seally   (2010-06-23 15:29) [21]

ок, поставила на все процедуры которые нашла в коде

да из 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 …

Может, я еще какие манипуляции могу совершить?


 
icWasya ©   (2010-06-23 16:12) [22]

Вот с этого
curLev:=StrToInt(AGrid.Cells[indLevel,ARow]);
и надо было начинать.
Чему в этот момент (indLevel=8 ARow=0) равно AGrid.Cells[8,0] ?


 
Seally   (2010-06-23 16:17) [23]

ну, не знала я как докопаться...

а равно оно пустому значению т.е. ""


 
Плохиш ©   (2010-06-23 16:57) [24]

Можете не обращать внимания на это исключение, оно обрабатывается в секции except .. end;

> Seally   (23.06.10 16:17) [23]
>
> ну, не знала я как докопаться...
>

Странно, почему сразу не решили, что это биллагейтса виноват?


 
Seally   (2010-06-23 17:36) [25]

Можете не обращать внимания на это исключение, оно обрабатывается в секции except .. end;

Получается, что StrtoInt не может преобразовать пустую строку и ошибка все равно вылетает, попробую написать обработчик ошибки и посмотрю

Странно, почему сразу не решили, что это биллагейтса виноват?

а Вы почему такой язвительный? Я честно сказала, не знала, как докопаться. Я в Делфи не работала никогда раньше, это не моя специализация, а когда дают еще и чужие коды в них разбираться приятного мало, особенно если не работает и особенно если разработчики не знают, отчего у меня трудности и проблемы. И я честно в первом посте призналась, что не знаю отчего трудности, а на компоненту подумала, потому что элементы от нее упоминались в ошибках.

Спасибо Вам за помощь большое, но вот можно обойтись без колкостей?


 
Плохиш ©   (2010-06-23 20:27) [26]


> но вот можно обойтись без колкостей?

А смысл?


 
Плохиш ©   (2010-06-23 20:32) [27]


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

А зачем взяла? Вот честно не понимаю, что ж за контора-такая рога и копыта, где исходники дают кому попало для разбираний.


 
Seally   (2010-06-24 09:01) [28]

ладно, поскольку обсуждение уходит в неперспективное русло переругиваний - всем большое спасибо за помощь )) и удачи


 
Seally   (2010-06-24 09:21) [29]

вот, если кому интересно...
Нужно было в параметрах отладки для оболочки (Tools -> Debugger Options -> Language Exceptions) снять галочку Stop on Delphi Exceptions.
и все заработало )



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

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

Наверх




Память: 0.55 MB
Время: 0.011 c
11-1214765166
<>
2008-06-29 22:46
2010.09.19
Программа, написанная на KOL определяется как вирус!


8-1178559147
BB2000
2007-05-07 21:32
2010.09.19
GDI+ <> canvas.copyrect


2-1277194041
ixen
2010-06-22 12:07
2010.09.19
Фильтрация с задержкой


2-1277184150
Seally
2010-06-22 09:22
2010.09.19
проблема с AdvStringGrid 2.0 в delphi 5


2-1277362042
ther
2010-06-24 10:47
2010.09.19
назначение клавишы для визарда/эксперта