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

Вниз

Создание компонента   Найти похожие ветки 

 
Shrek ©   (2002-08-22 19:16) [0]

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


 
Skier ©   (2002-08-22 19:24) [1]

>Shrek
TControl.Perform(...)
или послать сообщение родителю невизуального компонента.


 
Shrek ©   (2002-08-22 19:35) [2]

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

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

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

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

________________

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



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

> Skier © (22.08.02 19:24)

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

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

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


 
Skier ©   (2002-08-23 11:54) [4]

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


 
Shrek ©   (2002-08-23 15:10) [5]

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

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



 
Skier ©   (2002-08-23 15:13) [6]

>Shrek

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




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


 
Shrek ©   (2002-08-23 16:01) [7]


> Skier ©


нет это не то!

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

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





 
Skier ©   (2002-08-23 16:10) [8]

>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:21) [9]

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

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


private
FText : String;

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


 
Skier ©   (2002-08-23 16:26) [10]

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


 
Shrek ©   (2002-08-23 16:35) [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:39) [12]

>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:59) [13]

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


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

> Shrek

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

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

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

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


 
Skier ©   (2002-08-23 17:10) [15]

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


 
Shrek ©   (2002-08-23 17:17) [16]

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

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

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:34) [17]

>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:40) [18]

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


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

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

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


 
Shrek ©   (2002-08-25 19:51) [20]


> Юрий Зотов


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


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

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

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;



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

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

Наверх




Память: 0.53 MB
Время: 0.018 c
1-14143
Helg
2002-08-23 20:39
2002.09.05
Как сохранить TImageList в файле?


3-13918
bobr12
2002-08-14 16:44
2002.09.05
Проблема при одновременном обращении программ к InterBase


3-13960
Xmen
2002-08-16 09:36
2002.09.05
Нужно чтобы база работал с двумя клентами.........


3-13875
PD
2002-08-16 23:51
2002.09.05
работа с BLOB-полями


4-14343
MetalFan
2002-07-05 17:16
2002.09.05
Как поймать запуск программы?