Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизКуча окон, для приходящих сообщений Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.031 c