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

Вниз

Люди, помогите отладить «List out of bounds» :)   Найти похожие ветки 

 
Kolan ©   (2007-03-21 09:38) [0]

четвёртый день длблюсь :(
Если не включать отладочную информацию, то при исключении вообще код не показывает&#133
Если включить, то показвывает этот код:

procedure TWinControl.PaintHandler(var Message: TWMPaint);
var
 I, Clip, SaveIndex: Integer;
 DC: HDC;
 PS: TPaintStruct;
begin
 DC := Message.DC;
 if DC = 0 then DC := BeginPaint(Handle, PS);
 try
   if FControls = nil then PaintWindow(DC) else
   begin
     SaveIndex := SaveDC(DC);
     try
       Clip := SimpleRegion;
       for I := 0 to FControls.Count — 1 do
         with TControl(FControls[I]) do
           if (Visible and (not (csDesigning in ComponentState) or not (csDesignerHide in ControlState)) or
             ((csDesigning in ComponentState) and not (csDesignerHide in ControlState)) and
             not (csNoDesignVisible in ControlStyle)) and
             (csOpaque in ControlStyle) then
           begin
             Clip := ExcludeClipRect(DC, Left, Top, Left + Width, Top + Height);
             if Clip = NullRegion then Break;
           end;
       if Clip <> NullRegion then PaintWindow(DC);
     finally
       RestoreDC(DC, SaveIndex);
     end;
   end;
   PaintControls(DC, nil);
 finally
   if Message.DC = 0 then EndPaint(Handle, PS);
 end;
end;


Выделеная строка &#151; на ней исключение&#133

Я нашел участок кода, комментирование которого устраняет исключеие
Этот участок связан с рисованием графика на Чарте&#133


 
Ega23 ©   (2007-03-21 09:44) [1]

Ну и...? Где этот участок-то?


 
Kolan ©   (2007-03-21 09:45) [2]

> Ну и&#133? Где этот участок-то?

procedure TMeasurmentGraph.Draw(Measurment: TMeasurment);
var
 X, Y: TParam;
begin
 // DONE: Сделать резонанс и антирез в TMeasurment. Сечас он nil.
 with Measurment.ElementCharacteristicSet do
 begin
   BeginUpdate;
   try
       FRealPart.LineGraph.Draw(RealConductivity);
       FImaginativePart.LineGraph.Draw(ImaginativeConductivity);
       FModule.LineGraph.Draw(ConductivityModule);
   finally
     EndUpdate;
   end;
 end;    
 FRealPart.ResonanceGraph.Clear;
 if Measurment.ParamsList <> nil then
   with Measurment.ParamsList do
   begin
     if Count <> 0 then
     begin
       X := Names[rsValuesResX];
       Y := Names[rsValuesResY];
       if (X <> nil) and (Y <> nil) then
         FRealPart.ResonanceGraph.AddXY(X.Value, Y.Value);
     end;
   end;
end;

Вот он :)

procedure TSerieGraph.Draw(Arr: TDoublePointArray);
var
 I: Integer;
begin
 //FSerie.BeginUpdate;
 try
   Clear;
   for I := Low(Arr) to High(Arr) do
   begin
     AddXY(Arr[I].X, Arr[I].Y*1000);
     //Sleep(10);
   end;
 finally
   //FSerie.EndUpdate;
 end;        
end;


Если что еще надо выложу ессно&#133


 
Ega23 ©   (2007-03-21 09:59) [3]


> Measurment.ParamsList


ParamsList - это что?


 
Kolan ©   (2007-03-21 11:28) [4]

