Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Interface


Страницы:   1 2

андр ©   (2007-12-19 14:43:00) 

Можно ли както обращатся к с труктуре типа:

TType = (tString, tInteger, tBoolean)

через интерфейсы, если можно, то как объявить такой тип ???


Kolan   (2007-12-19 15:56:00) [1]

Имхо кто загрузил библиотеку, тот и знает когда её выгружать.

Обычно диалог вешь модальная.

Напрмер TOpenDialog

OpenDialog := TOpenDialog.Create
try
 if OpenDialog.Execute then
  …
finally
 OpenDialog.Free;
end;


Так же можно и с dll

LoadLibrary
try
 if then
 …
finally
 FreLibrary
end;


А не возвращается пока все не сделает.

Ежели у тебя этот диалог в фоновом режиме работает, то надо как-то синхронизировать… Тут возможны варианты…


андр   (2007-12-19 15:48:00) [2]


> FreeLibrary ?

угу


андр   (2007-12-19 15:48:00) [3]


> Kolan ©   (19.12.07 15:41) [24]

Держи мастера (М)

;-)

Еще раз спасибо!


Kolan   (2007-12-19 15:45:00) [4]


> Каким образом лутше выгружать плагин (dll) по окончанию
> в нем какихто действий:
> Посылать PostMessage, илиже использовать interface …?


По ситуации. И что значит «выгружать»? FreeLibrary ?


Kolan   (2007-12-19 15:41:00) [5]

Посетителя удобно использовать когда в той твоей форме по клику на кнопке надо делать то, что хочет пользователь, который её вызвал. А для настройки вида самой формы так их применить неудасться.

Был неправ. Но пример все равно полезный, из серии «взять на замеку».


андр   (2007-12-19 15:39:00) [6]


> Kolan ©   (19.12.07 15:38) [21]


Спас. очень помог!
Мастера ему! Мастера!!!! :-))))


андр   (2007-12-19 15:38:00) [7]


> Kolan ©   (19.12.07 15:33) [19]

Good!

Как самому активному в этом вопросе, еще вопрос:
Каким образом лутше выгружать плагин (dll) по окончанию в нем какихто действий:
Посылать PostMessage, илиже использовать interface ....?


Kolan   (2007-12-19 15:38:00) [8]

В случае как в моем примере посетителям надо знать о форме, следовательно тебе придется в общий моуль(как ты говоришь ShareModule) выносить и их.

Если бы у тебя были пакеты, я бы сделал посетителей…

С Dll надо, делать константы, имхо.

Пример виндовый диалог MesageBox. А вот и те самые константы:

const
 { MessageBox() Flags }
 {$EXTERNALSYM MB_OK}
 MB_OK = $00000000;
 {$EXTERNALSYM MB_OKCANCEL}
 MB_OKCANCEL = $00000001;
 {$EXTERNALSYM MB_ABORTRETRYIGNORE}
 MB_ABORTRETRYIGNORE = $00000002;
 {$EXTERNALSYM MB_YESNOCANCEL}
 MB_YESNOCANCEL = $00000003;
…


андр   (2007-12-19 15:34:00) [9]

Впринципе я думаю есть смысл передавать, 0,1,2,3,4.... пользователь всеравно этого не видет....


Kolan   (2007-12-19 15:33:00) [10]

Получается ты хочешь менять вид формы в зав от переданной настройки?
Наверно в случаее с Dll вариант с 0,1,2,3…  самый верный если состояний заданое кол-во и часто меняться не будет.

А это  0,1,2,3 описывается в документации(просто в текстовом файле), так вызываются все Windows диалоги.

Когда кто-то быдет вызывать твой диалог он прочтет документацию и вызовет его с соотв числов. таких примеров полно в Windows.pas.


андр   (2007-12-19 15:33:00) [11]


> Kolan ©   (19.12.07 15:23) [14]

:-* , ;-)))

Но всеравно бли кажется сложнее....


андр   (2007-12-19 15:28:00) [12]


> ShareTypes модуль тоже неохото делать, сразу весь код и
> в программу и модуль попадает...

Ну тогда выходит:


> То есть в одном pas, который виден и там и там…


Kolan   (2007-12-19 15:26:00) [13]

> Я неосмыслю блин, как

Понял — пример годится.


> и в основной программе и в модуле, а хотелось бы както в
> одном месте прописать и использовать…

В одном месте
в моем примере
надо разместить

IDialogVisitor

в твоем(который тоже вполне приемлим, просто менее удобный)
TShowDialog

То есть в одном pas, который виден и там и там…


Darvin   (2007-12-19 15:26:00) [14]

Такое не подойдет?
procedure P1 (D:Variant; VT: Integer);

P1('cccc', varString)
P1(234, varInteger)


Kolan   (2007-12-19 15:23:00) [15]

> Короче одним словом вот из этого unit uDialog, хочу сделать
> плагин…

Плохо понял что же именнонадо.

А пример тебе напишу.

Этота идея основана на рефакторинге Replace conditional case with polymorphism

Описываем такой интерфейс:

IDialogVisitor = interface
 procedure ShowDialogForm(DialogForm: TfDialog);
end;


Как обычно общий предок:

