Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.138 c