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

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

Компонент [D6, WinXP]


xZero ©   (2004-07-31 18:11:00) 


unit OneHinst;

interface

uses
 Windows, Messages, SysUtils,
 Classes, Dialogs;

type
 TOneHinst = class(TComponent)
 private
   FMutex: DWord;
   Function IsOneHinst: Boolean;
 protected
   { Protected declarations }
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('MyComp', [TOneHinst]);
end;

{ TOneHinst }

function TOneHinst.IsOneHinst: Boolean;
begin
 Result := False;
 FMutex := CreateMutex(nil, True, PChar('My_Mutext_Test_Name_'));
 if (FMutex = 0) then Exit else
 if (GetLastError( ) = ERROR_ALREADY_EXISTS) then begin
   ReleaseMutex(FMutex);
   Exit;
 end;
 Result := True;
end;

constructor TOneHinst.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 if (IsOneHinst = False) then Halt(0);
end;

destructor TOneHinst.Destroy;
begin
 if (FMutex <> 0) then ReleaseMutex(FMutex);
 inherited Destroy;
end;

end.

1. Делаю от TComponent. Верного ли я предка взял для данного случая?
2. if (IsOneHinst = False) then Halt(0);Результатом этой проверки является ф-ия Halt. Имхо, это не самое лучшее для компонента, как нужно закрывать свой процесс (вообщем, свою программу)?
3. Используя условие: if (IsOneHinst = False) then
- оно работает, но сточностью, да наоборот! Т.е. если = False, то программа закрывается, а, если написать = True - нет!!!
Разъясните в чем дело!

ЗЫ: Да, и, ообще, иногда какие-то "левые" ошибки вылетают при реализации!!!
Спасибо!


Юрий Зотов   (2004-08-01 16:33:00) [1]

Во-первых, в design-time компоненту работать вообще незачем. Заверните всю его функциональность в такие "обложки":

if not (csDesigning in ComponentState) then
begin
 ...
end;

Во-вторых, компонент надо делать, как синглтон (класс, позволяющий создать лишь один свой экземпляр). Например:

type
 TMyComp = class(TComponent)
   ...
 public
   class function NewInstance: TObject; override;
   procedure FreeInstance; override;
   ...
 end;

implementation

var
 SingleInstance: TMyComp = nil;

class function TMyComp.NewInstance: TObject;
begin
 if SingleInstance = nil then
   SingleInstance := inherited NewInstance;
 Result := SingleInstance
end;

procedure TMyComp.FreeInstance;
begin
 inherited;
 SingleInstance := nil
end;


xZero   (2004-08-01 14:43:00) [2]

Юрий Зотов, как тогда быть?


Германн   (2004-08-01 03:01:00) [3]

2 Юрий Зотов ©   (01.08.04 01:19) [6]
А вот это уже интересно!

Несколько раз встречал в своей практике компоненты, чьё предназначение состояло в том, что будучи "кинутыми" на главную форму приложения, они обеспечивали что-то особенное. Но ни разу не пришло в голову проверить их поведение при "создании в RunTime"!

Будет время - попробую.


Юрий Зотов   (2004-08-01 01:19:00) [4]

> xZero

Все это хорошо, но что произойдет с Delphi, если бросить на форму два таких компонента?

Или что произойдет с программой, если два таких компонента создать в ней динамически?


xZero   (2004-07-31 23:28:00) [5]

Все разобрался!


xZero   (2004-07-31 20:39:00) [6]

Да нет, проблемма где-то в др. месте!
Теперь, вообще, только переношу компонент с палитры, сразу же выскакиает ощибка!


Sun bittern   (2004-07-31 19:26:00) [7]

Ой! Result := True; Конечно в конце надо


Sun bittern   (2004-07-31 19:24:00) [8]

Я неуверен, но:

function TOneHinst.IsOneHinst: Boolean;
begin
 Result := False;
 FMutex := OpenMutex(MUTEX_ALL_ACCESS, False, PChar('My_Mutext_Test_Name_'));
 if FMutex = 0 then
 begin
   FMutex := CreateMutex(Nil, False, Сhar('My_Mutext_Test_Name_'));
   if MutHandle = 0 then
   begin
     ...
     Result := True;
   end;
 end;
end;

А чего колдуем то?


LLL   (2004-07-31 19:14:00) [9]

может
if (not IsOneHinst) then Halt(0);


Наверх

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