ImagerUnit: Difference between revisions
From VistApedia
Jump to navigationJump to search
No edit summary |
(No difference)
|
Revision as of 21:04, 23 April 2005
ImagerUnit
Here is the code for the main imager unit of the program. Below that is the code for the form itself (in text format)
unit ImagerUnit;
interface
uses\
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\ Dialogs, StdCtrls, StrUtils, BrowserUnit, ExtCtrls, Menus, OleCtrls,\ SHDocVw, ComCtrls, ToolWin;
type
TImagerForm = class(TForm)
PageControl: TPageControl;
LogPage: TTabSheet;
MsgMemo: TMemo;
MainMenu: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
ToolBar1: TToolBar;
View1: TMenuItem;
ShowLog1: TMenuItem;
HideLog1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure HideButtonClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure HideLog1Click(Sender: TObject);
procedure ShowLog1Click(Sender: TObject);
private
{ Private declarations }
FVistaMsg: Word;
BrowserList : TStringList;
Running : boolean;
procedure DefaultHandler(var Message); override;
procedure ShowImage (var Data : string);
function GetBetween (var Text : String; OpenTag,CloseTag : string;
KeepTags : Boolean) : string;
procedure CutStringInThree(var Text : AnsiString; p1, p2 : Integer; var s1,s2,s3 : AnsiString);
procedure AddImage (var URL, Title : string);
procedure ClearAllImages();
public
{ Public declarations }
end;
var
ImagerForm: TImagerForm;
const
cLog : string[5] = 'Log';
implementation {$R *.dfm}
procedure TImagerForm.DefaultHandler(var Message);
{ adds check to the message handling for this form to get a registered message }
var
buf: array[0..255] of Char;
Data : string;
p1 : integer;
const
ImageSignal : string = '^IMAGE^';
NewDocSignal : string = '^TIU';
NewPatientSignal : string = 'XPT^CPRS';
EndCPRSSignal : string = 'END^CPRS^';
begin
// do the default message handling
inherited DefaultHandler(Message);
// if the message is 'VistA Event - Clinical' and not posted from self...
// wParam=Handle of message sender, lParam=entry in global atom table
with TMessage(Message) do if (Msg = FVistaMsg) and (wParam <> Handle) then
begin
// retrieve the text pointed to by lParam into a buffer
GlobalGetAtomName(lParam, buf, 255);
Data := StrPas(buf);
MsgMemo.Lines.Add(Data);
p1 := Pos (ImageSignal,Data);
if p1 > 0 then begin
Data := MidStr(Data, p1 + Length(ImageSignal), Length(Data));
ShowImage (Data);
end else if (Pos (NewDocSignal, Data) > 0)
or (Pos (NewPatientSignal, Data) > 0)then begin
ClearAllImages;
end else if (Pos (ENDCPRSSignal, Data) > 0) then begin
Application.Terminate;
end;
end;
end;
procedure TImagerForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClearAllImages();
end;
procedure TImagerForm.FormCreate(Sender: TObject);
begin
// register the message with windows to get a unique message number
FVistaMsg := RegisterWindowMessage('VistA Event - Clinical');
MsgMemo.Lines.clear;
BrowserList := TStringList.Create;
BrowserList.AddObject(cLog,nil);
Running := true;
end;
procedure TImagerForm.FormDestroy(Sender: TObject);
begin
ClearAllImages();
If BrowserList <> nil then BrowserList.Free;
Running := false;
end;
procedure TImagerForm.HideButtonClick(Sender: TObject);
begin
Visible := false;
end;
procedure TImagerForm.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TImagerForm.Exit1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TImagerForm.FormResize(Sender: TObject);
var
i : integer;
Page : TTabSheet;
begin
//Note: I was getting a FormResize event after form destroyed->error. Avoid via Running...
if (PageControl <> nil) and (BrowserList <> nil) and (Running = true) then begin
Page := PageControl.ActivePage;
for i := 0 to BrowserList.Count-1 do begin
if BrowserList.Objects[i] <> nil then begin
(BrowserList.Objects[i] as TWebBrowser).Height := Page.Height;
(BrowserList.Objects[i] as TWebBrowser).Width := Page.Width;
end;
end;
end;
end;
procedure TImagerForm.HideLog1Click(Sender: TObject);
begin
LogPage.Visible := false;
end;
procedure TImagerForm.ShowLog1Click(Sender: TObject);
begin
LogPage.Visible := true;
end;
procedure TImagerForm.CutStringInThree(var Text : AnsiString; p1, p2 : Integer;
var s1,s2,s3 : AnsiString);
{Purpose: Cut input string Text into 3 parts, with cut points given by p1 & p2.
p1 points to first character to be in s2
p2 points to last character to be in s2 }
begin
s1 := ; s2 := ; s3 := ;
if p1 > 1 then s1 := MidStr(Text, 1, p1-1);
s2 := MidStr(Text, p1, p2-p1+1);
s3 := MidStr(Text, p2+1, Length(Text)-p2);
end;
function TImagerForm.GetBetween (var Text : String; OpenTag,CloseTag : string;
KeepTags : Boolean) : string;
{Purpose: Gets text between Open and Close tags. Removes any CR's or LF's
Input: Text - the text to work on. It IS changed as code is removed
KeepTags - true if want tag return in result
false if tag not in result (still is removed from Text)
Output: Text IS changed.
Result=the code between the opening and closing tags
Note: Both OpenTag and CloseTag MUST be present for anything to happen.
}
var
p1,p2 : integer;
s1,s2,s3 : AnsiString;
begin
Result := ; //default of no result.
p1 := Pos(UpperCase(OpenTag), UpperCase(Text));
if (p1 > 0) then begin
p2 := PosEx(UpperCase(CloseTag),UpperCase(Text),p1+Length(OpenTag)) + Length(CloseTag) -1;
if ((p2 > 0) and (p2 > p1)) then begin
CutStringInThree (Text, p1,p2, s1,Result,s3);
Text := s1+s3;
//Now, remove any CR's or LF's
repeat
p1 := Pos (Chr(13),Result);
if p1= 0 then p1 := Pos (Chr(10),Result);
if (p1 > 0) then begin
CutStringInThree (Result, p1,p1, s1,s2,s3);
Result := s1+s3;
end;
until (p1=0);
//Now cut off boundry tags if requested.
if not KeepTags then begin
p1 := Length(OpenTag) + 1;
p2 := Length (Result) - Length (CloseTag);
CutStringInThree (Result, p1,p2, s1,s2,s3);
Result := s2;
end;
end;
end;
end;
procedure TImagerForm.ShowImage (var Data : string);
{expected input: data is expected in the following format:
<img src="http://www.geocities.com/kdtop3/pic1.jpg" alt="Title 1">
}
var
URL, Title : string;
begin
Data := GetBetween(Data,'<img ', '>', false);
URL := GetBetween (Data, 'src="', '"', false);
Title := GetBetween (Data, 'alt="', '"', false);
if URL <> then begin
AddImage(URL, Title);
end;
end;
procedure TImagerForm.AddImage (var URL, Title : string);
var
NewTabSheet : TTabSheet;
Browser : TWebBrowser;
CaptionName : string;
begin
NewTabSheet := TTabSheet.Create(PageControl);
NewTabSheet.PageControl := PageControl;
if Title = then Title := 'Image';
CaptionName := IntToStr(PageControl.PageCount-1) + '. ' + Title;
NewTabSheet.Caption := CaptionName;
NewTabSheet.Align := alClient;
PageControl.ActivePage := NewTabSheet;
Browser := TWebBrowser.Create(self);
Browser.ParentWindow := NewTabSheet.Handle;
Browser.Align := alClient;
Browser.Width := NewTabSheet.Width;
Browser.Height := NewTabSheet.Height;
BrowserList.AddObject(CaptionName,Browser);
Browser.Navigate(URL);
BringWindowToTop(ImagerForm.Handle);
end;
procedure TImagerForm.ClearAllImages();
var
i,j : integer;
PageName : string;
p : ^TObject;
Browser : ^TWebBrowser; //a pointer
begin
if (PageControl <> nil) and (BrowserList <> nil) then begin
for i := 0 to PageControl.PageCount-1 do begin
PageName := PageControl.Pages[i].Caption;
if PageName <> cLog then begin
for j := 0 to BrowserList.Count-1 do begin
if BrowserList.Strings[j]=PageName then begin
if BrowserList.Objects[i] <> nil then begin
(BrowserList.Objects[i] as TWebBrowser).Free;
break;
end;
end;
end;
end;
end;
i := BrowserList.Count-1;
while i >= 0 do begin
if PageControl.Pages[i].Caption <> cLog then begin
If PageControl.Pages[i] <> nil then PageControl.Pages[i].Free;
BrowserList.Delete(i);
end;
i := i - 1;
end;
end;
end;
end.
This is the form associated with ImagerUnit (viewed as text)
object ImagerForm: TImagerForm
Left = 223
Top = 116
Width = 701
Height = 567
Caption = 'OpenVistA CPRS Imager'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu
OldCreateOrder = False
Visible = True
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
PixelsPerInch = 96
TextHeight = 13
object PageControl: TPageControl
Left = 0
Top = 29
Width = 693
Height = 484
ActivePage = LogPage
Align = alClient
TabOrder = 0
TabPosition = tpBottom
object LogPage: TTabSheet
Caption = 'Log'
ImageIndex = 1
object MsgMemo: TMemo
Left = 0
Top = 0
Width = 685
Height = 458
Align = alClient
ScrollBars = ssBoth
TabOrder = 0
end
end
end
object ToolBar1: TToolBar
Left = 0
Top = 0
Width = 693
Height = 29
Caption = 'ToolBar1'
TabOrder = 1
end
object MainMenu: TMainMenu
Left = 256
Top = 192
object File1: TMenuItem
Caption = '&File'
object Exit1: TMenuItem
Caption = 'E&xit'
OnClick = Exit1Click
end
end
object View1: TMenuItem
Caption = '&View'
object ShowLog1: TMenuItem
Caption = '&Show Log'
OnClick = ShowLog1Click
end
object HideLog1: TMenuItem
Caption = '&Hide Log'
OnClick = HideLog1Click
end
end
end
end
Edit Page - Page History - Printable View - Recent Changes - WikiHelp - SearchWiki
Page last modified on June 11, 2004, at 05:05 PM