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