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