Главная » Delphi » Пример более сложного приложения

0

Познакомившись с основами технологии OLE и классом  TOleContainer, можно приступить  к  рассмотрению примера,  который  по настоящему  продемонстрирует возможности использования OLE в реальных приложениях.

Начнем  с  создания  нового  проекта,  по   шаблону   приложения  MDI  (Multiple Document Interface —  многодокументный интерфейс).  После  применения стандарт ного  шаблона  MDI главная  форма этого  приложения была немного модифицирована (рис. 15.21).

Дочерняя форма MDI показана на  рис. 15.22.  Это  пример формы стиля  fsMDI- Child с компонентном TOleContainer, помещенным в форму  с параметром вырав нивания alClient (Занять всю клиентскую область).

Рис. 15.25. Редактирование внедренного рисунка Paint

Полный исходный код главного модуля приложения MDI OLE (Main.pas) приве

ден в листинге 15.16.

Листинг 15.16. Исходный код модуля Main.pas

unit Main;

interface

uses WinTypes, WinProcs, SysUtils, Classes, Graphics, Forms, Controls, Menus, StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ChildWin, ComCtrls, ToolWin, ImgList;

type

TMainForm = class(TForm)MainMenu1: TMainMenu; File1: TMenuItem; FileNewItem: TMenuItem; FileOpenItem: TMenuItem; FileCloseItem: TMenuItem; Window1: TMenuItem;

Help1: TMenuItem; N1: TMenuItem; FileExitItem: TMenuItem;

WindowCascadeItem: TMenuItem; WindowTileItem: TMenuItem; WindowArrangeItem: TMenuItem; HelpAboutItem: TMenuItem; OpenDialog: TOpenDialog; FileSaveItem: TMenuItem; FileSaveAsItem: TMenuItem; Edit1: TMenuItem;

PasteItem: TMenuItem; WindowMinimizeItem: TMenuItem; SaveDialog: TSaveDialog; CopyItem: TMenuItem;

CloseAll1: TMenuItem; StatusBar: TStatusBar; CoolBar1: TCoolBar; ToolBar1: TToolBar; OpenBtn: TToolButton; SaveBtn: TToolButton; ToolButton3: TToolButton; CopyBtn: TToolButton; PasteBtn: TToolButton; ToolButton6: TToolButton; ExitBtn: TToolButton; ImageList1: TImageList; NewBtn: TToolButton;

procedure FormCreate(Sender: TObject); procedure FileNewItemClick(Sender: TObject); procedure WindowCascadeItemClick(Sender: TObject); procedure UpdateMenuItems(Sender: TObject); procedure WindowTileItemClick(Sender: TObject); procedure WindowArrangeItemClick(Sender: TObject); procedure FileCloseItemClick(Sender: TObject); procedure FileOpenItemClick(Sender: TObject); procedure FileExitItemClick(Sender: TObject); procedure FileSaveItemClick(Sender: TObject); procedure FileSaveAsItemClick(Sender: TObject); procedure PasteItemClick(Sender: TObject);

procedure WindowMinimizeItemClick(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure HelpAboutItemClick(Sender: TObject);

procedure CopyItemClick(Sender: TObject);

procedure CloseAll1Click(Sender: TObject);

private

procedure ShowHint(Sender: TObject);end;

var

MainForm: TMainForm;

implementation

{$R *.DFM} uses About; var

NumChildren: Cardinal = 0;

procedure TMainForm.FormCreate(Sender: TObject);

begin

Application.OnHint := ShowHint;

Screen.OnActiveFormChange := UpdateMenuItems;

end;

procedure TMainForm.ShowHint(Sender: TObject);

begin

{ Отображать подсказки на строке состояния. }

StatusBar.SimpleText := Application.Hint;

end;

procedure TMainForm.FileNewItemClick(Sender: TObject);

begin

inc(NumChildren);

{ Создать новое дочернее окно MDI }

with TMDIChild.Create(Application) do begin

Caption := ‘Untitled’ + IntToStr(NumChildren);

{ Открыть диалог объекта OLE и осуществить вставку

в дочернее окно. }

OleContainer.InsertObjectDialog;

end;

end;

procedure TMainForm.FileOpenItemClick(Sender: TObject);

begin

if OpenDialog.Execute then

with TMDIChild.Create(Application) do begin

try

OleFileName := OpenDialog.FileName;

OleContainer.LoadFromFile(OleFileName);

Show;

except

Release;             // При ошибке освободить форму

raise;              // Передать исключение дальше

end;

end;

end;procedure TMainForm.FileCloseItemClick(Sender: TObject);

begin

if ActiveMDIChild <> nil then

ActiveMDIChild.Close;

end;

procedure TMainForm.FileSaveAsItemClick(Sender: TObject);

begin

if (ActiveMDIChild <> nil) and (SaveDialog.Execute) then

with TMDIChild(ActiveMDIChild) do begin

OleFileName := SaveDialog.FileName;

OleContainer.SaveToFile(OleFileName);

end;

end;

procedure TMainForm.FileSaveItemClick(Sender: TObject);

begin

if ActiveMDIChild <> nil then

{ Если имя не присвоено, выполнить "save as", }

if TMDIChild(ActiveMDIChild).OLEFileName = ” then

FileSaveAsItemClick(Sender)

{ в противном случае сохранить под текущим именем. }

else

with TMDIChild(ActiveMDIChild) do

OleContainer.SaveToFile(OLEFileName);

end;

procedure TMainForm.FileExitItemClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.PasteItemClick(Sender: TObject);

begin

if ActiveMDIChild <> nil then

with TMDIChild(ActiveMDIChild).OleContainer do

{ Перед вызовом диалогового окна удостоверьтесь, что в

буфере обмена находится допустимый объект OLE. }

if CanPaste then PasteSpecialDialog;

end;

procedure TMainForm.WindowCascadeItemClick(Sender: TObject);

begin

Cascade;

end;

procedure TMainForm.WindowTileItemClick(Sender: TObject);

begin

Tile;

end;

procedure TMainForm.WindowArrangeItemClick(Sender: TObject);

beginArrangeIcons;

end;

procedure TMainForm.WindowMinimizeItemClick(Sender: TObject);

var

I: Integer;

begin

{ Обратный проход массива MDIChildren. }

for I := MDIChildCount – 1 downto 0 do

MDIChildren[I].WindowState := wsMinimized;

end;

procedure TMainForm.UpdateMenuItems(Sender: TObject);

var

DoIt: Boolean;

begin

DoIt := MDIChildCount > 0;

{ Только допустимые параметры, если это активное дочернее окно }

FileCloseItem.Enabled := DoIt;

FileSaveItem.Enabled := DoIt;

CloseAll1.Enabled := DoIt;

FileSaveAsItem.Enabled := DoIt;

CopyItem.Enabled := DoIt;

PasteItem.Enabled := DoIt;

CopyBtn.Enabled := DoIt;

SaveBtn.Enabled := DoIt;

PasteBtn.Enabled := DoIt;

WindowCascadeItem.Enabled := DoIt;

WindowTileItem.Enabled := DoIt;

WindowArrangeItem.Enabled := DoIt;

WindowMinimizeItem.Enabled := DoIt;

end;

procedure TMainForm.FormDestroy(Sender: TObject);

begin

Screen.OnActiveFormChange := nil;

end;

procedure TMainForm.HelpAboutItemClick(Sender: TObject);

begin

with TAboutBox.Create(Self) do begin

ShowModal;

Free;

end;

end;

procedure TMainForm.CopyItemClick(Sender: TObject);

begin

if ActiveMDIChild <> nil then

TMDIChild(ActiveMDIChild).OleContainer.Copy;

end;

procedure TMainForm.CloseAll1Click(Sender: TObject);begin

while ActiveMDIChild <> nil do begin

// Использовать метод Release, а не Free!

ActiveMDIChild.Release;

// Пусть Windows примет необходимые меры

Application.ProcessMessages;

end;

end;

end.

Резюме

В этой большой по объему главе рассматривались основы технологий COM, OLE и ActiveX. Знание этих  основ  поможет понять процессы, происходящие при  выполне нии приложений, созданных с использованием данных  технологий. Кроме  того, было дано некоторое представление о различных типах  COM ориентированных клиентов и серверов, а также  разновидностях технологий автоматизации в Delphi. Помимо глу бокого  рассмотрения технологий COM  и автоматизации,  желающие могли  познако миться  с работой компонента библиотеки VCL TOleContainer.

За  дополнительной информацией о технологиях COM  и  ActiveX обращайтесь к

другим  главам  этой  книги.  В главе  16, “Программирование для оболочки Windows”, описаны примеры создания реального сервера COM,  а в главе  18, “Транзакционные методы  разработки с применением COM+ и MTS”— транзакционные методы  при  раз работке приложений COM+ в Delphi.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии