Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание компонента [D6, Win2k]


Страницы:   1 2

Shrek ©   (2002-08-22 19:16:00) 

Как невизуальному компоненту отправить текст?


Юрий Зотов   (2002-08-25 20:46:00) [1]

А справки у Вас разве нет?

procedure Loaded; virtual;

Description
Loaded allows a component to initialize itself after all its parts have been loaded from a stream.

И далее все подробно расписано. Суть в том, что этот метод вызывается автоматически после полной загрузки DFM.

type
TMyComponent = class(TComponent)
...
public
procedure Loaded; override;
...
end;

procedure TMyComponent.Loaded;
begin
inherited;
... // Здесь все свойства уже те, что были заданы в design-time
end;


Shrek   (2002-08-25 19:51:00) [2]


> Юрий Зотов


Я не очень в написании компонент, тому и не понимаю, что Вы имеете в виду ( Loaded). Если можно по конкретнее, пожалуйста.


Юрий Зотов   (2002-08-23 22:10:00) [3]

Перекройте метод Loaded и показывайте сообщение оттуда. В этой точке FText уже будет не пустым, а тем, который был введен в Object Inspector при разработке.

Для связи с результатами проверки в конструкторе можно использовать булевское поле, а можно и просто перенести всю работу в Loaded.


Shrek   (2002-08-23 17:40:00) [4]

Да выполняется и меседж пустой!!!


Skier   (2002-08-23 17:34:00) [5]

>Shrek


constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTexte := "Hello, world !";
LookForPreviousInstance;
end;

procedure TComponent1.LookForPreviousInstance;
begin
//.............................
MessageBox(Application.Handle, PChar(FTexte), "Error", MB_OK);
//.............................
end;


А если у тебя не выполняется условие if FoundAtom <> 0 then
то это твои проблемы...


Shrek   (2002-08-23 17:17:00) [6]

Идея. Компонент при запуске провиряет не запущино ли приложение уже (тоесть не дать запустить програму два и больше раза). Если приложение уже запущено то показать меседж и закрыть его.
Надеюсь ясно!

Вот код компоненты.
Попробуйте сами.

unit Component1;

interface

uses
Windows, Messages, SysUtils, Classes, Forms, Dialogs;

type
TComponent1 = class(TComponent)
private
{ Private declarations }
FTexte : String;

AtomText: array[0..31] of Char;

protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
procedure LookForPreviousInstance;



published
{ Published declarations }
property Texte: String read FTexte write FTexte;
end;

procedure Register;

implementation

constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);


LookForPreviousInstance;
end;

destructor TComponent1.Destroy;
var
FoundAtom : TAtom;
ValueReturned : word;
begin
// не забудьте удалить глобальный атом
FoundAtom := GlobalFindAtom(AtomText);
if FoundAtom <> 0 then ValueReturned := GlobalDeleteAtom(FoundAtom);

inherited Destroy;
end;


procedure TComponent1.LookForPreviousInstance;
var
PreviousInstanceWindow : hWnd;
AppName : array[0..30] of char;
FoundAtom : TAtom;

begin
// помещаем имя приложения в AtomText
StrFmt(AtomText, "OnlyOne%s", [Copy(Application.Title,1,20)]);
// Проверяем, не создано ли уже атома с таким именем приложения
FoundAtom := GlobalFindAtom(AtomText);
if FoundAtom <> 0 then // эта копия приложения уже запущена
begin

StrFmt(AppName,"%s", [Application.Title]);

MessageBox(Application.Handle, PChar(FTexte), "Error", MB_OK);

// изменяем текущий заголовок, чтобы FindWindow не видела его
Application.ShowMainForm := false;
Application.Title := "destroy me";
// ищем предыдущую копию приложения
PreviousInstanceWindow := FindWindow(nil,AppName);
// Передаём фокус на предыдущую копию приложения
// завершаем текущую копию
Application.Terminate;

if PreviousInstanceWindow <> 0 then
if IsIconic(PreviousInstanceWindow) then
ShowWindow(PreviousInstanceWindow,SW_RESTORE)
else SetForegroundWindow(PreviousInstanceWindow);
end;
// создаём глобальный атом, чтобы предотвратить запуск другой копии приложения
FoundAtom := GlobalAddAtom(AtomText);
end;

procedure Register;
begin
RegisterComponents("Samples", [TComponent1]);
end;

end.


Skier   (2002-08-23 17:10:00) [7]

>Юрий Зотов
Может хоть Вы, Маэстро, догадались чего вообще хочет
автор вопроса ? А то я уже теряюсь в догадках...


Юрий Зотов   (2002-08-23 17:06:00) [8]

> Shrek

И что же Вы хотели? Все работает правильно, что написали - то и получили.

