Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.037 c
2-1155573235
serko
2006-08-14 20:33
2006.09.17
Сетевая база!


1-1154447905
TStas
2006-08-01 19:58
2006.09.17
Можно ли как-то поубивать запущенные процессы Ворда и Экселя?


2-1156528209
Vidog
2006-08-25 21:50
2006.09.17
Функции


15-1155497541
VirEx
2006-08-13 23:32
2006.09.17
JDMClient


2-1156712447
иван8511
2006-08-28 01:00
2006.09.17
Печать без прокрутки страницы




   Наверх