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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2008, 09:36   #1
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
Сообщение Создание окна при получение определенного пакета

Всем привет. Вопрос такой при получении определенного пакета должно создаваться окно это я сделал так:
Код:
*************************************************
procedure TForm1.CreateChildForm (const childName : string);
     begin
      NameForm[col] := TForm3.Create(Application); //создание формы на основе шаблона
      NameForm[col].Name:= 'NameForm'+IntToStr(col); //даём имя форме
      NameForm[col].Caption:= childName; //заголовок окна
      NameForm[col].Visible:= true;  //делаем её видимой
      col:=col+1;
     end;
*************************************************
{если пришел определенный пакет }
    if Copy(s,1,2) = '#L' then begin
     Delete(s,1,2);
     {Выделяем в to_ - кому оно предназначено}
     to_ := Copy(s,1,Pos(';',s)-1);
     Delete(s,1,Pos(';',s));
     {Выделяем в from_ - кем отправлено}
     from_ := Copy(s,1,Pos(';',s)-1);
     Delete(s,1,Pos(';',s));

     if (to_ = nickname)or(from_ = nickname) then
      begin
      for i:=1 to n do  begin
         if (NameForm[i].Caption = from_) or (NameForm[i].Caption = to_) then
           begin
             NameForm[i].Memo1.Lines.Insert(0,from_ + ' >  '+s);
             find_win:=true;
             Exit;
           end;
          find_w:=i;
         end;
        if not (find_win) then
         begin
          CreateChildForm(from_);
          NameForm[find_w].Memo1.Lines.Insert(0,from_ + ' >  '+s);
         end;
      end;
*******************************************************
//создание этой формы на стороне отправителя
procedure TForm1.N3Click(Sender: TObject);
begin
    CreateChildForm(ListBox1.Items[ListBox1.ItemIndex]);
end;
Код:
//шаблон формы
procedure TForm3.Button1Click(Sender: TObject);
var
 s:string;
begin
    s := '#L'+Caption + ';'; {добавляем
		спец.команду и адресат}
    s := s+nickname+';'+Edit1.Text;
    Form1.ClientSocket1.Socket.SendText(s);
    {И снова ждем ввода в уже чистом TEdit-е}
    Edit1.Text := '';
    ActiveControl := Edit1;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:=caFree;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
 i:=col+1;
end;
end.
а задумка вот в чем. Когда приходят пакеты от нескольких приложений надо каждое открыть в отдельном окошке (шаблоне), мой пример работает только при первой посылке пакетов если закрыть эту форму тогда если снова что нибудь придет то это окошко выдает ошибку типа идет адресация на нулевой адрес. но окошко открывается и в нем сообщений больше не видно. подскажите что я делаю не так?
GHOST_Kasper вне форума Ответить с цитированием
Старый 05.02.2008, 11:47   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Дай весь исходник.

Список форм хранится в NameForm.
Создание новой формы идет в NameForm[col]
В FormCreate запоминается индекс новой формы почему то col+1,
т.е. ссылаемся на следующую форму в списке ?
С освобождением формы то-же проблемы. нужно не только закрывать форму, но и указывать NameForm[i] := nil
При очередном создании как-то проверять свободные элементы NameForm, а то список будет расти до бесконечности.
alexBlack вне форума Ответить с цитированием
Старый 05.02.2008, 13:21   #3
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
TForm3 := nil;
end;
И всё будет...
Domovoy вне форума Ответить с цитированием
Старый 05.02.2008, 13:35   #4
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
По умолчанию

сейчас испробуем...
********************
вот нашел выход:
Код:
//закрытие и уничтожение созданой формы, а не как раньше всего шаблона...
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:=caFree;
 NameForm[Tag]:=nil;
end;
***********************************************
//создание окна
  procedure TForm1.CreateChildForm (const childName : string);
     begin
      NameForm[col] := TForm3.Create(Application);
      NameForm[col].Name:= 'NameForm'+IntToStr(col);
      NameForm[col].Caption:= childName;
      NameForm[col].Visible:= true;
      NameForm[col].Tag:=col;
      data[col]:=childName;
      col:=col+1;
     end;
и как сказал alexBlack надо учитывать освободившие окна...
сейчас буду думать как.. идеи у кого нибудь есть? может без массива можно обойтись?

Последний раз редактировалось GHOST_Kasper; 05.02.2008 в 15:18.
GHOST_Kasper вне форума Ответить с цитированием
Старый 06.02.2008, 12:51   #5
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
По умолчанию

последний вопрос в этой теме:

NameForm[Tag] := nil;
после этого что будет в переменной Tag ??? Она тоже уничтожится?
GHOST_Kasper вне форума Ответить с цитированием
Старый 06.02.2008, 13:01   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
и как сказал alexBlack надо учитывать освободившие окна...
сейчас буду думать как.. идеи у кого нибудь есть? может без массива можно обойтись?
TList может хранит ссылки на ваши формы.
TList.Add + TList.Delete + TList.Items + F1
Sibedir вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание кнопки зная HWND окна(рабочий стол) WOLFak Компоненты Delphi 1 07.04.2008 07:45
Получение имени окна Artem Общие вопросы Delphi 4 20.09.2007 16:38
Создание файла определенного типа Македонский Общие вопросы Delphi 12 06.09.2007 11:58
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
Создание окна через CreateWindowEx Nowichok Win Api 18 16.12.2006 16:37