Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-16136
Серж
2004-01-14 10:21
2004.02.06
Вернуть данные из процедуры Oracle в dbgrid Delphi


1-16391
ORMADA
2004-01-28 13:44
2004.02.06
ValueListEditor


14-16622
LSV
2004-01-15 03:16
2004.02.06
Подскажите, какие книги по Delphi 7 самые лучшие?


14-16730
Думкин
2004-01-16 06:11
2004.02.06
С днем рождения! 16 января.


1-16385
hfa
2004-01-23 16:45
2004.02.06
Кто нибудь может разъеснить в точности структуру Bar Code-а?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский