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

Вниз

Access Violation   Найти похожие ветки 

 
Jaxtor ©   (2003-05-30 15:32) [0]

Специалисты по Access Violation, помогите! Почему возникает Access Violation в последней строчке моего кода?

var ParametersForm:TForm;

...
ComboBoxVariable:=TCombobox.Create(ParametersForm);
ComboBoxVariable.Parent:=ParametersForm;
ComboBoxVariable.Left:=MaxDescriptionSymbols*6;
ComboBoxVariable.Top:=10;
ComboBoxVariable.Name:="CategoryComboBox";
ComboBoxVariable.OnChange:=OnCategoryComboBoxChange;
(FindComponent("CategoryComboBox") as TComboBox).Text:="";


 
DmS   (2003-05-30 15:39) [1]

может быть

FindComponent("CategoryComboBox") = NIL


 
Юрий Зотов ©   (2003-05-30 15:39) [2]

(ParametersForm.FindComponent("CategoryComboBox") as TComboBox).Text := "";



 
RoadStar ©   (2003-05-30 15:40) [3]

Контекст?


 
MBo ©   (2003-05-30 15:42) [4]

1) Что?.FindComponent?
2) результат FindComponent стоит проверять на Nil
3) в каком месте программы все это происходит?


 
Jaxtor ©   (2003-05-30 15:49) [5]

Юрий Зотов>

(ParametersForm.FindComponent("CategoryComboBox") as TComboBox).Text := "";

- тоже Access Violation.

RoadStar>
Модуль Price:

procedure TPriceForm.ProductParametersClick(Sender: TObject);
begin
ParametersForm:=TParametersForm.Create(Application);
ParametersForm.Show;
end;


Модуль Parameters:

unit Parameters;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, IBCustomDataSet, StdCtrls, Mask, DBCtrls, DBCtrlsEh,
DBLookupEh, IBSQL, IBDatabase, IBStoredProc, ExtCtrls, IBQuery, Grids,
DBGrids;

type
TParametersForm = class(TForm)
procedure OnCategoryComboBoxChange(Sender:TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Visualization;
private
{ Private declarations }
public
{ Public declarations }
end;

var
ParametersForm: TParametersForm;

implementation

uses DataMod, Price, CharacteristicsDataMod;

{$R *.dfm}



procedure TParametersForm.FormCreate(Sender: TObject);
begin
ParametersForm.Visualization;
end;


procedure TParametersForm.Visualization;
ComboBoxVariable: TComboBox;
CheckBoxVariable: TCheckBox;
begin
ComboBoxVariable:=TCombobox.Create(ParametersForm);
ComboBoxVariable.Parent:=ParametersForm;
ComboBoxVariable.Left:=MaxDescriptionSymbols*6;
ComboBoxVariable.Top:=10;
ComboBoxVariable.Name:="CategoryComboBox";
ComboBoxVariable.OnChange:=OnCategoryComboBoxChange;
(ParametersForm.FindComponent("CategoryComboBox") as TComboBox).Text:="";

Вот тут-то Access Violation возникает!


 
Кулюкин Олег ©   (2003-05-30 15:52) [6]

А почему не
ComboBoxVariable.Text:="" ??????




 
reonid ©   (2003-05-30 15:56) [7]

Странно...
Даже если FindComponent ничего не найдёт,
должна быть EInvalidCast (как результат nil as TComboBox).


 
Skier ©   (2003-05-30 15:57) [8]

>Jaxtor © (30.05.03 15:49)

Если это не поможет то косяк видимо в теле OnCategoryComboBoxChange

var
AFoundComponent : TComponent;
//.............
begin
//.............
AFoundComponent := FindComponent("CategoryComboBox");
if Assigned(AFoundComponent) and (AFoundComponent is TCombobox) then TComboBox(AFoundComponent).)Text := EmptyStr;

//.............
end;


 
Skier ©   (2003-05-30 15:59) [9]

скобочка лишняя...поправлюсь : TComboBox(AFoundComponent).Text := EmptyStr;


 
Jaxtor ©   (2003-05-30 15:59) [10]

>Кулюкин Олег Не догадался так сделать!


 
reonid ©   (2003-05-30 16:02) [11]

На всякий случай спрошу - а сама-то ParametersForm
создана?


 
Jaxtor ©   (2003-05-30 16:23) [12]

>reonid Вот в том то и дело, что ParametersForm = nil все время. А почему так, не знаю. Ведь делаю-таки ParametersForm:=TParametersForm.Create(Application);


 
MBo ©   (2003-05-30 16:26) [13]

А если делать это не в OnCreate, а, скажем, в OnShow, или в перекрытом CreateWnd?


 
Skier ©   (2003-05-30 16:26) [14]

Мда, прямо-таки головоломка...


 
Jaxtor ©   (2003-05-30 16:32) [15]

>MBo У меня раньше все на Show висело. Но я перешел на Create потом по разным соображением.

Есть еще информация - через Debugger получается, что после ParametersForm:=TParametersForm.Create(Application) меня выносит
в модули *.pas библиотеки Ehlib и там все вертится, а после выхода от туда - ParametersForm=nil. Где туплю????


 
MBo ©   (2003-05-30 16:35) [16]

Так когда на OnShow висело, работало?


 
Skier ©   (2003-05-30 16:36) [17]

>Jaxtor © (30.05.03 16:32)

А где и как ты пишешь ParametersForm := TParametersForm.Create(Application) мы должны угадать ?


 
Jaxtor ©   (2003-05-30 16:38) [18]

>Skier
AFoundComponent := FindComponent("CategoryComboBox"); = NIL!!!!


 
Jaxtor ©   (2003-05-30 16:40) [19]

>MBo Тогда другой код был.
>Skier

procedure TPriceForm.ProductParametersClick(Sender: TObject);
begin
ParametersForm:=TParametersForm.Create(Application);
ParametersForm.Show;
end;



 
Skier ©   (2003-05-30 16:41) [20]

>Jaxtor © (30.05.03 16:38)
Поэтому у тебя и AV. Видимо "портится" ссылка ParametersForm Разбирайся...


 
Sandman25 ©   (2003-05-30 16:43) [21]

Jaxtor © (30.05.03 15:49)

ParametersForm:=TParametersForm.Create(Application);
ParametersForm.Show;

procedure TParametersForm.FormCreate(Sender: TObject);
begin
ParametersForm.Visualization;
end;

Вы в OnCreate вызываете метод формы, которой еще нет!!! Надо так:

procedure TParametersForm.FormCreate(Sender: TObject);
begin
Visualization;
end;

Тогда и в ParametersForm иногда будет не nil появляться :)
Только лучше создавать форму с проверкой.

if ParametersForm = nil then ParametersForm:=TParametersForm.Create(Application);
ParametersForm.Show;

Иначе придется каждый раз создавать форму, а при ее закрытии не забывать ее удалять самостоятельно (то есть Application в Create можно не указывать).


 
Skier ©   (2003-05-30 16:43) [22]

>Jaxtor © (30.05.03 16:40)
А форма ParametersForm у тебя наверное ещё и в autocreate стоит,
нет ?


 
Jaxtor ©   (2003-05-30 16:44) [23]

>Skier Я со вчерашнего дня с обеда разбираюсь(один между прочим).


 
Jaxtor ©   (2003-05-30 16:45) [24]

>Skier Нет, в autocreate не стоит. Я ученый в этом:)


 
Sandman25 ©   (2003-05-30 16:47) [25]

Тьфу ты. Вроде бы натормозил я. Игнорируйте Sandman25 © (30.05.03 16:43)

Зря я сегодня в полпятого утра проснулся :)


 
MBo ©   (2003-05-30 16:48) [26]

не соблаговолишь попробовать перставить код в OnShow?


 
Jaxtor ©   (2003-05-30 16:55) [27]

MBo> Естественно, что через Show все заработало.


 
Sandman25 ©   (2003-05-30 16:56) [28]

Только что сделал похожий проект.
Все-таки я был прав. При вызове ParametersForm.Visualization ParametersForm еще равно nil. Нужно просто вызывать с Self, а не ParametersForm.

Определенно, надо больше спать.


 
Sandman25 ©   (2003-05-30 16:59) [29]

Видимо, обработчик OnCreate вызывается напрямую из конструктора, а не посылается событие в очередь сообщений, как это происходит с OnShow.


 
MBo ©   (2003-05-30 16:59) [30]

>Jaxtor
В момент создания формы окна формы и окна комбобокса еще не существует, а Windows для операций со строками комбобокса нужен дескриптор окна. Вот почему я уже давно сказал про CreateWnd.



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

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

Наверх




Память: 0.53 MB
Время: 0.013 c
14-34992
etem
2003-05-26 14:55
2003.06.12
При создании индекса по строковому полю трабл...


14-35073
Kaktuss
2003-05-28 08:26
2003.06.12
InstallShield Express и BDE


1-34821
Scorpx
2003-06-02 19:06
2003.06.12
Строковая переменная.


1-34813
chistyakov
2003-06-02 18:03
2003.06.12
Модульность программы?


14-35033
SVR
2003-05-26 23:58
2003.06.12
Нужен художник