Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.04 c
1-1121078051
nastya
2005-07-11 14:34
2005.07.31
TMessage


14-1121025184
Магнум
2005-07-10 23:53
2005.07.31
Какова масса Вселенной?


14-1120993431
jack128
2005-07-10 15:03
2005.07.31
Есть желающие покритиковать конфигурацию компа??


14-1121167728
syte_ser78
2005-07-12 15:28
2005.07.31
Как убрать пробел?


14-1120716122
vajo
2005-07-07 10:02
2005.07.31
Есть адрес сетевой карты, нужен ее IP





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