Главная страница
    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.034 c
1-1121098808
Mameluke
2005-07-11 20:20
2005.07.31
Определение папки, откуда запущено приложение


3-1119434430
snowman2002
2005-06-22 14:00
2005.07.31
Вопрос по локальным базам данных


6-1113822641
Gek1
2005-04-18 15:10
2005.07.31
Socket Error 10038


1-1121101074
-virus-
2005-07-11 20:57
2005.07.31
помогите, проблема с файлом.


1-1121333521
Alex_K
2005-07-14 13:32
2005.07.31
Заполнение массива.





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