Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2013, 15:00   #1
Ate1st1984
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 18
По умолчанию Проблема с opendialog

Помогите разобраться.
Есть кнопка созданная в рантайм:
Код:
procedure TForm62.OpenConnStrClick(Sender: TObject);
var
s: string;
begin
  OpenDialog.Execute();
  s:= OpenDialog.FileName;
  TEdit(findObj('ConnStr')).Text:= s;
end;
при нажатии выдает ошибку access violation at 0х00405b90: read of address 0х00000000

если тот же код вставить в кнопку созданную в десигнтайм то все работает.

Последний раз редактировалось Stilet; 13.03.2013 в 17:35.
Ate1st1984 вне форума Ответить с цитированием
Старый 13.03.2013, 15:25   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Значит кнопку не правильно создаете
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.03.2013, 15:29   #3
Ate1st1984
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 18
По умолчанию

Функция создания кнопки:

Код:
function TObjControl.CreateBtn;
begin
  Btn:= TButton.Create(Prop.Owner);
  Btn.Top:= Prop.top;
  Btn.Left:= Prop.left;
  Btn.Height:= Prop.height;
  Btn.Width:= Prop.width;
  Btn.Parent:= Prop.par;
  Btn.name:= Prop.name;
  Result:= Btn;
end;
Создание кнопки:
Код:
obj.setProp(17, 375, 25, 25, TGroupBox(findObj('ConnGrpBox')), 'ConnStrBtn', Form62);
  Obj.CreateBtn();
  TButton(findObj('ConnStrBtn')).Caption:= '...';
  TButton(findObj('ConnStrBtn')).OnClick:= OpenConnStrClick;
Процедура установки свойств:
Код:
procedure TObjControl.setProp(top, left, height, width: integer; par: TWinControl; name: string; Owner: TComponent);
begin
  Prop.owner:= Owner;
  Prop.top:= top;
  Prop.left:= left;
  Prop.height:= height;
  Prop.width:= width;
  Prop.par:= par;
  Prop.name:= name;
end;

Последний раз редактировалось Stilet; 13.03.2013 в 17:36.
Ate1st1984 вне форума Ответить с цитированием
Старый 13.03.2013, 16:10   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

второе, вместо кусков разрозненного кода, лучше бы вы привели полностью свой код.
например, какого типа у Вас Obj?

а вот это
Цитата:
Код:
obj.setProp(17, 375, 25, 25, TGroupBox(findObj('ConnGrpBox')), 'ConnStrBtn', Form62);
Obj.CreateBtn();
вы сначала вызываете метод у несозданного объекта и назначаете свойства, а потом (неправильно) пытаетесь объект создать?!?!


в любом случае вместо
Цитата:
Obj.CreateBtn();
наверное, должно быть
Код:
 obj := CreateBtn();
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2013, 17:03   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
obj.setProp(17, 375, 25, 25, TGroupBox(findObj('ConnGrpBox')), 'ConnStrBtn', Form62);
Oh god.. Why?
Почитайте об ООП, Frames, и динамических объектах.

Код:
Obj.CreateBtn();
TButton(findObj('ConnStrBtn')).Capt ion:= '...';
TButton(findObj('ConnStrBtn')).OnCl ick:= OpenConnStrClick;
Глупо. Ваш код находит всегда 1 и туже кнопку, пусть их там хоть 100500 будет.
Используйте TComponentList.
Человек_Борща вне форума Ответить с цитированием
Старый 14.03.2013, 08:40   #6
Ate1st1984
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
жуть... Вы вообще не понимаете, что есть ООП, что есть класс, что есть объект, что такое методы объекта, как объект создавать и т.д. и т.п.
это раз.

второе, вместо кусков разрозненного кода, лучше бы вы привели полностью свой код.
например, какого типа у Вас Obj?

а вот это

вы сначала вызываете метод у несозданного объекта и назначаете свойства, а потом (неправильно) пытаетесь объект создать?!?!


в любом случае вместо
наверное, должно быть
Код:
 obj := CreateBtn();
Код полностью в прикрепленном файле
obj: TobjControl;

В Showform есть Obj:= TObjControl.Create();

В классе TObjControl есть процедура SetProp:

procedure TObjControl.setProp(top, left, height, width: integer; par: TWinControl; name: string; Owner: TComponent);
begin
Prop.owner:= Owner;
Prop.top:= top;
Prop.left:= left;
Prop.height:= height;
Prop.width:= width;
Prop.par:= par;
Prop.name:= name;
end;

и функция CreateBtn:

function TObjControl.CreateBtn;
begin
Btn:= TButton.Create(Prop.Owner);
Btn.Top:= Prop.top;
Btn.Left:= Prop.left;
Btn.Height:= Prop.height;
Btn.Width:= Prop.width;
Btn.Parent:= Prop.par;
Btn.name:= Prop.name;
Result:= Btn;
end;

в которой есть строчка Btn:= TButton.Create(Prop.Owner);

Создание кнопки:

obj.setProp(17, 375, 25, 25, TGroupBox(findObj('ConnGrpBox')), 'ConnStrBtn', Form62);
Obj.CreateBtn();
TButton(findObj('ConnStrBtn')).Capt ion:= '...';
TButton(findObj('ConnStrBtn')).OnCl ick:= OpenConnStrClick;

Функция findObj:

function TForm62.findObj(name: string): TComponent;
var
z: TComponent;
begin
z:= FindComponent(name);
Result:= z;
end;

Кнопок созданных таким образом на форме несколько, и не работает в них только OpenDialog, хотелось бы узнать почему
Вложения
Тип файла: rar Projects.rar (6.7 Кб, 9 просмотров)
Ate1st1984 вне форума Ответить с цитированием
Старый 14.03.2013, 09:02   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проект ещё не смотрел (кстати, Вы правильно сделали, что выложили его!)

хотел бы сразу у Вас, как у автора программы выяснить:
Цитата:
В Showform есть Obj:= TObjControl.Create();
......
Создание кнопки:
obj.setProp(17, 375, 25, 25, TGroupBox(findObj('ConnGrpBox')), 'ConnStrBtn', Form62);
Obj.CreateBtn();
если создание кнопки это Obj:= TObjControl.Create();
то,
1) зачем вызывается метод Obj.CreateBtn(); ?
2) в методе CreateBtn() создаётся кнопка Btn:= TButton.Create(Prop.Owner);
которая возвращается в качестве результата функции.
вопрос - куда девается результат в вашем случае?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2013, 09:14   #8
Ate1st1984
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
проект ещё не смотрел (кстати, Вы правильно сделали, что выложили его!)

хотел бы сразу у Вас, как у автора программы выяснить:

если создание кнопки это Obj:= TObjControl.Create();
то,
1) зачем вызывается метод Obj.CreateBtn(); ?
2) в методе CreateBtn() создаётся кнопка Btn:= TButton.Create(Prop.Owner);
которая возвращается в качестве результата функции.
вопрос - куда девается результат в вашем случае?!
1. в setprop устанавливаются параметры в данном случае кнопки, еще есть edit, dblookupcombobox, ChkBox, DBGrd для них параметры устанавливаются той же процедурой, а в createbtn эти параметры присваиваются кнопке
2. эта функция должна быть процедурой, ее результатом не пользуюсь, компоненты нахожу по имени с помощь функции findobj
Ate1st1984 вне форума Ответить с цитированием
Старый 14.03.2013, 09:17   #9
Ate1st1984
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 18
По умолчанию

Obj:= TObjControl.Create(); это не создание кнопки, а создание экземпляра класса.
Ate1st1984 вне форума Ответить с цитированием
Старый 14.03.2013, 10:05   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Значит кнопку не правильно создаете
только скорее всего и не кнопку и не неправильно, а ВООБЩЕ не создается некий объект который потом безуспешно пытаемся найти и не проверив
1. findObj('ConnStr') (нашли/или нет)
2. Tedit(.. (а тот ли тип Tbutton|Tedit|...)
используем.

Цитата:
Код:
  TEdit(findObj('ConnStr')).Text:= s;
P.S. практически весь unit 63 описан здесь
Delphi7 F1 Constructors and class references
Цитата:
A constructor can be called using a variable of a class-reference type. This allows construction of objects whose type isn't known at compile time. For example,

type TControlClass = class of TControl;
function CreateControl(ControlClass: TControlClass;
const ControlName: string; X, Y, W, H: Integer): TControl;
begin
Result := ControlClass.Create(MainForm);
with Result do
begin
Parent := MainForm;
Name := ControlName;
SetBounds(X, Y, W, H);
Visible := True;
end;
end;

The CreateControl function requires a class-reference parameter to tell it what kind of control to create. It uses this parameter to call the class's constructor. Because class-type identifiers denote class-reference values, a call to CreateControl can specify the identifier of the class to create an instance of. For example,

CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);


Constructors called using class references are usually virtual. The constructor implementation activated by the call depends on the runtime type of the class reference.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.03.2013 в 10:51.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenDialog проблема redenemy C++ Builder 5 20.05.2012 00:45
Проблема с OpenDialog!!!! Екатерина_21 C++ Builder 3 09.10.2011 15:12
Проблема с иконкой в трее и OpenDialog Dop Общие вопросы Delphi 2 05.08.2011 14:48
Проблема OpenDialog и ifstream yuriyua Помощь студентам 1 14.10.2009 19:20
OpenDialog.Options:=OpenDialog.Options+[ofAllowMultiSelect]; necky Компоненты Delphi 2 11.08.2007 12:53