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

Вниз

Компонент   Найти похожие ветки 

 
xZero   (2004-07-31 18:11) [0]


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 - нет!!!
Разъясните в чем дело!

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


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

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


 
Sun bittern ©   (2004-07-31 19:24) [2]

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

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;

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


 
Sun bittern ©   (2004-07-31 19:26) [3]

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


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

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


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

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


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

> xZero

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

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


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

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

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

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


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

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


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

Во-первых, в 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;



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
4-1117384202
cherrex
2005-05-29 20:30
2005.07.31
Delphi и ABBYY FineReader


3-1118885789
Dvm_home
2005-06-16 05:36
2005.07.31
Определение дубля


14-1120723876
Doctor Deejay
2005-07-07 12:11
2005.07.31
Трансляция радио. Linux, Unix, mp3pro


4-1117546909
Eugene L
2005-05-31 17:41
2005.07.31
Прокрутка SpinEdit / UpDown с пом. колеса мыши без исп. кнопок


3-1119340037
ali_tash
2005-06-21 11:47
2005.07.31
TOracleDataSet выводит поля с пробелами как пустые