TCustomDialogVisitor = class(TInterfacedObject, IDialogVisitor)
public
 procedure ShowDialogForm(DialogForm: TfDialog); virtual; abstract;  
end;  

И одного конкретного потомка для примера:
TSomeDialogVisitor = class(TCustomDialogVisitor)
public
 procedure ShowDialogForm(DialogForm: TfDialog); override;  
end;  


Конструктор формы изменяем так:
Было:
  constructor Create(AOwner: TComponent; Rec: TDialog); overload;почему overload;?

Стало:
  constructor Create(AOwner: TComponent; DialogVisitor: IDialogVisitor); reintroduce;

constructor TfDialog.Create(AOwner: TComponent; DialogVisitor: IDialogVisitor);
begin
 inherited Create(AOwner);
 if Assigned(DialogVisitor) then
   DialogVisitor.ShowDialogForm(Self) // Тоесть мы передаем форму в посетителя, а он сам знает че с ней делать.
end;


В конкретных посетителях(у нас он 1 шас — TSomeDialogVisitor) помещаем код из кейсов:

procedure TSomeDialogVisitor.ShowDialogForm(DialogForm: TfDialog); override;
begin
 if Assigned(DialogForm) then
 begin
   with DialogForm do
   begin
     Caption := rsCaptionCard;
     grpBx.Caption := rsGrpBxCaptionCard;
     FMaxLen := 7;
     chkBxAutoNew.Visible := True;
   end;
 end;
end;


C CreateDialog разбирёшся сам.

А вызов такой:

procedure TfMain.mmProgramCardClick(Sender: TObject);
var
DialogVisitor: TCustomDialogVisitor;
begin
 DialogVisitor := TSomeDialogVisitor.Create;
 try
  if CreateDialog(Application, DialogVisitor) then
  begin
    //
  end;
 finally
   DialogVisitor.Free;
 end;
end;


Так как код case RecDialog.ShowType ofусловный, то и пример тоже. Основная идея в том, что я убрал условие навсегда + можно добавлять сколько угодно новых посетителей…

ЗЫ
 Писал прям тут…


андр   (2007-12-19 15:21:00) [16]


>
> На сколько я понял ты не хочешь писать тут длинный case,
>  так? Тогда можно как раз использовать посетителя.
>
> Если так, то напишу пример, иначе объясни что надо.


Я неосмыслю блин, как мне вызывать плагин диалога разных типов, можно конечно использовать 0,1,2,3.... но как то не осмысленно, хотелось бы вызывать передовая например sdCard или sdOther.... Можно, но прийдется тогда прописовать TShowDialog = (sdCard, sdCalculation, sdNewCard, sdOther);
и в основной программе и в модуле, а хотелось бы както в одном месте прописать и использовать.....
ShareTypes модуль тоже неохото делать, сразу весь код и в программу и модуль попадает...


андр   (2007-12-19 15:10:00) [17]


> Вызова других форм в зав от типа не видно что-то…


case RecDialog.ShowType of
  sdCard:
    begin
      RecCard.Face := FText;
      if Length(Trim(RecCard.Face)) <> 0 then
        RecCard.ShowType := scCard
      else
        RecCard.ShowType := scNewCard;

      if CreateCard(Application, RecCard) then
        begin
          Close;
        end;
    end;
 sdNewCard
 ...
 ...
 ... и т.д.
end;


андр   (2007-12-19 15:08:00) [18]

Сократил как ты и просил.. ;-)
Короче одним словом вот из этого unit uDialog, хочу сделать плагин...
Предложения принимаются... :-)


Kolan   (2007-12-19 15:07:00) [19]

> Хочу просто плагин вызывать…

Фразу не понял.

> case RecDialog.ShowType of
>   sdCard:
>     begin
>       Caption := rsCaptionCard;
>       grpBx.Caption := rsGrpBxCaptionCard;
>       FMaxLen := 7;
>       chkBxAutoNew.Visible := True;
>     end;
> end;

На сколько я понял ты не хочешь писать тут длинный case, так? Тогда можно как раз использовать посетителя.

Если так, то напишу пример, иначе объясни что надо.


> Думаю смысл понятен, диалог дальше вызывает другие формы
> взависимости от того какого типа он был вызван…

Вызова других форм в зав от типа не видно что-то…


андр   (2007-12-19 15:03:00) [20]


case RecDialog.ShowType of
  sdCard:
    begin
      Caption := rsCaptionCard;
      grpBx.Caption := rsGrpBxCaptionCard;
      FMaxLen := 7;
      chkBxAutoNew.Visible := True;
    end;
  sdNewCard:
    begin
      Caption := rsCaptionCard;
      grpBx.Caption := rsGrpBxCaptionCard;
      FMaxLen := 7;
      chkBxAutoNew.Visible := True;
    end;
  sdCalculation:
    begin
      Caption := rsCaptionCard;
      grpBx.Caption := rsGrpBxCaptionCard;
      FMaxLen := 7;
      chkBxAutoNew.Visible := True;
    end;
  sdOther:
    begin
      Caption := rsCaptionCard;
      grpBx.Caption := rsGrpBxCaptionCard;
      FMaxLen := 7;
      chkBxAutoNew.Visible := True;
    end;
end;


Думаю смысл понятен, диалог дальше вызывает другие формы взависимости от того какого типа он был вызван...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо