Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Вниз

проблема с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.006 c
2-1277196510
Who_is_you?
2010-06-22 12:48
2010.09.19
сбои в асинхронном приеме с сом порта


15-1276851347
Kerk
2010-06-18 12:55
2010.09.19
Кто-нибудь сталкивался с nosql-базами?


3-1243862381
TheEd
2009-06-01 17:19
2010.09.19
Отображение изменений, внесённых в БД другими пользователями


2-1277283818
12
2010-06-23 13:03
2010.09.19
Научите работать, как работает ShowMessageFmt


15-1277224079
М. Береговой
2010-06-22 20:27
2010.09.19
Переключатель источника питания для ноутбука?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский