Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
3-13897
Fedorenkoda
2002-08-07 13:19
2002.09.05
Две записи вместо одной


7-14311
Максимка
2002-06-27 06:55
2002.09.05
Как понизить число оборотов CD-ROM а?


1-14154
Дмитрий Иванов
2002-08-25 03:28
2002.09.05
Глюки при экспорте в Excel


7-14300
Timon
2002-06-25 13:27
2002.09.05
WM_KEYDOWN


3-13938
Сошел с ума
2002-08-15 12:46
2002.09.05
Помогите запрос составить:





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский