Здравствуйте. Есть такая проблемка. Есть две формы SUForm(выбор пользователя) и Form1(основная форма)
Запускается сначала SUForm
begin
Application.Initialize;
SUForm:=TSUForm.Create(Application);
SUForm.ShowModal;
SUForm.Update;
while SUForm.ModalResult < -1 do
Application.ProcessMessages;
Application.CreateForm(TForm1, Form1);
SUForm.Hide;
SUForm.Free;
Application.Run;
end.
при компиляции окошко выходит с ошибкой
procedure TSUForm.ReadUsers;
var BaseName, ConString:string;
begin
BaseName:='DATE.MDB';
ConString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source='+BaseName;
AdoConnection1.ConnectionString:=ConString;
AdoConnection1.Open;
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('SELECT Account.ID, Account.FirstName, Account.SecondName FROM Account');
AdoQuery1.Open;
ListUser.Clear;
while not SUForm.ADOQuery1.Eof do //ошибка происходит в этом месте
begin
ListUser.Items.AddObject((SUForm.ADOQuery1.Fields.Fields[1].AsString + ' ' +
SUForm.ADOQuery1.Fields.Fields[2].AsString),
Pointer(SUForm.ADOQuery1.Fields.Fields[0].AsInteger));
SUForm.ADOQuery1.Next;
end;
end;
если форму выбора пользователя делать главной то код работает, а таким способом не хочет. Объясните пожалуйста что я делаю не так?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
23-01-2010 12:20 | Сообщение от автора вопроса
было:
while not SUForm.ADOQuery1.Eof do //ошибка происходит в этом месте
begin
ListUser.Items.AddObject((SUForm.ADOQuery1.Fields.Fields[1].AsString + ' ' +
SUForm.ADOQuery1.Fields.Fields[2].AsString),
Pointer(SUForm.ADOQuery1.Fields.Fields[0].AsInteger));
SUForm.ADOQuery1.Next;
должно быть:
while not ADOQuery1.Eof do //ошибка происходит в этом месте
begin
ListUser.Items.AddObject((ADOQuery1.Fields.Fields[1].AsString + ' ' +
ADOQuery1.Fields.Fields[2].AsString),
Pointer(ADOQuery1.Fields.Fields[0].AsInteger));
ADOQuery1.Next;
1. Имеется в наличии недопонимание работы ShowModal. В частности, после выхода из ShowModal форма не видна и примерение к ней Update или Hide не имеет смысла. Кроме того, проверка в цикле свойства ModalResult тоже имеет очень сомнительный смысл. Посмотрите »вопрос КС №61703«
2. В методе TSUForm.ReadUsers вы обращаетесь к конкретной переменной этого класса SUForm. Экземпляров класса TSUForm можно создать сколько угодно. И совершенно не обязательно присваивать ссылку на какой-либо из них переменной SUForm. Так с какого перпугу все когда либо созданные или могущие быть созданными формы типа TSUForm в своём методе должны обращаться к ADOQuery1, находящейся на конкретрой форме, ссылка на которую содержится в переменной SUForm, а не на свою собственную ADOQuery1? Может оказаться, что:
1. Это вообще не та форма.
2. Этой переменной вообще ничего не присвоено.
3. Форма, ссылка на которую хранится в переменной, давно уничтожена.
В методах класса не следует ссылаться на конкретные переменные своего класса. Вместо этого используется неявный Self, т.е внутри TSUForm.ReadUsers следует просто убрать все "SUForm." Посмотрите »вопрос КС №72154« (и там две ссылки)
3. Для информации: когда вы назначаете в свойствах проекта некую форму главной, это приводит к тому, что в файле dpr эта форма перемещается на перврое место среди автосоздаваемых форм (создаваемых через Application.CreateForm) и наоборот.
4. AdoConnection1 находится на форме типа TSUForm. Вы создаёте форму (а с ней и AdoConnection1), устанавливаете сязь, а потом уничтожаете форму вместе с AdoConnection1... В общем случае AdoConnection должна находиться в общедоступном месте и существовать (в одном экземпляре) весь сеанс работы. Обычно для этого используют автосоздаваемый дата-модуль (который должен, кстати, создаваться раньше форм, из которых к нему возможно обращение).
5. Если TSUForm.ReadUsers вызывается в ходе создания формы, то следует иметь в виду, что присвоение глобальной переменной SUForm ссылки, возвращаемой конструктором, происходит после выхода из конструктора и если до выхода из конструктора вы обращаетесь к этой переменной, то она может быть:
1. Равна nil (или в общем случае указывать неизвестно куда).
2. Если этой переменной уже была присвоена ссылка на существующую форму, то происходит непредусмотренное обращение к этой форме, т.е. вообще получается труднопредсказуемая каша. И после всего этого вы всё ещё хотите использовать глобальные переменные? И ссылаться на них в методах форм?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.