Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите. Как сделать правильно? (число прочтений - 17027 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #45 - 18. Апреля 2008 :: 13:56
Печать  
В твоих терминах
Код
Выбрать все
Процедура ПослеСозданияФормы()
	ОбъектТпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме=ОбъектТпНаФорме.Создать("тпНаФорме", Контекст);
	//НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
КонецПроцедуры	// ПослеСозданияФормы 

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #46 - 18. Апреля 2008 :: 13:59
Печать  
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)
Код
Выбрать все
// -- Артур --
//Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);
_БазаТП = Сам().ПолучитьБазовыйКласс("ТабличноеПоле");
Возврат Сам();
// -- завершение
 


+ самое главное - передача контекста класса вместо имени ТабличноеПоле Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #47 - 18. Апреля 2008 :: 14:00
Печать  
kiruha писал(а) 18. Апреля 2008 :: 13:56:
В твоих терминах
Код
Выбрать все
Процедура ПослеСозданияФормы()
	ОбъектТпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме=ОбъектТпНаФорме.Создать("тпНаФорме", Контекст);
	//НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
КонецПроцедуры	// ПослеСозданияФормы 


Ну а что имеем дальше? Хочу иметь метод "ВыполнитьИОтобразить(ТекстЗапроса)", где выполняется запрос и создаются колонки по ТЗ=результату запроса. Откуда его вызывать? "тпНаФорме" - это "ТабличноеПоле", здесь явно не прокатит. "ОбъектТпНаФорме" - та проблема, о которой я говорю.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #48 - 18. Апреля 2008 :: 14:06
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)
Код
Выбрать все
// -- Артур --
//Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
Возврат Сам();
// -- завершение
 


+ самое главное - передача контекста класса вместо имени ТабличноеПоле Улыбка

Афигет! РАботает!  Очень довольный Спасибо, Артур. Я уж думал, что опять через ж. придётся делать.
Ну согласитесь, весьма неявное решение.
П.С. тока там наверное вместо:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);

надо писать:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);

или пофигу?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #49 - 18. Апреля 2008 :: 14:08
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 14:06:
П.С. тока там наверное вместо:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);

надо писать:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);

или пофигу?

пофигу
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #50 - 18. Апреля 2008 :: 14:11
Печать  
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #51 - 18. Апреля 2008 :: 14:12
Печать  
Это не неявное, а вполне официальное поведение, придуманное как раз для реализации ООП для ТП.
Иногда читайте доку, там много хорошего понаписано Улыбка

Причем ведь я-то ТП не юзаю, зато внутренности знаю Улыбка

ЗЫ мой провайдер сегодня получит статус нехорошего человека.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #52 - 18. Апреля 2008 :: 14:15
Печать  
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

Нельзя Улыбка
Контекст можно передавать только как аргумент функции.
Да, пофигу что юзать Сам() или Контекст. ТОлько Сам() можно юзать везде, а Контекст нет.
Поэтому я выше уже поправил свое определение на Сам() Улыбка - и если бы не мой Инет, вы бы его раньше увидели Улыбка

ЗЫ кстати, в свете правильного решения Создать нужно делать не функцией, а обычной процедурой, ведь ничего полезного метод не вернет Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #53 - 18. Апреля 2008 :: 14:16
Печать  
artbear писал(а) 18. Апреля 2008 :: 14:12:
Это не неявное, а вполне официальное поведение, придуманное как раз для реализации ООП для ТП.
Иногда читайте доку, там много хорошего понаписано

хте?  Смущённый
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #54 - 18. Апреля 2008 :: 14:18
Печать  
artbear писал(а) 18. Апреля 2008 :: 14:15:
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

Нельзя Улыбка
Контекст можно передавать только как аргумент функции.

Обоснуй.

Цитата:
Да, пофигу что юзать Сам() или Контекст. ТОлько Сам() можно юзать везде, а Контекст нет.

Контекст нельзя юзать только там, где тебе нужно вызвать методы или обратиться к атрибутам класса. Во всех остальных случаях использовать Контекст - можно.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #55 - 18. Апреля 2008 :: 14:33
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #56 - 18. Апреля 2008 :: 14:59
Печать  
kms писал(а) 18. Апреля 2008 :: 14:33:
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?

Ну нифига себе! Даже Миша не знает, а вы мне говорите "читайте доку"  Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #57 - 18. Апреля 2008 :: 15:18
Печать  
Не, я заинтересовался конкретным утверждением - и решил поискать очередные грабли. Улыбка
На самом деле, граблей там нет, в конструкторе можно брать ссылку на суперкласс - он уже сконструирован.

В остальном - все правильно, насчет контекста класса при создании окна контрола.

У тебя получалось использование неинициализированного ТП - т.к. ты создавал ТП, но оно не связывалось с классом.
Оно возвращалось из метода Создать(), но далее нигде не использовалось, а ссылка на него терялась.

При этом свойства базового ТП существовали, были доступны, но не были инициализированы.
По симптомам - очень похоже на грабли с "виртуальными свойствами".

JohnyDeath писал(а) 18. Апреля 2008 :: 14:59:
Ну нифига себе! Даже Миша не знает, а вы мне говорите "читайте доку"  Улыбка

На пенсию пора Улыбка ... Или по крайней мере - за пивом. Улыбка
« Последняя редакция: 18. Апреля 2008 :: 18:29 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #58 - 19. Апреля 2008 :: 07:18
Печать  
fez писал(а) 18. Апреля 2008 :: 14:18:
artbear писал(а) 18. Апреля 2008 :: 14:15:
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

Нельзя Улыбка
Контекст можно передавать только как аргумент функции.

Обоснуй.

Цитата:
Да, пофигу что юзать Сам() или Контекст. ТОлько Сам() можно юзать везде, а Контекст нет.

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

Федор, ты не прав Печаль
Я-то, в отличие от тебя, попробовал Улыбка
Цитата:
==== Класс: ТПЗапросТЗ  Файл: G:\1C\1C++\Баги\TP_Q_VT\ТПЗапросТЗ.ert ====
(84) Возврат<<?>> Контекст;  :Ожидается выражение

ЗЫ твою старую статью про использование Контекста помню Улыбка, но этого момента там нет Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #59 - 19. Апреля 2008 :: 07:23
Печать  
kms писал(а) 18. Апреля 2008 :: 14:33:
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?

Да, этот код нужен только в конструкторе Улыбка
Вчера мой Инет не дал мне это сказать Печаль

В продолжение темы как лучше:
ИМХО метод лучше назвать не Создать, а Инит Улыбка для более точного обозначения того, что нужно использовать специальный пост-конструктор.
А еще надежнее запретить создание через СоздатьОбъект, и разрешить только через Фабрика::Новый с помощью спец.конструктора Инит Улыбка
ЗЫ пользователи, они ведь такие - если есть возможность что-то пропустить, обязательно пропустят Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать