16220

Создание Help-файла

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №8 Создание Helpфайла Цель работы: Изучить способы создания Helpов Постановка задачи: Разработать Helpфайл поддерживающий контекстнозависимую помощь для задачи вычисления определенного интеграла. Создать содержание и текст составленный не мене

Русский

2013-06-20

132 KB

5 чел.

Лабораторная работа №8

Создание Help-файла

Цель работы: Изучить способы создания Help-ов

Постановка задачи: Разработать  Help-файл, поддерживающий контекстно-зависимую помощь для задачи вычисления определенного интеграла. Создать содержание и текст, составленный не менее чем из 3-х разделов. Обеспечить связь между разделами с помощью гипертекстовых ссылок.

Краткие теоретические сведения:

Для создания файла справки минимальными средствами необходим текстовый редактор поддерживающий формат rtf и программа Microsoft Help Workshop (она находится в каталоге Delphi\help\tools\hcrtf.exe).

Для создания текстового файла справки используется любой текстовый редактор, например редактор Microsoft Word XP. Файл может включать в себя, помимо текста, графические изображения.

Разделы файла справки связаны между собой ссылками.

Каждый раздел может содержать следующие атрибуты:

  •  Контекст - #
  •  Заголовок - $
  •  Список ключевых слов - k
  •  Порядковый номер в последовательности просмотра разделов - +
  •  Тег компиляции - *
  •  Макрокоманда - !

Из всех атрибутов обязателен только контекст представляющий собой идентификатор раздела. Атрибуты задаются сносками.

Ссылки обозначаются специальными шрифтовыми выделениями. Ссылка состоит из двух частей:

1) название, которое отобразится на экране

2) ссылка на раздел

Первая часть ссылки выделяется :подчёркиванием одной или двумя линиями, или зачёркиванием. Если текст подчёркнут одной линией то текст раздела будет отображён в виде всплывающей подсказки, два других выделения откроют текст раздела в этом же окне. Вместо текста в первой части может находится изображение с такими же выделениями как у текста.

Вторая часть ссылки выделяется скрытым текстом и пользователю не видна. Она содержит идентификатор раздела.

Обе части ссылки записываются подряд бес пробелов.

Текст программы:

<Project>

program Integral;

uses

 Forms,

 UDisplayForm in 'UDisplayForm.pas' {Form1},

 UCalc in 'UCalc.pas';

{$R *.res}

begin

 Application.Initialize;

 Application.HelpFile := 'D:\UniverCity\semester 4\ÊÏèßÏ\Lab08\Lab08.hlp';

 Application.CreateForm(TForm1, Form1);

 Application.Run;

end.

<UDisplayForm>

unit UDisplayForm;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Series, ExtCtrls, StdCtrls, TeEngine, TeeProcs, Chart, Buttons, UCalc;

type

 TForm1 = class(TForm)

   Edit2: TEdit;

   Edit1: TEdit;

   MethodSelector: TRadioGroup;

   DisplayChart: TChart;

   SeriesFunction: TLineSeries;

   Label1: TLabel;

   Label2: TLabel;

   Label4: TLabel;

   SeriesPatterned: TAreaSeries;

   FunctionFormula: TImage;

   Label3: TLabel;

   Edit3: TEdit;

   SpeedButton1: TSpeedButton;

   Edit4: TEdit;

   Panel1: TPanel;

   Label5: TLabel;

   Panel2: TPanel;

   CheckBox1: TCheckBox;

   SpeedButton2: TSpeedButton;

   procedure FormCreate(Sender: TObject);

   procedure SomeEditKeyPress(Sender: TObject; var Key: Char);

   procedure SpeedButton1Click(Sender: TObject);

   procedure SomeEditChange(Sender: TObject);

   procedure MethodSelectorClick(Sender: TObject);

   procedure CheckBox1Click(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormClick(Sender: TObject);

   function f2(x: Extended): Extended;

   procedure SpeedButton2Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 e1, e2, e3: string;

 p1, p2, p3: integer;

 integ: TIntegral;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var b: TBitmap;

begin

 b:=TBitmap.Create;

 b.LoadFromResourceName(hInstance, 'INTEGRAL');

 b.Transparent:=true;

 b.TransparentColor:=clWhite;

 FunctionFormula.Width:=b.Width;

 FunctionFormula.Height:=b.Height;

 FunctionFormula.Canvas.Brush.Color:=$00BAEDEF;

 FunctionFormula.Canvas.FillRect(Rect(0, 0, b.Width, b.Height));

 FunctionFormula.Canvas.StretchDraw(Rect(0, 0, b.Width-1, b.Height-1), b);

 b.Free;

 Panel1.Left:=FunctionFormula.Left+FunctionFormula.Width;

 Panel1.Height:=FunctionFormula.Height;

 Panel1.Top:=FunctionFormula.Top;

 integ:=TIntegral.Create;

 integ.Chart:=DisplayChart;

end;

//Edited

procedure TForm1.SomeEditKeyPress(Sender: TObject; var Key: Char);

begin

 if Sender=Edit3 then

 begin

   p3:=Edit3.SelStart;

   exit;

 end;

 if (Sender=Edit2) then

   p2:=Edit2.SelStart;

 if (Sender=Edit1) then

   p1:=Edit1.SelStart;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

 Application.Terminate;

end;

procedure TForm1.SomeEditChange(Sender: TObject);

var r: real;

   s: string;

begin

 if Sender=Edit3 then

 begin

   try

     integ.N:=StrToInt((Sender as TEdit).Text);

     e3:=Edit3.Text;

   except

     on EConvertError do begin

                               Edit3.Text:=e3;

                               Edit3.SelStart:=p3;

                             end;

   end;

 end

 else if ((Sender=Edit1) or (Sender=Edit2)) then

 begin

   if true then

   begin

       try

         r:=StrToFloat((Sender as TEdit).Text);

         e1:=Edit1.Text;

         e2:=Edit2.Text;

       except

         on EConvertError do begin

                               if Sender=Edit1 then

                               begin

                                 (Sender as TEdit).Text:=e1;

                                 (Sender as TEdit).SelStart:=p1;

                               end

                               else if Sender=Edit2 then

                               begin

                                 (Sender as TEdit).Text:=e2;

                                 (Sender as TEdit).SelStart:=p2;

                               end;

                               exit;

                             end;

       end;

       if Sender=Edit2 then

       begin

         integ.B:=r;

         //Application.MessageBox(PChar(floattostr(integ.Res)),'');

         s:=FloatToStr(integ.B);

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 2, s)

       end

       else

       begin

         integ.A:=r;

         s:=FloatToStr(integ.A);

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 60, s);

       end;

   end

   else

   begin

       FunctionFormula.Canvas.Font.Size:=10;

       if Sender=Edit2 then

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth('') div 2, 2, '')

       else

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth('') div 2, 60, '');

   end;

 end;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.MethodSelectorClick(Sender: TObject);

begin

 integ.CalcMethod:=MethodSelector.ItemIndex;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

 SeriesPatterned.AreaLinesPen.Visible:=(Sender as TCheckBox).Checked;

end;

procedure TForm1.FormShow(Sender: TObject);

begin

 SomeEditChange(Edit1);

 SomeEditChange(Edit2);

end;

procedure TForm1.FormClick(Sender: TObject);

begin

 integ.f:=f2;

end;

function TForm1.f2(x: Extended): Extended;

begin

 Result:=x*x*3;

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

 Application.HelpCommand(HELP_FINDER, 10);

end;

end.

<UCalc>

unit UCalc;

interface

uses Chart;

const funcCount=4;

type

    TValueChangedFunc=procedure (newValue: Extended);

    TF=function (x: Extended): Extended of object;

    TIntegral=class

     private

       FValueMin: Extended;//Нижняя граница

       FValueMax: Extended;//Верхняя граница

       FValueH: Extended; //Ширина шага

       FRes: Extended;    //Результат

       FValueN: Integer;  //Количество шагов

       FCalcMethod: Byte; //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       FAutoRedraw: Boolean; //Перерисовывать при изменении хотя бы одного параметра

       FChart: TChart;

       FOnMinChanged: TValueChangedFunc;

       FOnMaxChanged: TValueChangedFunc;

       FOnNChanged: TValueChangedFunc;

       FOnHChanged: TValueChangedFunc;

       FF: TF;          //Функция подынтегральная

     protected

       procedure SetN(newN: integer); virtual;

       procedure SetH(newH: Extended); virtual;

       procedure SetMin(newMin: Extended); virtual;

       procedure SetMax(newMax: Extended); virtual;

       procedure SetCalcMethod(newMethod: byte); virtual;

       procedure SetChart(newChart: TChart); virtual;

       procedure SetF(newF: TF);

     public

       constructor Create();

       destructor Destroy; override;

       property A: Extended read FValueMin write SetMin;//Нижняя граница

       property B: Extended read FValueMax write SetMax;//Верхняя граница

       property N: integer read FValueN write SetN default 10;//Количество шагов

       property H: Extended read FValueH write SetH;//Ширина одного шага

       property CalcMethod: byte read FCalcMethod write SetCalcMethod default 0;   //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       property Chart: TChart read FChart write SetChart;

       property AutoRedraw: boolean read FAutoRedraw write FAutoRedraw default true;//Перерисовывать при изменении хотя бы одного параметра

       property Res: Extended read FRes;

       //События (на изменение каждого из параметров)

       property OnMinChanged: TValueChangedFunc read FOnMinChanged write FOnMinChanged default nil;

       property OnMaxChanged: TValueChangedFunc read FOnMaxChanged write FOnMaxChanged default nil;

       property OnNChanged: TValueChangedFunc read FOnNChanged write FOnNChanged default nil;

       property OnHChanged: TValueChangedFunc read FOnHChanged write FOnHChanged default nil;

       //Подынтегральная функция

       function fDefault(x: Extended): Extended; virtual;

       //

       property f: TF read FF write SetF;

       //Функции подсчёта результата

       procedure ReCalc(); virtual;

       function calc_trapezium: Extended; virtual;

       function calc_rectangle_left: Extended; virtual;

       function calc_rectangle_right: Extended; virtual;

       function calc_rectangle_media: Extended; virtual;

       //Функции вывода информации в компонент TChart

       procedure Redraw(); virtual;

       procedure draw_f; virtual;

       procedure draw_trapezium; virtual;

       procedure draw_rectangle_left; virtual;

       procedure draw_rectangle_right; virtual;

       procedure draw_rectangle_media; virtual;

    end;

implementation

constructor TIntegral.Create();

begin

 inherited Create();

 FValueMax:=1;

 FValueMin:=0;

 FValueH:=0.1;

 FAutoRedraw:=true;

 FF:=fDefault;

 N:=10;

end;

destructor TIntegral.Destroy;

begin

 inherited Destroy;

end;

procedure TIntegral.SetN(newN: integer);

begin

 FValueN:=newN;

 if FValueN<1 then

   FValueN:=1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetH(newH: Extended);

begin

 FValueN:=round((FValueMax-FValueMin)/newH)+1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMin(newMin: Extended);

begin

 FValueMin:=newMin;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMinChanged) then

   FOnMinChanged(newMin);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMax(newMax: Extended);

begin

 FValueMax:=newMax;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMaxChanged) then

   FOnMaxChanged(newMax);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetChart(newChart: TChart);

begin

 FChart:=newChart;

 if (AutoRedraw) then

   Redraw();

end;

procedure TIntegral.SetCalcMethod(newMethod: byte);

begin

 if (newMethod in [0..3]) then

 begin

   FCalcMethod:=newMethod;

   if (AutoRedraw) then

     Redraw();

   ReCalc();

 end;

end;

procedure TIntegral.SetF(newF: TF);

begin

 if (@newF<>nil) then

 begin

   FF:=newF;

   ReCalc;

   Redraw;

 end;

end;

procedure TIntegral.ReCalc;

begin

   FRes:=0;

   if FValueMin<FValueMax then

   begin

     case FCalcMethod of

     0: FRes:=calc_trapezium();

     1: FRes:=calc_rectangle_left();

     2: FRes:=calc_rectangle_right();

     3: FRes:=calc_rectangle_media();

     end;

   end;

end;

function TIntegral.calc_trapezium: Extended;

var x: extended;

   i: integer;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to FValueN do

 begin

   Result:=Result+(f(x)+f(x+FValueH))/2*FValueH;

   x:=x+FValueH;

 end;

end;

function TIntegral.calc_rectangle_left:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_right:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_media:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH/2);

     x:=x+FValueH;

   end;

end;

procedure TIntegral.Redraw;

begin

 if (Assigned(FChart) and (FValueMin<FValueMax)) then

 begin

   draw_f;

   case FCalcMethod of

   0: draw_trapezium();

   1: draw_rectangle_left();

   2: draw_rectangle_right();

   3: draw_rectangle_media();

   end;

 end

 else if Assigned(FChart) then

 begin

   Chart.Series[0].Clear;

   Chart.Series[1].Clear;

   Chart.LeftAxis.Maximum:=0;

 end;

end;

procedure TIntegral.draw_f;

var rightRange, x, h1: extended;

begin

 if Assigned(FChart) then

 begin

   FChart.Series[1].Clear;

   rightRange:=FValueMax+(FValueMax-FValueMin)*0.1;

   x:=FValueMin-(FValueMax-FValueMin)*0.1;

   h1:=(rightRange-x)/50;

   rightRange:=rightRange+h1;

   while x<=rightRange do

   begin

     FChart.Series[1].AddXY(x, f(x));

     x:=x+h1;

   end;

   Chart.LeftAxis.Maximum:=f(x)*1.05;

 end;

end;

procedure TIntegral.draw_trapezium;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=0 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_left;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     FChart.Series[0].AddXY(x+FValueH, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_right;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x+FValueH));

     FChart.Series[0].AddXY(x+FValueH, f(x+FValueH));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_media;

var x: extended;

   i: integer;

begin

 if Assigned(Chart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     Chart.Series[0].AddXY(x, f(x+FValueH/2));

     Chart.Series[0].AddXY(x+FValueH, f(x+FValueH/2));

     x:=x+FValueH;

   end;

 end;

end;

function TIntegral.fDefault(x: extended): extended;

begin

 Result:=Exp(sqr(x));

end;

end.

Результаты работы программы:

Выводы: таким образом, мы изучили способы создания справочной системы к программе с помощью WinHelp. Мы познакомились с правилами написания файла заготовки справочной системы (*.rtf) , с правилами подготовки файлов проекта.

Итак, мы написали программу, которая предоставляет пользователю справку по своим функциям, а также контекстно-зависимую помощь.


 

А также другие работы, которые могут Вас заинтересовать

39872. Разработка эффективной технологии сушки рециклового винилхлорида 1.66 MB
  Наибольший интерес к винилхлориду проявили позднее когда И. Первое промышленное производство винилхлорида основанное на щелочной обработке дихлорэтана изза недостатков не позволили полностью удовлетворить растущие потребности в винилхлориде. Простота и удобство этой реакции позволили за очень короткое время построить первые заводы сначала в Германии а затем в Англии. В настоящее время основным видом сырья для производства винилхлорида традиционно используют этилен ацетилен смеси этилена с ацетиленом получаемые крекингом нафты или...
39873. Производство глицерина производительностью 40000 т/год 331.5 KB
  Это позволило ориентировать нефтигазопереработку на обеспечение народного хозяйства не только топливом маслами и другими товарными продуктами но и дешёвым сырьём для химической и нефтехимической отраслей промышленности производящих различные синтетические продукты: пластические массы синтетические каучуки химические волокна спирты синтетические масла и др. Позже в 1913 году немецким ученым Гейнеманом предпринимались попытки синтезировать глицерин путем омыления 123трихлорпропана получаемого прямым хлорированием пропилена: C12...
39874. Усовершенствование технологии получения глицерина производительностью 40000 т/год 647 KB
  В разделе Автоматизация для контроля выбраны параметры которые позволяют наиболее полно и своевременно контролировать и регулировать ход процесса. Это позволило ориентировать нефтигазопереработку на обеспечение народного хозяйства не только топливом маслами и другими товарными продуктами но и дешёвым сырьём для химической и нефтехимической отраслей промышленности производящих различные синтетические продукты: пластические массы синтетические каучуки химические волокна спирты синтетические масла и др. Позже в 1913 году немецким ученым...
39875. Разработка технологии очистки отходящих газов содовых производств от токсичных компонентов 392 KB
  Одним из перспективных направлений природоохранной деятельности по защите воздушного бассейна от губительного воздействия вредных токсичных веществ содержащихся в отходящих промышленных газах является метод каталитического окисления. Получение кальцинированной соды включает следующие основные стадии: приготовление аммонизированного рассола станция абсорбции; карбонизация аммонизированного рассола с образованием бикарбоната натрия станция карбонизации; отделение бикарбоната натрия от маточника станция фильтрации; очистка и...
39876. Разработка термокаталитического метода обезвреживания отходящих газов цеха абсорбции-дистилляции-карбонизации №3 от токсичных компонентов 1.49 MB
  Одним из перспективных направлений природоохранной деятельности по защите воздушного бассейна от губительного воздействия вредных токсичных веществ содержащихся в отходящих промышленных газах является метод каталитического окисления.3 Источники образования газообразных выбросов производства цеха абсорбциидистилляциикарбонизации №3 На производстве кальцинированной соды к газообразным выбросам относятся: газовые выбросы после промывателя газа колоннII воздух после промывателя воздуха фильтров организованные выбросы после сборника...
39878. ОТЧЕТ по преддипломной производственной практике на ЗАО “Каустик” ЦЕХ № 21 ПРОИЗВОДСТВО ПЕРХЛОРВИНИЛОВОЙ СМОЛЫ 471.5 KB
  Добавление к ЧХУ 3 дихлорбензола позволяет значительно сократить время хлорирования. Из цистерны поливинилхлорид транспортируется по трубопроводу сжатым воздухом давлением 0305 МПа в расходные бункеры поз. 2814 и в силосы поз. Из силосов поливинилхлорид транспортируется по трубопроводу сжатым воздухом давлением 0305 МПа в расходные бункеры поз.
39879. Проверка двигателя на перегрузочную способность и нагрев 483.5 KB
  В задании предполагается, что после отключения двигатель охлаждается до температуры окружающей среды. Время работы не превышает 90 мин, за которое двигатель не достигнет установившейся температуры. Следовательно, в задании имеет место кратковременный режим работы электродвигателя S2.
39880. Разработка технологии, позволяющей сократить выброс дихлорэтана в атмосферный воздух 299 KB
  Целью данного курсового проекта является разработка технологии позволяющей сократить выброс дихлорэтана в атмосферный воздух а уловленный дихлорэтан вернуть в процесс с дальнейшим снижением себестоимости товарного продукта. Сравнительно низкая температура кипения и высокая летучесть дихлорэтана позволяют легко и полностью удалять его как из экстрагированного продукта так и из остаточного материала. Газообразный этилен по трубопроводу из Стерлитамакского цеха N2204 АО Нижнекамскнефтехим поступает с давлением 0812 МПа которое...