Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Куча окон, для приходящих сообщений   Найти похожие ветки 

 
webpauk   (2004-01-22 17:53) [0]

Ув. толпа! Подскажите, как создать несколько окон, наследников определенной формы (как в ICQ для Incoming message). Очн нужно!


 
Skier ©   (2004-01-22 17:54) [1]


> Подскажите, как создать несколько окон, наследников определенной
> формы

Create(...)


 
webpauk   (2004-01-22 17:58) [2]

дык, нужны наследники уже сущ.формы


 
Тимохов ©   (2004-01-22 18:00) [3]

Это как? :)))
Того же класса, что ли?


 
Skier ©   (2004-01-22 18:00) [4]

> webpauk (22.01.04 17:58) [2]


> дык, нужны наследники уже сущ.формы

всё ещё не вижу проблемы...


 
TUser ©   (2004-01-22 18:02) [5]

Мне тута показали, что такое в Аське Incoming Messages - короче, тебе нужен массив форм. Создаваить так
TYoutForm = class (TForm)
...

ar:arry of TYourForm;

setLength(Ar,length(Ar)+1);
ar[length(Ar)-1]:=TOyreForm.Create;
with Ar[length(Ar)-1] do begin
Top:=... left:=... caption:=... end;


 
Юрий Зотов ©   (2004-01-22 18:12) [6]

> TUser © (22.01.04 18:02) [5]

А почему обязательно массив, а, например, не TList, или (еще лучше) TObjectList? Да и вообще, ссылки можно и вовсе нигде не сохранять - вполне достаточно назначить Owner"а и выставить caFree при закрытии.

> webpauk

Сколько раз Вы вызовете конструктор класса - столько его экземпляров и создастся. В чем проблема?


 
webpauk   (2004-01-22 18:14) [7]

спсб. разобрался


 
webpauk   (2004-01-22 18:18) [8]

procedure OnDataExist;
var
Form21: TForm2;
begin
Form21:=TForm2.Create(Application);
Form21.Show;
end;

а где же поставить Form21.free


 
Тимохов ©   (2004-01-22 18:19) [9]

webpauk (22.01.04 18:18) [8]

Само удалиться когда приложение будешь закрывать.


 
webpauk   (2004-01-22 18:21) [10]

а ежели саму форму закрывать, то она уйдет из памяти?


 
Юрий Зотов ©   (2004-01-22 18:24) [11]

> webpauk (22.01.04 18:18) [8]

Можно нигде не ставить - просто в обработчике TForm2.OnClose напишите Action := caFree. Тогда, когда юзер закроет форму, она уничтожит сама себя. И при завершении работы программы все формы тоже уничтожатся автоматически, поскольку Owner у них - Application.

А переменная Form21 совершенно не нужна. Достаточно так:

procedure OnDataExist;
begin
TForm2.Create(Application).Show
end;


 
Тимохов ©   (2004-01-22 18:27) [12]

Или сам ее может ручками удалить вызвав либо free, либо release (recommended).


 
YuRock ©   (2004-01-22 19:24) [13]

> Skier

Возможно, автору требуется вот это: ?)


TForm2 = class(TForm1)
// ...
end;


 
YuRock ©   (2004-01-22 19:24) [14]

> Skier

Возможно, автору требуется вот это: ?)


TForm2 = class(TForm1)
// ...
end;


 
webpauk   (2004-01-22 19:59) [15]

Ну с формами разобрался. А вот новая прабла: информация, которая поступает во вновь откр. окна - автоматически обновляется и в предидущих. Например, Tmemo


 
Юрий Зотов ©   (2004-01-22 20:08) [16]

> webpauk (22.01.04 19:59) [15]

Как обновляете - так и обновляется. Что ж тут еще скажешь?


 
KSergey ©   (2004-01-22 20:39) [17]

> webpauk (22.01.04 19:59) [15]
> Ну с формами разобрался. А вот новая прабла: информация,
> которая поступает во вновь откр. окна - автоматически обновляется
> и в предидущих. Например, Tmemo

Код создания "вновь открытых окон" - в студию!


 
Sphinx   (2004-01-22 22:04) [18]

Вопрос интересный.

Можно задать уточнения?
Ему эти окна ведь еще различать придется! Что бы передать нужную инфу в нужное окно, а не во все сразу. Может кто знает как? Меня это тоже заинтересовало.

P.S. Может я конечно чего и не понял, но врооде получится именно так что инфа будет литься во все формы.


 
Юрий Зотов ©   (2004-01-23 17:13) [19]

> Sphinx (22.01.04 22:04) [18]

И какие проблемы?

procedure OnDataExist;
begin
with TForm2.Create(Application) do
begin
Memo1.Lines.Text := ... // передаем, например, какой-то текст
Show
end
end;


 
Sphinx   (2004-01-23 17:38) [20]

> Юрий Зотов © (23.01.04 17:13) [19]

А если форма уже создана!
У меня почему-то такой фокус не сработал:


with TMyForm do
begin
if TMyForm.Tag="нужное значение" then
Meme.Lines.Text:="..........";
end;


 
webpauk   (2004-01-23 17:43) [21]

>Sphinx
так ведь и Tag будет меняться для всех окон


 
webpauk   (2004-01-23 17:50) [22]

можно форму засунуть в dll. Только еще не пробовал, но думаю, получится


 
Юрий Зотов ©   (2004-01-23 17:52) [23]

> Sphinx (23.01.04 17:38) [20]

Разницу между классом и его экземпляром понимаете?
Похоже, что нет. Выводы сделайте сами.


 
webpauk   (2004-01-23 17:57) [24]

c Dll всё получается. И информация не обновляется. Вот выход!


 
webpauk   (2004-01-23 17:59) [25]

Создаем Dll, в нее запихиваем Form1

library Project1;

uses
SysUtils,
Classes,
Forms,
Unit1 in "Unit1.pas" {Form1};

{$R *.res}

procedure FormShow(Value: String); stdCall;
begin
Form1:=TForm1.Create(Application);
Form1.edit1.text:=Value;
Form1.Show;
end;

exports FormShow;

end.


Создаем проект:

unit Unit12;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

procedure FormShow(Value: String); stdCall; external "Project1.dll";

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FormShow(Edit1.Text);
end;

end.


Или динамически подгружаем - кому как нравится


 
webpauk   (2004-01-23 18:03) [26]

одно только интересно - как из этой формы вытащить кучу результатов. Ведь инициирующая функция одна, а результатов - много?


 
Плохиш_   (2004-01-23 18:09) [27]

Я не понял
Это после сбоя сервера, генератор первоапрельских шуток включился, что-ли?
Здесь, самых основ не знают, в соседней ветке из исходников exe сделать не могут :-(


 
Юрий Зотов ©   (2004-01-23 18:11) [28]

> webpauk (23.01.04 17:59) [25]

При чем тут DLL - совершенно непонятно. Это раз.
Application в EXE и в DLL разные, поэтому будут глюки. Это два.
При закрытии программы получите ошибку 217. Это три.
Не понимаю, зачем нужно создавать проблемы самому себе. Это четыре.

procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
Edit1.Text := Self.Edit1.Text;
Show
end
end;

Эти 8 простейших строчек заменяют всю Вашу DLL и не создают никакой головной боли.


 
webpauk   (2004-01-23 18:12) [29]

>Плохиш_
я не понял, это наезд?


 
Юрий Зотов ©   (2004-01-23 18:16) [30]

Увы, это констатация факта.


 
able ©   (2004-01-23 18:18) [31]

Была такая же проблема, но для TTabSheet, если найду пример сброшу...


 
Sphinx   (2004-01-23 19:43) [32]

>> Юрий Зотов © (23.01.04 17:13) [19]
>
>А если форма уже создана!
>У меня почему-то такой фокус не сработал:

ошибка была, я перебираю не TMyForm а MyForm


with TMyForm do
begin
if MyForm.Tag="нужное значение" then
Meme.Lines.Text:="..........";
end;



with TForm2.Create(Application) do
begin
Edit1.Text := Self.Edit1.Text;
Show
end

не то это маленько, форма уже создана!!! то есть процедура TForm2.Create(Application) ошибку вызовет...
нужно именно перебрать все формы созданные на основе TMyForm

Может чего я и не понимаю, но разницу между компонентом и элементом, созданном на его основе знаю.

>webpauk (23.01.04 17:43) [21]
>>Sphinx
>так ведь и Tag будет меняться для всех окон

а по тегам я формы различал, примерно так было

with TMyForm.Create(Self) do
if MyForm.Caption="MyForm" then
begin
MyForm.Tag:=Screen.FormCount;
MyForm.Caption:="нужная мне информация"
end;


 
Юрий Зотов ©   (2004-01-23 20:07) [33]

> Sphinx (23.01.04 19:43) [32]

> with TMyForm do...

Эта строка - извините, бред. Разницу между классом и его экземпляром Вы все же недопонимаете.

> форма уже создана!!! то есть процедура
> TForm2.Create(Application) ошибку вызовет...


И это утверждение - извините, тоже бред. Никто не запрещает создавать хоть миллион экземпляров класса.

> нужно именно перебрать все формы созданные на основе TMyForm

Можно запоминать ссылки на них в списке или массиве, а потом пройти по нему в цикле. Можно создавать их с общим Owner"ом и потом пройти по его списку Components. Можно пройти по списку Screen.Forms. Можно... и т.д., и т.п.

> разницу между компонентом и элементом, созданном на его
> основе знаю.


Завидую. Потому что я - не знаю. Собственно, я вообще не знаю, что такое "элемент, созданный на основе компонента".


 
Sphinx   (2004-01-23 20:26) [34]

>Юрий Зотов © (23.01.04 20:07) [33]
>Собственно, я вообще не знаю, что такое "элемент, созданный на основе компонента".

Давайте не будем тут бить за правильность(неправильность) того или инного определения! Под элементом я имел в виду экземпляр класса (выражаясь вашими словами) созданный на основе компонента.
Пример Button1 -> элемент формы на основе класса TButton.

Видимо вы недопоняли мой вопрос! Имеется уже созданная форма (экземпляр - хе) на основе запроектированного потомка класса TForm, к примеру TMyForm. И нужно НЕ СОЗДАТЬ НОВУЮ ФОРМУ, А ПЕРЕДАТЬ ДАННЫЕ В УЖЕ СУЩЕСТВУЮЩУЮ, одну из многих, вот как именно выбрать нужную!!!
В той же аське к примеру открыто пять одинаковых окон, для разговора в пятью разными людьми. Приходит сообщени от одного из них. Создается новое окно, в него передается текст сообщения.


with TForm2.Create(Application) do
begin
Edit1.Text := Self.Edit1.Text;
Show
end


А если сообщение пришло от одного из тех с кем я общаюсь???? что тоже создавать форму? при том, что одно окно для данного контакта уже имеется, и можно (и нужно) передать данные именно в него.


 
Юрий Зотов ©   (2004-01-23 21:30) [35]

> Sphinx (23.01.04 20:26) [34]

Привел же уже несколько способов... что ж еще-то?

unit MainFormUnit;

uses
...;

type
TAppMainForm = class(TForm)
...
public
FList: TList;
procedure ShowDlg(User, NewText: string);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

var
AppMainForm: TAppMainForm;

implementation

uses
DlgFormUnit;

constructor TAppMainForm.Create(AOwner: TComponent);
begin
inherited;
FList := TList.Create
end;

destructor TAppMainForm.Destroy;
var
i: integer;
begin
for i := FList.Count - 1 downto 0 do
TDlgForm(FList[i]).Close;
FList.Free;
inherited
end;

procedure TAppMainForm.ShowDlg(User, NewText: string);
var
i: integer;
begin
for i := 0 to FList.Count - 1 do
with TDlgForm(FList[i]) do
if Caption = User then
begin
AddText(NewText);
BringToFront;
Exit
end;
with TDlgForm.Create(nil) do
begin
Caption := User;
AddText(NewText);
Show
end
end;

end.

==================================

unit DlgFormUnit;

uses
...;

type
TDlgForm = class(TForm)
Memo: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
procedure AddText(NewText: string);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

implementation

uses
MainFormUnit;

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

procedure TDlgForm.AddText(NewText: string);
begin
with Memo.Lines do Text := Text + NewText
end;

constructor TDlgForm.Create(AOwner: TComponent);
begin
inherited;
AppMainForm.FList.Add(Self)
end;

destructor TDlgForm.Destroy;
begin
AppMainForm.FList.Remove(Self);
inherited
end;

end.


 
Sphinx   (2004-01-23 21:52) [36]

> Юрий Зотов © (23.01.04 21:30) [35]

Ладно, я тут потуплю малость с вашим кодом, а заодно задам еще один вопрос:
> with TMyForm do - бред ? а тогда
> with TDlgForm(FList[i]) do - не бред ?
тут конечно я спорить не буду, мой-то код не работает :)

как тогда правильно перебрать ВСЕ экземпляры TMyForm созданные программой не занося их в массив?
А вот про Screen.Forms - просмотрел...но если использовать этот массив то будут перебираться вообще все формы программы???
Я не настолько владею англ. (узучал фр.) чтобы постоянно лазать в хелп, так что может просто ответите? :)
И программирование - это мое хобби, а не средство заработка как очевидно у вас.


 
Юрий Зотов ©   (2004-01-23 22:49) [37]

> Sphinx (23.01.04 21:52) [36]

> with TMyForm do - бред?

Бред. Потому что TMyForm - это ссылка на класс , а не на экземпляр класса. Так можно вызывать разве что только классовые методы, да и то я не уверен, что компилятор не ругнется.

> а тогда
> with TDlgForm(FList[i]) do - не бред?


Не бред. Потому что FList[i] как раз и содержит ссылку на экземпляр класса TDlgForm. Мы просто привели его тип.

> мой-то код не работает

Я свой тоже не проверял, потому что показывал способ , а не готовую программу. Поэтому погрешности возможны, но способ рабочий, это даже вне всяких сомнений.

> как тогда правильно перебрать ВСЕ экземпляры TMyForm созданные
> программой не занося их в массив?

Например, так:

for i := 0 to Screen.Forms - 1 do
if Screen.Forms[i] is TMyForm then
with TMyForm(Screen.Forms[i]) do
begin
...
end;

Или, если все формы создавались с Owner=Application, то так:

for i := 0 to Application.ComponentCount - 1 do
if Application.Components[i] is TMyForm then
with TMyForm(Application.Components[i]) do
begin
...
end;

> И программирование - это мое хобби, а не средство заработка
> как очевидно у вас.

У меня это и то, и другое.


 
Petr V. Abramov ©   (2004-01-23 23:44) [38]

> Юрий Зотов © (22.01.04 18:24) [11]
> TForm2.Create(Application).Show
Если в переписанном Create или событии OnCreate 100% безопасный код - просто и со вкусом. А если нет? А если потом придет идея в OnCreate кривого (или просто с возможным exception`ом ) кода добавить?


 
Юрий Зотов ©   (2004-01-25 12:13) [39]

> Petr V. Abramov © (23.01.04 23:44) [38]

И что это меняет? Ничего. Последовательность вызовов и событий здесь абсолютно та же самая, что и обычно. Поэтому если будет Exception, то до Show дело просто не дойдет.



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.019 c
1-16508
Erik
2004-01-27 11:05
2004.02.06
Неустойчиво работает конвертация записи в variant.


3-16030
Volodya_
2004-01-16 17:06
2004.02.06
Буфер


1-16235
Serginio666
2004-01-26 19:38
2004.02.06
Вопрос по Хэлперам


1-16346
able
2004-01-23 18:02
2004.02.06
---|Ветка была без названия|---


1-16358
MadGhost
2004-01-24 23:12
2004.02.06
Научите работать с потоками нормально или ссылку дайте?