При создании компонента поле FText всегда будет пустым (а каким еще оно может быть?). Инициализировать его можно в конструкторе, как написал Skier. А Инспектору Объектов оно станет доступно уже потом, после отработки конструктора (а как иначе? ведь чтобы компонент вообще стал доступен, его надо сначала создать).

Поэтому либо Вы инициализируете FText в конструкторе перед вызовом MyProc, либо при создании компонента всегда будете получать пустое сообщение.

Вообще, не очень понятно, что Вы хотите сделать. В чем идея?


Shrek   (2002-08-23 16:59:00) [9]

Нет!
Всё До свидания!
Увидимся позже!


Skier   (2002-08-23 16:39:00) [10]

>Shrek

constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FText e:= "Hello, world !";
MyProc;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Component1.Text e:= "Hello, world !";
end;


Shrek   (2002-08-23 16:35:00) [11]

Достал

unit Component1;

interface

uses
Windows, Messages, SysUtils, Classes, Forms, Dialogs;

type
TComponent1 = class(TComponent)
private
{ Private declarations }
FTexte : String;

protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(aOwner: TComponent); override;
procedure MyProc;



published
{ Published declarations }
property Texte: String read FTexte write FTexte;
end;

procedure Register;

implementation

constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
MyProc;
end;

procedure TComponent1.MyProc;
begin
здесь штото
...
MessageBox(Application.Handle, FTexte, "Error", MB_OK);
...
и здесь
end;

procedure Register;
begin
RegisterComponents("Samples", [TComponent1]);
end;

end.


не думал что это так друдно для когото


Skier   (2002-08-23 16:26:00) [12]

>Shrek
Нет слов...


Shrek   (2002-08-23 16:21:00) [13]

соррри.
при использовании самого компонента то есть при проэктировании формы.

> 1) Покажи код как у тебя это свойство объявлено в классе


private
FText : String;

procedure TForm1.Button1Click(Sender: TObject);
begin
Component1.Text := "Hello, world !";
end;


Skier   (2002-08-23 16:10:00) [14]

>Shrek

> процеси проектирования задавать.


Что вообще под этим подразумевается ? (проектирования...)

1) Покажи код как у тебя это свойство объявлено в классе
2) FText := "Hello, world !"; для задания значения свойства
при создании - САМОЕ ТО !
3) И честно говоря, ты свою проблему так и не сформулировал
(коротко и по-русски...).Пока только есть словоблудие...
4) Если копать твой вопрос интуитивно, то тогда видимо (?) так :
constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Text := "Hello, world !";
ThisMyProc; //Эта процедура выполняет
end;



Shrek   (2002-08-23 16:01:00) [15]


> Skier ©


нет это не то!

constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FText := "Hello, world !";
//FText - это есть проперти я должен его в процеси проектирования задавать. TComponent1.Text := ""Hello, world !";

ThisMyProc; //Эта процедура выполняет
end;




Skier   (2002-08-23 15:13:00) [16]

>Shrek

;
> так как его присвоять?




constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FText := "Hello, world !";
ThisMyProc; //Эта процедура выполняет
end;


Shrek   (2002-08-23 15:10:00) [17]

в написание компонт я не очинь но думаю что ошыбака здесь.
процедура выполняется сразу при создании, а параметр FText ещё не присвоян.
так как его присвоять?

constructor TComponent1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ThisMyProc; //Эта процедура выполняет
//MessageBox(Application.Handle, ftext, "Error", MB_OK);
end;


Skier   (2002-08-23 11:54:00) [18]

>Юрий Зотов
Вы правы !
Не туда меня занесло :)
Спасибо за критику.
>Shrek
в Component.Text может быть пустая строка
если (ещё вариант в добавление к Маэстро) у своиства
есть метод для чтения значения (например read GetText) и он
не возвращает значение свойства Component.Text;


Юрий Зотов   (2002-08-22 21:36:00) [19]

> Skier © (22.08.02 19:24)

1. > TControl.Perform(...)
Разве TControl - невизуальный компонент? У невизуальных компонентов нет ни Perform, ни WndProc.

2. > или послать сообщение родителю невизуального компонента.
У невизуальных компонентов нет родителей. У них есть владельцы. А владельцем может быть любой компонент, в том числе тоже невизуальный. Или владельца может вовсе не быть. Кому же и как посылать сообщение? Да даже если подходящий получатель и найдется, то каким образом заставить его правильно обработать это сообщение?

> Shrek
Если компонент написан правильно и так, как вы его описали, то все должно работать. Значит, либо кривой сам компонент, либо он неверно используется. Проверьте метод SetText (если он есть). А еще лучше пройти отладчиком, сразу все и выяснится.


Shrek   (2002-08-22 19:35:00) [20]

процедура в компоненте виполняет.
MessageBox(Application.Handle, text, "Error", MB_OK);

text это проперти
______________

теперь в програме

...
begin
Component.Text := "text";
end;

________________

получается:
выдаёт пустой месадже!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо