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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 00:30   #1
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию Контрол спрашивает Parent

Мне нужно динамически создать компонент TRichEdit, засунуть туда текст, обработать, и удалить.

Код:
Temp := TRichEdit.Create(nil);
Но при первомже обращении к его тексту:

Код:
S := Temp.Text;
Выдаёт:

Цитата:
First chance exception at $7C812AEB. Exception class EInvalidOperation with message 'Control '' has no parent window'. Process MasterEnot.exe (3116)
То что он просит Parent(родителя) это понятно. Но как быть если мне не нужно чтоб ктото видел этот РичЕдит? Все действия производятся в модуле, и разумеется нет формы.

Раньше я добавлял в Uses модуль где форма есть и назначал парент - форму. Хотелосьбы какнить по уму на этот раз сделать..
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 10.06.2011, 00:43   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Но как быть если мне не нужно чтоб ктото видел этот РичЕдит?

Код:
Temp.Visible := False;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 10.06.2011 в 00:52.
veniside вне форума Ответить с цитированием
Старый 10.06.2011, 00:45   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Странно это как-то...по идее должно работать, та ну вобщем-то и работает:
Код:
type
  TTest = class
  private
    RE: TRichEdit;
  public
    function t: string;
  end;

implementation

{ TTest }

function TTest.t: string;
begin
  RE := TRichEdit.Create(nil);
  RE.Text := 'test';
  Result := RE.Text;
  FreeAndNil(RE);
end;
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ttt := TTest.Create;
  Caption :=  ttt.t;
  FreeAndNil(ttt);
end;
p.s. Delphi 2010.

Кстати, если нужно просто обработать текст, то зачем создавать РичЭдит, если лучше для этого использовать TStringList.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.06.2011, 00:45   #4
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Но как быть если мне не нужно чтоб ктото видел этот РичЕдит?

Код:
Temp.Visible := False;
Это само собой.
Компонент просит Parent. Без этого он работать отказывается.

Цитата:
Кстати, если нужно просто обработать текст, то зачем создавать РичЭдит, если лучше для этого использовать TStringList.
Нужно обработать rtf, а в стринГлист загружается всё форматирование, и обработать такое трудно..
Сливочное масло Valio - компиляция как по маслу

Последний раз редактировалось Valio; 10.06.2011 в 00:50.
Valio вне форума Ответить с цитированием
Старый 10.06.2011, 00:54   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Компонент просит Parent. Без этого он работать отказывается.

что-то вы от нас скрываете. Вот, работает в Дельфи 7 без проблем:

Код:
var
  Re: TRichEdit;
  s: string;
begin
  Re := TRichEdit.create(nil);
  Re.text := 'Life sucks';
  s := Re.text;
  Re.Free;
end;
И выше пример под 2010 привели.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 10.06.2011, 00:58   #6
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Вообще-то в модуле не рекомендую создавать такого рода объекты (визуальные имею ввиду).
Но раз такое дело попробуй так:
function TTest.t: string;
begin
RE := TRichEdit.Create(nil);

RE.Parent := nil;
или
RE.Parent := Application;
RE.Visible := false;


RE.Text := 'test';
Result := RE.Text;
FreeAndNil(RE);
end;
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 10.06.2011, 00:58   #7
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Блин, я ступил. Сейчас на F8 пожмякал и он вылетает на

Код:
Temp.Lines.LoadFromFile(FName);
Тобишь не хочет фаил загрузить.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 10.06.2011, 01:04   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Тобишь не хочет фаил загрузить.

да, там Борланд начюдил. Вот, можно так обойти:

Код:
var
  Re: TRichEdit;
begin
  Re := TRichEdit.create(nil);
  //
  with (TStringList.create()) do begin
    //
    LoadFromFile(Fname);
    Re.Text := Text;
    Free();
  end;
  //
  Re.Free;
end.
Ну или вобще ограничиться TStringList, как уже сказали выше )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 10.06.2011, 01:07   #9
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

И действительно, при загрузке из файла РичЭдиту требуется Парент. Тут скорее всего нужно под отладкой смотреть, что он хочет конкретно.
Но как вариант решения, хоть и опасный, можно сделать как предложил D-mon, только:
Код:
  RE.Visible := False;
  RE.Parent := Application.MainForm;
EDIT:
Во, вроде как все кроется в методе
Код:
procedure TWinControl.CreateWnd;
а конкретнее вот:
Код:
    if (WndParent = 0) and (Style and WS_CHILD <> 0) then
      if (Owner <> nil) and (csReading in Owner.ComponentState) and
        (Owner is TWinControl) then
        WndParent := TWinControl(Owner).Handle
      else
        raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 10.06.2011 в 01:18.
spamer вне форума Ответить с цитированием
Старый 10.06.2011, 01:27   #10
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Вообщем это опять Борланд лажает.

Помогло только такое:

Код:
RE.Visible := False;
  RE.Parent := Application.MainForm;
РичЕдит нашёл форму и на ней отработал )

Через Re.Text := Text; тоже не прокатило, текст с тегами пролез почемуто.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему постоянно спрашивает пароль и логин? Марк Охман БД в Delphi 4 02.11.2010 16:00
parent:: stenl1 PHP 16 26.05.2010 12:29
Почему установщик спрашивает на русском про язык установки Анлгийский grenles Свободное общение 7 21.09.2009 17:14
Parent фрейма RIO Помощь студентам 2 10.05.2009 20:56
Parent... prizrak1390 Общие вопросы Delphi 6 29.03.2008 00:02