ParamsList &#151; это что?
Вот это:

 TParam = class
 strict private
   FName:string;
   FValue:Double;
   FCaption: string;
   FFormatString: string;
   FDimensionality: string;
 private
   function GetDimensionality: string;
   procedure SetDimensionality(const Value: string);
   procedure SetValue(val : double);
   function GetValue : double;
   procedure SetName(val : string);
   function GetName : string;
   function GetFormatString: string;
   procedure SetFormatString(const Value: string);
   function GetCaption: string;
   procedure SetCaption(const Value: string);
 public
   property Name :  string read GetName write SetName;
   property Value : double read GetValue write SetValue;
   property Caption: string read GetCaption write SetCaption;
   property FormatString: string read GetFormatString write SetFormatString;
   property Dimensionality:string read GetDimensionality write SetDimensionality;
   procedure Assign(Param: TParam);
   constructor Create;
 end;

 TParamsList = class(TObjectList)
 private

   function GetItems(Index: Integer): TParam;
   function GetNames(Name: string): TParam;
 protected
 public
   function Add(Param: TParam): Integer;
   procedure AddNewParam(ParamName: string;
     ParamValue: Double;
     Format: string = ""; ValueDimensionality: string = "");
   procedure SaveToFile(FileName: string);
   procedure Assign(ParamsList: TParamsList);
   property Items[Index: Integer]: TParam read GetItems; default;
   property Names[Name: string]: TParam read GetNames;
 end;

 TMeasurment = class
 strict private
   function GetParamsList : TParamsList;
   function GetElementCharacteristicSet : TElementCharacteristicSet;
 private var
   FElementCharacteristicSet:TElementCharacteristicSet;
   FParamsList:TParamsList;
   {FUserRange: TUserRange; }
 public
   property ElementCharacteristicSet :
     TElementCharacteristicSet read GetElementCharacteristicSet;

   property ParamsList : TParamsList read GetParamsList;

   constructor Create;
   destructor Destroy; override;
   procedure Clear;
   {property UserRange: TUserRange read FUserRange write FUserRange;}
 end;


Этот каод лежит в модуле KFreGrafMeasurmentObjects, а сам этот модуль в пакете KFreGrafMeasurments&#133


 
ЮЮ ©   (2007-03-21 12:05) [5]


> Выделеная строка — на ней исключение…
>
> Я нашел участок кода, комментирование которого устраняет
> исключеие


Вызови View > Debug Windows > Call Stack и увидишь точное место вызова этого метода и место вызова метода, вызвашего метод и т.д. и т.п.

В конце концов, у тебя код. У нас лишь обрывки,


 
umbra ©   (2007-03-21 12:20) [6]

а что такое FControls?


 
Kolan ©   (2007-03-21 12:49) [7]

> а что такое FControls?

Надо спроить у того кто делал:
procedure TWinControl.PaintHandler(var Message: TWMPaint);


 
ЮЮ ©   (2007-03-21 13:12) [8]


> umbra ©   (21.03.07 12:20) [6]


> Kolan ©   (21.03.07 12:49) [7]



{*******************************************************}
{                                                       }
{       Borland Delphi Visual Component Library         }
{                                                       }
{  Copyright (c) 1995-2001 Borland Software Corporation }
{                                                       }
{*******************************************************}

unit Controls;


Вот только ошибки в их коде чаше всего из-за наших ошибок :)
Р.S. зачем закомментировал  
//FSerie.BeginUpdate;
//FSerie.EndUpdate;
? Без подобных скобок валится и ValueEditor c такой же ошибкой.


 
Kolan ©   (2007-03-21 13:14) [9]

> //FSerie.BeginUpdate;
> //FSerie.EndUpdate;

Стоял хреновый TChart 7 pro
Снес, в стандартном этого нет, к сожалению&#133


 
Kolan ©   (2007-03-21 13:15) [10]


> Вот только ошибки в их коде чаше всего из-за наших ошибок
> :)

Я и не пытаюсь с этим спорить :)


 
Kolan ©   (2007-03-22 08:04) [11]

> Вызови View > Debug Windows > Call Stack


:7c81eb33 kernel32.RaiseException + 0x52
:51f3155a TList.Get + $1E
:51f3155a TList.Get + $1E
:0047613b TCustomAxisPanel.InternalDraw + $16F
:004689d4 TCustomTeePanel.Draw + $124
Controls.TWinControl.PaintHandler((15, 0, 0, 0))
Controls.TWinControl.WMPaint((15, 0, 0, 0))
Controls.TCustomControl.WMPaint((15, 0, 0, 0))
Controls.TControl.WndProc((15, 0, 0, 0, 0, 0, 0, 0, 0, 0))
Controls.TWinControl.WndProc((15, 0, 0, 0, 0, 0, 0, 0, 0, 0))
Controls.TWinControl.MainWndProc((15, 0, 0, 0, 0, 0, 0, 0, 0, 0))
:51f40bb2 StdWndProc + $16
:77d38709 USER32.GetDC + 0x72
:77d387eb ; C:\WINDOWS\system32\USER32.dll
:77d3b368 ; C:\WINDOWS\system32\USER32.dll
:77d3b3b4 ; C:\WINDOWS\system32\USER32.dll
:7c90eae3 ntdll.KiUserCallbackDispatcher + 0x13
:77d3bccc USER32.DispatchMessageA + 0xf
Forms.TApplication.ProcessMessage((395196, 15, 0, 0, 436968, (313, 70)))
Forms.TApplication.HandleMessage
Forms.TApplication.Run
KFreGraf.KFreGraf
:7c816d4f kernel32.RegisterWaitForInputIdle + 0x49


Блин, а может среду переустановить?


 
Kolan ©   (2007-03-22 08:08) [12]

> Блин, а может среду переустановить?

Может это чертов чарт&#133:(


 
ЮЮ ©   (2007-03-22 10:17) [13]


> [0] Kolan ©   (21.03.07 09:38)
то показвывает этот код:

procedure TWinControl.PaintHandler(var Message: TWMPaint);



> :7c81eb33 kernel32.RaiseException + 0x52
> :51f3155a TList.Get + $1E
> :51f3155a TList.Get + $1E
> :0047613b TCustomAxisPanel.InternalDraw + $16F
> :004689d4 TCustomTeePanel.Draw + $124
> Controls.TWinControl.PaintHandler((15, 0, 0, 0))


Как видишь, ошибка далеко не в TWinControl.PaintHandler, а в TCustomAxisPanel.InternalDraw

Это лишний раз доказывает о том, что не следует использовть компоненты без исходников, пусть они даже включены в палитру. Или использовать их аккуратно. Боюсь, что в твоем коде

procedure TSerieGraph.Draw(Arr: TDoublePointArray);
var
I: Integer;
begin
//FSerie.BeginUpdate;
try
  Clear;
  for I := Low(Arr) to High(Arr) do
  begin
    AddXY(Arr[I].X, Arr[I].Y*1000);
    //Sleep(10);
  end;
finally
  //FSerie.EndUpdate;
end;        
end;  


перерисовка вызывается очень часто и не всегда данные корректны для этого. BeginUpdate;... EndUpdate; хренового TChart 7 pro позволяли хотя бы сначала сформировать серию, а затем отрисовать.

Кстати, TSerieGraph - твой класс? От кого унаследован?


> Может это чертов чарт…:(

Это он :)

> Блин, а может среду переустановить?

Это не поможет. По четвергам будет то же самое :)


 
ЮЮ ©   (2007-03-22 10:19) [14]

>Кстати, TSerieGraph - твой класс? От кого унаследован?
этот же вопрос и по части TMeasurmentGraph


 
Kolan ©   (2007-03-22 13:48) [15]

> перерисовка вызывается очень часто

Очень очень часто &#151; этот правда. А еще есть режим когда не часто, и тогда все ок&#133


> BeginUpdate;&#133 EndUpdate

