Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Передача компонента фрейма в качестве параметра


Автор: FlyingHome 7.6.2009, 10:57
Всем привет. Пишу тестирующую программу для вуза. Имеется 4 фрейма с различным набором компонентов для отображения вопросов (в зависимости от типа вопроса выводится определенный фрейм).
В одном модуле я описал собственный класс для реализации механизма отображения:
Код

type
  TQuestion = class(TTEster)
public
  Type1: TType1; //  4 фрейма
  Type2: TType2; //        по 
  Type3: TType3; //   типам
  Type4: TType4; //     вопросов
  HTML: TStringList;
  //  procedure HTMLInit();
  procedure FrameInit(Box: TGroupBox); //создание фреймов
  procedure view(box:TGroupBox; QType: byte; current:byte);
  procedure HTMLShow(WebBrowser:TWEbBrowser; HTMLCode: String);
end;

 с процедурой создания фрейма в run-time
Код

procedure TQUestion.FrameInit(Box: TGroupBox);
begin
Type1:= TType1.Create(box);
Type2:= TType2.Create(box);
Type3:= TType3.Create(box);
Type4:= TType4.Create(box);
Application.CreateForm(TType1,Type1);
Application.CreateForm(TType2,Type2);
Application.CreateForm(TType3,Type3);
Application.CreateForm(TType4,Type4);
end;

и отображения вопросов и вариантов ответа:
Код

procedure TQuestion.view(box:TGroupBox; QType:byte; current:byte);
begin
if QType=1 then
begin
Type1.Parent:=box;
Type1.Left:=8;
Type1.Top:=16;
Type1.Show;
Self.HTMLShow(Type1.Browser1,Self.test[current-1,2]);
Self.HTMLShow(Type1.Browser2,Self.test[current-1,3]);
Self.HTMLShow(Type1.Browser3,Self.test[current-1,4]);
Self.HTMLShow(Type1.Browser4,Self.test[current-1,5]);
end;

Процедура HTMLShow предназначена для записи HTML-кода в memorystream и последующего отображения этого кода в компоненте WebBrowser (это обязательно).
Проблема в том, что когда я в другом модуле запускаю процедуру TQuestion.view на строке 
Код

Self.HTMLShow(Type1.Browser1,Self.test[current-1,2]);

программа сваливается в EAccessViolation. Отладчик, судя по всему, ругается на компонент Type1.Browser1 типа WebBrowser. Что характерно, фрейм на форме отображается нормально, но HTML-код из переменной test[] не выводит. Как правильно передать компонент WebBrowser из фрейма в процедуру в качестве параметра?
Еще одну вещь заметил: при написании "Type1.Browser1." вне процедуры, Code Completition после точки выводит все методы и свойства компонента WebBrowser, а если то же самое написать в параметрах процедуры, например "HTMLShow(Type1.Browser1.", то Code Completition выведет только два конструктора: Create и CreateParent. В чем тут может быть проблема?

P.S. Если надо, реализация HTMLShow вот
Код

procedure TQuestion.HTMLShow(WebBrowser:TWEbBrowser; HTMLCode: string);
var
  ms: TMemoryStream;
begin
  WebBrowser.Navigate('about:blank');
  while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
   Application.ProcessMessages;

  if Assigned(WebBrowser.Document) then
  begin
    Self.HTML := TStringList.Create;
    try
      ms := TMemoryStream.Create;
      try
        Self.HTML.Text:=HTMLCode;
        Self.HTML.SaveToStream(ms);
        ms.Seek(0, 0);
        (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
      finally
        ms.Free;
      end;
    finally
      Self.HTML.Free;
    end;
  end;
end;

Автор: HeliX 7.6.2009, 12:31
Из кода не понятно как объявлена переменная test и как она заполняется.
Скорее всего где-то неправильно заполняете текст или выделяете память для переменной. 

Автор: pseud 12.6.2009, 12:19
1.
Цитата(FlyingHome @  7.6.2009,  10:57 Найти цитируемый пост)
Еще одну вещь заметил: при написании "Type1.Browser1." вне процедуры, Code Completition после точки выводит все методы и свойства компонента WebBrowser, а если то же самое написать в параметрах процедуры, например "HTMLShow(Type1.Browser1.", то Code Completition выведет только два конструктора: Create и CreateParent. В чем тут может быть проблема?

тебе дельфы выдает список допустимых свойств (функций) из полного списка свойств/функций/процедур TQuestion
Код

HTMLShow(WebBrowser:TWEbBrowser; ...

т.е. в список вываливается то что туда можно засунуть. Create и CreateParent - дельфи считает что они могут таки вернуть объект класса TWEbBrowser.

2. Что это?:
Код

Type1:= TType1.Create(box);
Application.CreateForm(TType1,Type1);

ты сначала создаешь фрейм TType1, владельцем которго назначешь box и засовываешь в перемнную Type1. А потом опять создаешь фрейм Type1: TType1, владельцем которго назначешь Application.

3. В основной твой вопрос не вникал, ибо пока код=каша.
Могу лишь предположить что объект класса TQuestion ты не создал, но пытаешься вызывать его методы.
Шаги
Код

Type1:= TType1.Create(box);
Type2:= TType2.Create(box);
Type3:= TType3.Create(box);
Type4:= TType4.Create(box);
Application.CreateForm(TType1,Type1);
Application.CreateForm(TType2,Type2);
Application.CreateForm(TType3,Type3);
Application.CreateForm(TType4,Type4);
Type1.Parent:=box;
Type1.Left:=8;
Type1.Top:=16;
Type1.Show;

проходят без AV, т.к. им нет нужды в объетке Self.
Но Self.HTMLShow( - валится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)