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

Вниз

Почему датасоурс Nil (не определяется)? (выдает ошибку)Что не так   Найти похожие ветки 

 
Abcdef123   (2007-06-21 12:50) [0]

TFRM_Grid = class(TForm_parent)
private
   InDataSet : TDataSet;
   InDataSrc : TDataSource;
end;
constructor TFRM_Grid.Create(AOwner: TComponent; DtSet : TDataSet);
begin
 Self.InDataSet := DtSet;
 Self.InDataSrc.DtSet := DtSet;
 Create(AOwner);
end;


 
Плохиш ©   (2007-06-21 12:54) [1]

Потому, что перед использованием объект надо создать, а этого в твоём коде не наблюдается...


 
Desdechado ©   (2007-06-21 12:55) [2]

Что ты этим кодом хочешь сделать?
Причем тут формы?
Где inherited?


 
Ega23 ©   (2007-06-21 13:52) [3]


> Потому, что перед использованием объект надо создать, а
> этого в твоём коде не наблюдается...


1. DataSource не создан
2. Не наблюдаю inherited Create
3. constructor нефигово по-другому назвать...


 
Однокамушкин   (2007-06-21 15:09) [4]


> Ega23 ©   (21.06.07 13:52) [3]
> 1. DataSource не создан

С чего вы это взяли? Тут же не показано, с какими параметрами вызывается конструктор и что передаётся в качестве DtSet, может, там всё нормально...

> 2. Не наблюдаю inherited Create

Там же есть вызов Create(AOwner); - это и есть вызов конструктора предка... так как конструктор предка имеет другое имя, тут inherited писать не обязательно, и так всё однозначно...

> 3. constructor нефигово по-другому назвать...

Почему? Даже в VCL полно классов, у которых есть конструкторы, которые называются не Create: TWinControl, TComObject, TDataModule...


 
Anatoly Podgoretsky ©   (2007-06-21 15:13) [5]

> Однокамушкин  (21.06.2007 15:09:04)  [4]

> С чего вы это взяли? Тут же не показано, с какими параметрами вызывается конструктор

Поэтому можно считать что угодно, полный карт-бланш


 
Ega23 ©   (2007-06-21 15:14) [6]


> С чего вы это взяли? Тут же не показано, с какими параметрами
> вызывается конструктор и что передаётся в качестве DtSet,
>  может, там всё нормально...


Как Вы полагаете, с какого фига на выделенной строке валится ошибка? Причём, сильно подозреваю, что AccessViolation.


 
Ega23 ©   (2007-06-21 15:18) [7]


> Тут же не показано, с какими параметрами вызывается конструктор
> и что передаётся в качестве DtSet


В качестве DtSet передаётся указатель на экземпляр класса-потомка TDataSet. nil он, или явный адрес - в данном случае роли не играет.
А вот то, что непосредственно в конструкторе данный параметр присваивается полю InDataSrc, которое имеет вполне конкретный класс TDataSource, создание которого я нигде не вижу. И сильно подозреваю, что в выделенной строке InDataSrc=nil.


 
Плохиш ©   (2007-06-21 15:45) [8]


> Однокамушкин   (21.06.07 15:09) [4]
>
> > Ega23 ©   (21.06.07 13:52) [3]
> > 1. DataSource не создан
>
> С чего вы это взяли? Тут же не показано, с какими параметрами
> вызывается конструктор и что передаётся в качестве DtSet,
>  может, там всё нормально...

Каким боком здесь замешались передаваемые параметры, если пытаются присвоить какое-то значение свойству объекта, ссылка на который должна храниться в приватной переменной InDataSrc и которой(переменной) ничего в конструкторе не было присвоено. Это конструктор, не забываем, до вызова стоящего в нём кода для создаваемого объекта выделяется только память и ничего больше не создаётся.


 
Abcdef123   (2007-06-21 18:33) [9]

Насчет Inherited - Однокамушкин правильно прокомментировал Create(AOwner); так же работает.
To Desdechado [2]
У меня задача из одной формы привнести некоторые выбранные данные по query и дальше на другой форме поместить данные в DBGrid и работать в этом гриде.Поэтому при создании новой формы я пытаюсь прихватить этот DataSet из прежней формы, как параметр.
Причем,  в указанном коде строка Self.InDataSet := DtSet; вполне читает этот датасет, и я подумала, что я могу датасоурсе назначить, ссылаясь на этот датасет в виде строки Self.InDataSrc.DtSet := DtSet; НО, вот тут и показывает, что значение датасоурса Nil, и дальше идет ошибка AccessViolation, как правильно предположила Ega23.
Я пыталась создать датасоурс, но у меня вылезала ругалось на создание. Похоже, я не умею создавать датасоурс, подскажите, плз, как прописать правильно.


 
Ega23 ©   (2007-06-21 18:39) [10]


> как правильно предположила Ega23.


Вообще-то мне 31 год завтра исполняется, вешу я 110 кг, служил срочную в спецназе, бородат и вообще мужик. Так, к слову.

Что касается твоей проблемы:
1. Я бы на твоём месте использовал DataModule для хранения данных. Тогда не надо привязываться к какой-то там форме.
2. Нафига тебе передавать эти параметры в конструкторе? Может, лучше прямо свойство сделать?
3. Если всё-таки хочется, то код должен быть таким:
constructor TFRM_Grid.Create(AOwner: TComponent; DtSet : TDataSet);
begin
InDataSrc := TDataSource.Create(Self);
InDataSet := DtSet;
InDataSrc.DtSet := DtSet;
inherited Create(AOwner);
end;


 
Abcdef123   (2007-06-21 19:11) [11]

To Ega23 [10]
Ну, по нику было нетрудно пол перепутать, на будущее буду иметь в виду :-)
За код - спасибо!
Насчет DataModule - он есть, и там хранятся все основные таблицы и запросы, это уже существующий проект, просто мне дали задачу дописать кое какую примочку. Поэтому я решила этот запрос не помещать в Datamodule, а просто тащить выбранные пользователем на форме данные в следующую форму как dataset параметр. А дошла я до создания конструктора не от избытка ума, а просто, честно говоря, не получилось по другому, поскольку родитель формы замороченный попался.
Вот вы советуете свойство сделать, как это? Может это вообще будет гораздо лучше, чем мои заморочки?


 
Anatoly Podgoretsky ©   (2007-06-21 19:40) [12]

Ега и Яга - это разные слова.


 
Ega23 ©   (2007-06-22 09:42) [13]


> Вот вы советуете свойство сделать, как это? Может это вообще
> будет гораздо лучше, чем мои заморочки?


Давай ещё раз с самого начала: какие исходные данные и какая стоит задача?
Напиши, плиз, подробно, что-нибудь придумаем.


 
Abcdef123   (2007-06-23 20:01) [14]

To Ega23[13]:
Участвовать в задаче будут 3 таблицы
Table1: поля No, Serv,....
Table2: поля No_tbl1, Serv,ReadNo_tbl3,...
Table3: поля No_tbl1, Serv_tbl3,ReadNo,...

задача такая: Существует проект,на одной из форм проекта показаны данные Table1 (например на записи Table1.No=5, далее из этой формы по кнопке открывается другая форма с данными Table3 (показываются только записи, у которого Table3.No_tbl1=5). И, к примеру, курсор стоит на записи Table3.No_tbl1=5 и Table3.ReadNo="002". И вот тут мне дали задачу, чтоб на форме2 по кнопке открывалась новая форма3 с данными Table2 (выбор данных из Table2 идет такой:Table2.No_tbl1=5 и Table2.ReadNo_tbl3="002".)Этот набор данных я должна выдать в DBGrid, но с дополнительной колонкой на гриде CheckBox, чтоб пользователь прошелся по гриду, отметил на checkbox записи,с которыми будет проводить некоторые Update Table2 единым разом, по кнопке сохранить. После закрытия формы3, на форме 2,в соответствии с помеченными записями в гриде, мне надо Update текущую запись Table3.
Для Информации уточняю, что все таблицы прописаны в Датамодуле, и в основном,в проекте идет работа через таблицы, а я Датасет в форму3 тяну чезез создание query с указанным критерием полей.
Итак, на данный момент,то, что вы подсказали с датасоурс -получилось, но,как я уже сказала раньше, есть сомнения,может я зря тяну Датасет из формы в форму. И второй вопрос, над которым я бьюсь уже несколько дней - как реализовать вот этот checkbox в гриде, чтоб помечать записи.Я добавила в датамодуле в таблице2 дополнительное поле типа Calculated,прочла документацию с использованием такого типа поля, но наверно я что-то не понимаю все равно, могу я записывать значение в это поле, когда кликну на checkbox или нет? У меня не получается, ругается при попытке записи, что поле не существует, хотя в гриде поле это показывает.Если нельзя в такое поле записывать, то я должна дополнительно StringList создавать что ли и туда писать? Вэтом случае надо еще заморачиваться данные грида с этим stringList связывать. В общем,не знаю, как реализовать.
И, еще, к слову, у меня еще есть возможность использовать вместо DBGrid компонент TdxDBGrid, в нем уже есть тип колонки Checkbox, не надо искуственно создавать, как в DBGrid, но с calculated полем все равно не проходит.Подскажите, как мне оперировать с таким типом поля.
Если что не совсем понятно написала, спросите, я поясню. Очень жду ответа!      
Заранее Спасибо!


 
Плохиш ©   (2007-06-23 20:25) [15]


> Abcdef123   (23.06.07 20:01) [14]

Слишком многа бУквав
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168


 
Abcdef123   (2007-06-24 08:23) [16]

to Плохишх[15]
1Много букав :-) это Ega23 попросил подробно описать, что я и сделала, поскольку это в моих интересах, человек помощь предложил. :-)
2. Насчет ссылки - Я этот проект смотрела уже раньше, в этом проекте идет через создание списка, а поскольку у меня еще и дальше нужно работать с помеченным датасет, то создание списка - не самый простой вариант в моем случае, так что вопрос насчет поля типа calculated  все же остался, можно как-то при крыжике менять значение calculated field или нельзя?


 
Плохиш ©   (2007-06-24 11:43) [17]


>  меня не получается, ругается при попытке записи, что поле
> не существует, хотя в гриде поле это показывает

Вычисляемые поля не преднозначены для того, чтобы в них чего-то записывать из вне, а только для расчётов в OnCalculateField.

> еще и дальше нужно работать с помеченным датасет, то создание
> списка - не самый простой вариант в моем случае

Судя по "много букав", то это самый простой способ...


 
Abcdef123   (2007-06-24 12:34) [18]

To Плохиш [17]
Под понятие "Извне" уже подходит анализ события клик на гриде?
Вот я полагала (и пыталась реализовать, но безуспешно) - когда кликаешь на записи в грид, то по событию клик пыталась подключить обработку процедуры OnCalculateField, в которой я прописала для calculated field "Check":
Table.FieldByName("Check").AsBoolean:= not  (Table.FieldByName("Check").AsBoolean);
то есть я полагала, что хотя бы в сеансе работы программы должно запоминаться и меняться значение вычисляемого поля. Получается, что даже это невозможно?


 
Плохиш ©   (2007-06-24 16:04) [19]


> я полагала, что хотя бы в сеансе работы программы должно
> запоминаться и меняться значение вычисляемого поля.

Вычисляемое поле не сохраняется, а вычисляется в момент потребности.


 
Abcdef123   (2007-06-27 09:45) [20]

Итак, пытаюсь реализовать у себя пример, на который меня здесь направил Плохиш[15].У меня отличие, что уникальность - два поля, а не одно. Так что я прописываю значение в список выбранных строк:
Value:=DataSource1.DataSet.fieldByName("PlantNo").AsString+DataSource1.DataSet.FieldByName("ServCode").AsString;
       IF ListSelect.Count > 0 Then
           IF ListSelect.IndexOf(Pointer(Value)) >=0
           Then ListSelect.Delete(ListSelect.IndexOf(Pointer(Value)))
           Else Begin
                  ListSelect.Add(Pointer(Value));
           End
           Else Begin
                  ListSelect.Add(Pointer(Value));
           End;
Записывать значение - записывает, но потом не находит (строка где не срабатывает - указана жиным шрифтом. И, галочка тоже не рисуется, не знаю, по той же причине или по другой. Что не так? Может Pointer не работает по сумме друх полей?


 
Ega23 ©   (2007-06-27 09:49) [21]

ListSelect - это что? Какой класс?


 
Abcdef123   (2007-06-27 09:52) [22]

ListSelect : TList;


 
Ega23 ©   (2007-06-27 10:05) [23]

Зачем TList, если у тебя строковое значение????
Используй TStringList без приведения значения Value к Pointer


 
Abcdef123   (2007-06-27 10:17) [24]

ListSelect : TStringList; //TList;

       Value:=DataSource1.DataSet.fieldByName("PlantNo").AsString+DataSource1.DataSet.FieldByName("ServCode").AsString;
       IF ListSelect.Count > 0 Then
           IF ListSelect.IndexOf(Value) <> 0
           Then ListSelect.Delete(ListSelect.IndexOf(Value))
           Else Begin
                  ListSelect.Add(Value);
           End
           Else Begin
                  ListSelect.Add(Value);
           End;

Так? Если да, то сразу говорю, тоже не работает :-(


 
Ega23 ©   (2007-06-27 10:20) [25]

У тебя else к какому if"у относится?


 
Плохиш ©   (2007-06-27 11:00) [26]


> Abcdef123   (27.06.07 10:17) [24]

Дурдом

 idx := ListSelect.IndexOf(Value);
 if idx >= 0 then ListSelect.Delete(idx)
 else ListSelect.Add(Value);


 
Abcdef123   (2007-06-27 16:42) [27]

извините, что не сразу ответила, у меня получилось, но мое сообщение сюда на сайт - не ушло, выдало ошибку. Вот сейчас только зашла еще раз попытаться.
Ega23 и Плохиш - большое вам спасибо за терпение и помощь! :-) Я очень благодарна!


 
Плохиш ©   (2007-06-27 18:33) [28]

Главное, чтобы было понято, почему код в [24] работал не так как ожидалось :-)


 
Abcdef123   (2007-06-28 04:41) [29]

да, я поняла, спасибо :-)



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

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

Наверх




Память: 0.54 MB
Время: 0.047 c
15-1178181667
Steep
2007-05-03 12:41
2007.07.22
Как отговорить ставить линуксы?


2-1183046437
smaller
2007-06-28 20:00
2007.07.22
Как менять фокус ввода при открытии формы разными клавишами ?


15-1182353896
Тохер
2007-06-20 19:38
2007.07.22
Распознование картинки. Как?


2-1182803080
медиатор
2007-06-26 00:24
2007.07.22
перемотка


1-1179396051
ancot
2007-05-17 14:00
2007.07.22
winexec





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