Где бы взять нормальный про :(


> Или использовать их аккуратно.

У меня нет выбора что еще использовать? Чтобы аналогично &laquo;чарту&raquo; было?


> Кстати, TSerieGraph &#151; твой класс? От кого унаследован?

Мой &#151; это оберка над Series, вот:

TCustomGraph = class abstract
 strict private
   FColor: TColor;
 strict protected
   function GetColor: TColor;  virtual;
   procedure SetColor(const Value: TColor); virtual;
 public
   procedure SetVisible(const Value: Boolean); virtual; abstract;
   procedure SetHighlighted(const Value: Boolean); virtual; abstract;

   procedure Clear;virtual;  abstract;
   property Color: TColor read GetColor write SetColor;
   constructor Create(Chart: TChart; Color: TColor); virtual;
   procedure BeginUpdate; virtual; abstract;
   procedure EndUpdate; virtual; abstract;
 end;

 TSerieGraph = class(TCustomGraph)
 strict protected
   FChart: TChart;
   FSerie: TChartSeries;
   function CreateSerie(AOwner: TComponent): TChartSeries; virtual;
   procedure SetColor(const Value: TColor); override;
 public
   procedure AddXY(X, Y: Double);
   procedure Draw(Arr: TDoublePointArray);
   procedure Clear; override;
   constructor Create(Chart: TChart; Color: TColor); override;
   destructor Destroy; override;
   procedure SetVisible(const Value: Boolean); override;
   property Serie: TChartSeries read FSerie;
   procedure BeginUpdate; override;
   procedure EndUpdate; override;
 end;

TMeasurmentGraph = class(TCustomGraph)
 strict private
   FImaginativePart:TTripleGraph;
   FModule:TTripleGraph;
   FRealPart:TTripleGraph;
   FClickEvent: TMeasurmentGraphClick;
   FChart: TChart;
 strict protected
   function CreateTripleGraph(Chart: TChart; Color: TColor): TTripleGraph;virtual;
   procedure DoSerieClick(Sender: TChartSeries; ValueIndex: Integer;
     Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   procedure SetColor(const Value: TColor); override;  
 public
   constructor Create(Chart: TChart; Color: TColor); override;
   destructor Destroy; override;
   procedure Draw(Measurment: TMeasurment);
   property RealPart: TTripleGraph read FRealPart;
   property ImaginativePart: TTripleGraph read FImaginativePart;
   property Module: TTripleGraph read FModule;

   procedure SetHighlighted(const Value: Boolean); override;
   procedure Clear; override;
   procedure SetVisible(const Value : Boolean); override;
   property OnClick: TMeasurmentGraphClick read
     FClickEvent write FClickEvent;
   procedure BeginUpdate; override;
   procedure EndUpdate; override;
 end;


 
Kolan ©   (2007-03-22 13:49) [16]

> Как видишь, ошибка далеко не в TWinControl.PaintHandler,
> а в TCustomAxisPanel.InternalDraw

Как вы это поняли?


 
Kolan ©   (2007-03-22 13:51) [17]

> ЮЮ

Благодарю, хоть буду знать в чем дело&#133


 
ЮЮ ©   (2007-03-23 03:34) [18]

> Как вы это поняли?


Так на то это и стэк вызовов. Ошибка возникла в TList.Get, т.е. как раз  «List out of bounds» при попытке обратиться к несуществующему элкеенту в методе TCustomAxisPanel.InternalDraw, который в свою очередь был вызван в методе TCustomTeePanel.Draw, ... который был вызван при обраотке сообщения TWinControl.MainWndProc((15,... т.е. элементарного WM_PAINT ...
Т.е. твоя обёртка создала такой TChart( кстати она его создает или использует уже созданный?), что оно даже отрисоваться не может.

Вот только корень стека RegisterWaitForInputIdle слегка настораживает. Я обычно привык видеть стек (D6/D7) в таком виде

TMComboBox.DoDropDownKeys(40,[])
TMComboBox.WndProc((256, 40, 22020097, 0, 40, 0, 1, 336, 0, 0))
TWinControl.MainWndProc((256, 40, 22020097, 0, 40, 0, 1, 336, 0, 0))
StdWndProc(1247458,256,40,22020097)
TApplication.ProcessMessage((1247458, 256, 40, 22020097, 253231500, (151, 244)))
TApplication.HandleMessage
TApplication.Run
Project1


 
GrayFace ©   (2007-03-24 18:19) [19]

Kolan ©   (22.03.07 13:48) [15]
> перерисовка вызывается очень часто
Очень очень часто — этот правда.

Можно слать WM_SETREDRAW.


 
Kolan ©   (2007-03-24 18:23) [20]

> ( кстати она его создает или использует уже созданный?),
>

Использует созданый. что оно даже отрисоваться не может.
А я тут причем? Если медленно то отрисовавается, а обертка просто для управления сериями(их много).


> Можно слать WM_SETREDRAW.

Не понял что вы предлогаете&#133


 
GrayFace ©   (2007-03-24 21:03) [21]

Его используют BeginEdit"ы и EndEdit"ы. Отключает и включает перерисовку окна.


 
Kolan ©   (2007-03-24 21:04) [22]

> Его используют BeginEdit"ы и EndEdit"ы.

А понял &#151; можно испробовать, благодарю.



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

Форум: "Начинающим";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.042 c
11-1143026595
Unknown Mystic
2006-03-22 14:23
2007.04.15
Задание StateImage для эл-тов TKOLTreeView при создании формы.


5-1137671677
Игорь Шевченко
2006-01-19 14:54
2007.04.15
Как автоматизировать замену значений свойств в формах ?


15-1174302327
vajo
2007-03-19 14:05
2007.04.15
Total Commander


2-1174914935
VitAngel
2007-03-26 17:15
2007.04.15
Вопрос по CopyFile


9-1147026510
QuickFinder
2006-05-07 22:28
2007.04.15
Программирование настольных логических игр





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