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

Вниз

Как c этим бороться?   Найти похожие ветки 

 
fog   (2006-08-23 20:07) [0]

Дано:

type
 TMyControl = class(TCustomControl)
 private
  FData: array of integer;
  procedure SetData(AD:integer);
 end;

procedure TMyControl.SetData(AD:integer);
begin
SetLength(FData, AD);
end;

function CreateMC(AOwner: TWinControl; AD: integer): TMyControl;
begin
Result := TMyControl.Create(AOwner);
...
with Result do
 begin
   Parent := AOwner;
   Align := alClient;
   {SetLength(Result.FData, 6000);}
   SetData(AD);
 end;
end;


При создании формы имеем:

procedure TForm1.FormCreate(Sender: TObject);
begin
FMC := CreateMC(Form1, 6000);
end;


Суть проблемы - при очередной отладке проги вдруг перестала работать SetData - стал получать EAccessViolation на попытку SetLength. Коментный вариант в CreateMC работает. Что делать?


 
Loginov Dmitry ©   (2006-08-23 22:00) [1]

А может ошибка все-же в другом месте? Здесь патологий вроде не выявлено...


 
Loginov Dmitry ©   (2006-08-23 22:02) [2]

> При создании формы имеем:
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> FMC := CreateMC(Form1, 6000);
> end;


Какое значение тут имеет переменная Form1?
Что будет, если заменить ее на Self?


 
default ©   (2006-08-23 22:31) [3]

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


 
Пусик ©   (2006-08-23 23:12) [4]


>  Коментный вариант в CreateMC работает. Что делать?


Проводить трассировку по шагам и отлаживать.


 
fog   (2006-08-24 00:28) [5]

2 Loginov Dmitry
Self ничего не решает - тоже самое.

2 Пусик
Именно на трассировке и поймал, что валиться SetLength(FData...

Сам факт, что произошло это внезапно. "Заскоки" компилятора мне знакомы еще с D4. Скорее всего придется делать "format c:"...


 
Ketmar ©   (2006-08-24 00:41) [6]

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


 
Пусик ©   (2006-08-24 00:44) [7]


> Именно на трассировке и поймал, что валиться SetLength(FData.
> ..


Убрать with не пробовал?


 
StriderMan ©   (2006-08-24 09:05) [8]

а в чем глубокий смысл использования такого "внешнего" конструктора? Почему бы не написать конструктор в классе контрола?


 
Ega23 ©   (2006-08-24 09:33) [9]

А зачем ты её как Private объявил?
А почему у тебя function CreateMC не class function в секции public?
И вообще, зачем такой изврат?


 
Ketmar ©   (2006-08-24 09:59) [10]

> [9] Ega23 ©   (24.08.06 09:33)
> почему у тебя function CreateMC не class function
фабрика, наверное, недостроенная. %-)


 
Плохиш ©   (2006-08-24 10:55) [11]


> "Заскоки" компилятора мне знакомы еще с D4.

С этого места можно поподробнее про "заскоки"?


 
default ©   (2006-08-24 11:00) [12]

обратите внимание на слово "вдруг" в сабже:)
может у него там вообще потоки подрались за общие данные?:)


 
StriderMan ©   (2006-08-24 11:06) [13]


> Плохиш ©   (24.08.06 10:55) [11]
> С этого места можно поподробнее про "заскоки"?

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

Например Internal Error. Лечится только перезапуском делфи.

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


 
Ega23 ©   (2006-08-24 11:11) [14]


> А еще попробуйте поработать с группой проектов, в которой
> есть BPL-ка. При переключении между модулями разных проектов
> через некоторое время стабильно вываливается AV ну и т.д.
>


Ну у меня их 11 штук в группе проектов. Вываливания AV не наблюдаю.
Что делаю не так?


 
Плохиш ©   (2006-08-24 11:41) [15]


> Ega23 ©   (24.08.06 11:11) [14]
> Что делаю не так?

Во-во, тоже самое спросить хотел.

> StriderMan ©   (24.08.06 11:06) [13]

Не устанавливать все возможные компоненты/программы из разных помоек не пробовали?


 
Anatoly Podgoretsky ©   (2006-08-24 11:57) [16]

Плохиш ©   (24.08.06 11:41) [15]
Сложно


 
StriderMan ©   (2006-08-24 12:02) [17]


> Плохиш ©   (24.08.06 11:41) [15]
> Не устанавливать все возможные компоненты/программы из разных
> помоек не пробовали?


Принципиально не люблю использовать все возможные компоненты/программы . Из нестандартных компонентов у меня установлен только FastReport.


 
Loginov Dmitry_   (2006-08-24 12:09) [18]


> Принципиально не люблю использовать все возможные компоненты/программы
> . Из нестандартных компонентов у меня установлен только
> FastReport.


И даже RXLiba не любишь? Хотябы ради сеточки TRxDBGrid его стоит использовать (стандартная она как бы не серьезная).


 
Anatoly Podgoretsky ©   (2006-08-24 12:13) [19]

Loginov Dmitry_   (24.08.06 12:09) [18]
Я давно, давно убрал и как то жив и даже не тянет


 
StriderMan ©   (2006-08-24 12:17) [20]


> Loginov Dmitry_   (24.08.06 12:09) [18]
> И даже RXLiba не любишь? Хотябы ради сеточки TRxDBGrid его
> стоит использовать (стандартная она как бы не серьезная).

да, наврал. использую TRxMemoryDataSet.

а в чем фишка TRxDBGrid? никогда его не пробовал.


 
fog   (2006-08-24 13:20) [21]

"Заскок" - когда 100% правильная команда либо не компилируется, либо не запускается. Как правило, приходятся на динамические массивы любой мерности и операции с строками.

О "сложности" - простая переделка дельфийского примера:
Delphi7\Demos\ResXplor\HexDump.pas
для моей задачи большего не требуется.

И опять про ВДРУГ -  сначала работало, только довешивал переменные и соотв. функции, и ВДРУГ перестало работать. Причем, переписать с 0 в новом проекте - с тем же успехом.


 
Loginov Dmitry_   (2006-08-24 13:31) [22]


> а в чем фишка TRxDBGrid? никогда его не пробовал.


Исправлена куча глюков обычного DBGrida,
добавлены кое-какие навороты.


 
fog   (2006-08-25 21:19) [23]

Проблему решил.
Приведенная процедура
procedure TMyControl.SetData(AD:integer);
begin
SetLength(FData, AD);
end;

имеет несколько другой вид
procedure TMyControl.SetData;
var AD,
    Y: ingeger;
    X: smallint;
begin
...
SetLength(FData, AD);
...
end;

при редакции убил Y и, таким образом, впервые столкнулся с тем, что меньшее значение нельзя передать через большее (что через byte не пропихнуть int64 - ежу поятно).
Не спасает полный build проекта.
В окне CPU это прекрасно видно.



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

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

Наверх




Память: 0.52 MB
Время: 0.181 c
15-1155653980
TUser
2006-08-15 18:59
2006.09.17
Призывники деградировали


3-1153049615
kaif
2006-07-16 15:33
2006.09.17
Нужна UDF, генерирующая случайные числа


2-1156448729
Анрей
2006-08-24 23:45
2006.09.17
Drug n Drop в Дельфи


15-1156787791
Furyz
2006-08-28 21:56
2006.09.17
Прорицатель ..


2-1156754224
zdm
2006-08-28 12:37
2006.09.17
UpperCase