Форум: "Начинающим";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
ВнизЛюди, помогите отладить «List out of bounds» :) Найти похожие ветки
← →
Kolan © (2007-03-21 09:38) [0]четвёртый день длблюсь :(
Если не включать отладочную информацию, то при исключении вообще код не показывает…
Если включить, то показвывает этот код: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;
Выделеная строка — на ней исключение…
Я нашел участок кода, комментирование которого устраняет исключеие
Этот участок связан с рисованием графика на Чарте…
← →
Ega23 © (2007-03-21 09:44) [1]Ну и...? Где этот участок-то?
← →
Kolan © (2007-03-21 09:45) [2]> Ну и…? Где этот участок-то?
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;
Если что еще надо выложу ессно…
← →
Ega23 © (2007-03-21 09:59) [3]
> Measurment.ParamsList
ParamsList - это что?
← →
Kolan © (2007-03-21 11:28) [4]ParamsList — это что?
Вот это: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…
← →
ЮЮ © (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
Снес, в стандартном этого нет, к сожалению…
← →
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]> Блин, а может среду переустановить?
Может это чертов чарт…:(
← →
ЮЮ © (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]> перерисовка вызывается очень часто
Очень очень часто — этот правда. А еще есть режим когда не часто, и тогда все ок…
> BeginUpdate;… EndUpdate
Где бы взять нормальный про :(
> Или использовать их аккуратно.
У меня нет выбора что еще использовать? Чтобы аналогично «чарту» было?
> Кстати, TSerieGraph — твой класс? От кого унаследован?
Мой — это оберка над 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]> ЮЮ
Благодарю, хоть буду знать в чем дело…
← →
ЮЮ © (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.
Не понял что вы предлогаете…
← →
GrayFace © (2007-03-24 21:03) [21]Его используют BeginEdit"ы и EndEdit"ы. Отключает и включает перерисовку окна.
← →
Kolan © (2007-03-24 21:04) [22]> Его используют BeginEdit"ы и EndEdit"ы.
А понял — можно испробовать, благодарю.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.042 c