![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент [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);