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

Вниз

использование динамического массива как члена класса   Найти похожие ветки 

 
Igor_   (2002-12-11 18:17) [0]

Подскажите пожайлуста, что делаю не так. У меня членом класса является
динамический массив и при любом к нему обращении вызывается Acces violation.
массив из элементов TDB_Field

type TDB_Field = record
FiedName: string;
Value: variant;
end;//type DBField = record


- при чем исключение вызывается только тогда,
когда я пытаюсь использовать класс, в котором этот массив, когда просто создаю
переменную типа Ar: array of TDB_Field - все нормально

вот объявление и реализация класса:

type TDB_Field = record
FiedName: string;
Value: variant;
end;//type DBField = record


type
TDB_Record = class
public
constructor Create();
procedure Load(Q: TQuery; TablName, KeyField: string; KeyFieldValue: string);
private
_Fields: array of TDB_Field;
end;//TDBRecord = class

implementation

uses
Dialogs;

//------------------------
///// TDBRecord ////
//-------------------------
constructor TDB_Record.Create;
begin
_Fields := Nil; /// ЗДЕСЬ ACCESS VIOLATION !!!
end;
//--------------------------
// загружаем заданную запись из БД
procedure TDB_Record.Load(Q: TQuery; TablName, KeyField: string;
KeyFieldValue: string);
var
i:integer;
begin
// получаем запись из таблицы по указанному ключевому полю
with Q do
begin
Close; SQl.Clear;
SQL.Add("Select * from "+ TablName);
SQL.Add("Where "+KeyField +"="+ KeyFieldValue);
MessageDlg(SQL.Text, mtWarning, [mbOK], 0);
Open;
end;//with Q do

SetLength(_Fields, 0); /// ЗДЕСЬ ТОЖЕ ACCESS VIOLATION !!!
// находим имена полей и их значения
for i:=0 to (Q.Fields.Count - 1) do
begin
SetLength(_Fields, i + 1);
_Fields[i].FiedName := Q.Fields.Fields[i].FieldName;
_Fields[i].Value := Q.Fields.Fields[i].Value;
end;//for i:=0 to (Qt.Fields.Count - 1) do

Q.Close;
end;


где у меня ошибка?
Спасибо.


 
TTCustomDelphiMaster   (2002-12-11 18:34) [1]

constructor TDB_Record.Create;
begin
end;

procedure TDB_Record.Load(Q: TQuery; TablName, KeyField: string;
KeyFieldValue: string);
var
i:integer;
begin
with Q do
begin
Close; SQl.Clear;
SQL.Add("Select * from "+ TablName);
SQL.Add("Where "+KeyField +"="+ KeyFieldValue);
MessageDlg(SQL.Text, mtWarning, [mbOK], 0);
Open;
end;//with Q do

SetLength(_Fields, Q.Fields.Count);
for i:=0 to (Q.Fields.Count - 1) do
begin
_Fields[i].FiedName := Q.Fields.Fields[i].FieldName;
_Fields[i].Value := Q.Fields.Fields[i].Value;
end;//for i:=0 to (Qt.Fields.Count - 1) do

Q.Close;
end;


 
Igor_   (2002-12-12 12:13) [2]

2TTCustomDelphiMaster ©
SetLength(_Fields, Q.Fields.Count)
не помогло, тут тоже возникает исключение - собственно никакой
разницы в подходе я не вижу сразу поставить длину массива или постепенно ее наращивать.

Может кто нибудь еще что подскажет? Или это просто глюк Delphi?


 
VaS   (2002-12-12 13:26) [3]


constructor TDB_Record.Create;
begin
SetLength(_Fields, 0);
end;
...
procedure TDB_Record.Load(Q: TQuery; TablName, KeyField: string;
KeyFieldValue: string);
...
SetLength(_Fields, Q.Fields.Count); (c)TTCustomDelphiMaster
...
destructor TDB_Record.Destroy;
begin
Finalize(_Fields);
end;


 
KSergey   (2002-12-12 13:46) [4]

А вообще-то вот это
_Fields := Nil;
и
SetLength(_Fields, 0);
в конструкторе - нужно ли?
Ну не выделена память - да и ладно. И так это понятно.


 
Бурундук   (2002-12-12 13:52) [5]

VaS © (12.12.02 13:26)
Всё это делается автоматически.

Тут вообще не должно быть проблемы.
Дело тут, возможно, вовсе не в динамическом массиве.
Просто он является единственным полем объекта.

Следующий код
>constructor TDB_Record.Create;
>begin
>_Fields := Nil; /// ЗДЕСЬ ACCESS VIOLATION !!!
>end;
навевает подозрения, что в метод передан неверный Self,
например, из-за неправильного синтаксиса
вызова конструктора типа Obj.Create;


 
Igor_   (2002-12-12 14:08) [6]

2Бурундук
По моему что-то вроде этого и происходит, т.к. исключение вызывается вообщем при любом обращении к массиву.
А как вообще проверить какой Self передан?
И можно поподробнее на счет "из-за неправильного синтаксиса
вызова конструктора типа Obj.Create" - как это отследить?


 
Бурундук   (2002-12-12 14:21) [7]

Объект должен быть создан так:
var Rec: TDB_Record;

Rec := TDB_Record.Create(...);
// а не Rec.Create(...); - вот что я имел ввиду под
// неправильным синтаксисом.

А чтобы проверить, валидный ли селф, попробуй убрать из
конструктора _Fields := nil;
(при конструировании все поля автоматически обнуляются и так)
и вызови какую-нибудь ф-ю, например, ClassName -
и посмотри, не будет ли AV, а также, что она возвратит.


 
Fantasist   (2002-12-12 21:23) [8]


> навевает подозрения, что в метод передан неверный Self,
>


Вообще-то, Self в конструктор, строго говоря, не передается - он его конструирует. Однако, при вызове через переменную, компилятор заносит ее в регистр, и высталяет специальный флаг, по которому внутри кода конструктора определяется, что конструировать self(в смысле выделять для него память) не надо, и в него попадает значение сохраненное в регистре. Так что догадка скорее всего верна.



> И можно поподробнее на счет "из-за неправильного синтаксиса
>
> вызова конструктора типа Obj.Create" - как это отследить?


Отследить это можно так:
в конструкторе
>constructor TDB_Record.Create;
>begin
>_Fields := Nil; /// ЗДЕСЬ ACCESS VIOLATION !!!
>end;

ставишь брекпойнт на begin. Когда он вызовется нажимаешь Ctrl+F7, и вводишь dl. Если видишь значение 1 - то вызов был произведен как это обычно положенно. Если нет, то вызов был произведен через переменную, что, скорее всего, не правильно. Так в Delphi6. Далее открываешь окно Call Stack, и находишь откуда конструктор вызван - идешь в это метод и смотришь.


 
Matolch   (2002-12-13 08:02) [9]

/// ЗДЕСЬ ACCESS VIOLATION !!!


 
Igor_   (2002-12-13 10:11) [10]

2Matolch © ??? - спасибо за совет!!!!

2Бурундук - действительно спасибо, тут динамический массив не при чем, это я прогнал - по дурацки вызвал конструктор TDB_Record. Сделал правильный вызов и все заработало. Спасибо.


 
Matolch   (2002-12-13 10:31) [11]

Пыттался раззарядить атомосферу
А так - ну, не за что, пожалста. (краснею и шаркаю ножкой)


 
Igor_   (2002-12-13 17:28) [12]

:)



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

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

Наверх





Память: 0.48 MB
Время: 0.007 c
1-74731
RAA
2002-12-13 23:11
2002.12.23
Создание формы без использования модуля forms


14-74971
kronprince
2002-12-03 10:26
2002.12.23
Раньше мне эта затея DeMoN-777 казалась глупой :(


3-74565
Shaman
2002-12-03 17:21
2002.12.23
Значение поля кот. было до обновления в триггере FOR UPDATE


7-75009
olphi
2002-10-20 15:50
2002.12.23
Как узнать путь каталога Windows?


1-74730
Витьок
2002-12-14 10:39
2002.12.23
TTreeView





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