![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
|
Buenas gente,
a ver si me podeis echar una manita con el rediseño de un programa. Tengo un form principal, una serie de frames y una máquina de estados para controlar la visualización de los frames, entre otras cosas. Hasta ahora el diseño era un poco chapuza, el form principal contiene las referencias a todos los frames y la creación de los estados de la máquina. A parte, cada frame contiene referencias a otros frames "hermanos" que necesita y referencias al frame principal, con lo cual tengo un lío tremendo de referencias circulares. Algunas partes del código Form principal Código:
TfrMain = class(TForm)
frToolbar: TfrToolbar;
procedure mmExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
frNavBarLeft :TfrNavBarLeft;
frNavBarRight :TfrNavBarRight;
frEditPatient :TfrEditPatient;
frViewPatient :TfrViewPatient;
frBlank :TfrBlank;
frViewImage :TfrViewImage;
frViewStudy :TfrVIewStudy;
frViewImageTwin :TfrViewImageTwin;
frCamera :TfrCamera;
frEditStudy :TfrEditStudy;
frPrint :TfrPrint;
frProcesses :TfrProcesses;
end;
var
frMain: TfrMain;
implementation
{$R *.dfm}
procedure TfrMain.mmExitClick(Sender: TObject);
begin
frMain.Close;
end;
procedure TfrMain.FormCreate(Sender: TObject);
begin
frBlank :=TfrBlank.Create(Self);
frNavBarLeft :=TfrNavBarLeft.Create(Self);
frViewPatient :=TfrViewPatient.Create(self);
frEditPatient :=TfrEditPatient.Create(Self);
frViewImage :=TfrViewImage.Create(Self);
frViewStudy :=TfrViewStudy.Create(Self);
frViewImageTwin :=TfrViewImageTwin.Create(Self);
frCamera :=TfrCamera.Create(Self);
frEditStudy :=TfrEditStudy.Create(Self);
frPrint :=TfrPrint.Create(Self);
frProcesses :=TfrProcesses.Create(Self);
frBlank.Parent :=Self;
frNavBarLeft.Parent :=Self;
frViewPatient.Parent :=Self;
frEditPatient.Parent :=Self;
frViewImage.Parent :=Self;
frViewStudy.Parent :=Self;
frViewImageTwin.Parent :=Self;
frCamera.Parent :=Self;
frEditStudy.Parent :=Self;
frPrint.Parent :=Self;
frProcesses.Parent :=Self;
sessiondate:=now;
states:=TStateMachine.Create;
frNavBarLeft.ReLoadTreeView;
frMain.TabStop:=false;
states.Add (
stBlank,
frBlank.frEnter,
frBlank.frExit,
frBlank,
true,
frToolBar.menu
);
states.Add (
stViewPatient,
frViewPatient.frEnter,
frViewPatient.frExit,
frViewPatient,
true,
frToolBar.menu
);
// y bla bla bla... demás estados ....
states.Enter(stBlank);
end;
Código:
TProc = procedure of object;
{
TState:
state type for the State Machine
}
TState = record
id:integer; //id state (for ex. stBlank, stViewPatient)
inProc:TProc; //initial process
outProc:TProc; //fianl process
frame:TFrame; //frame corresponding for this state
navBarL:Boolean; //bars must be shown
menu:TMainMenu; //main menu for this frame (use to be main menu of the
//toolbar frame
end;
{
TStateMachine:
Controls the state of the program and manage the interface active frame
}
TStateMachine = class
private
states:array of TState; //posible states
procedure stExit(id:integer);
public
current:integer; // current state
last:integer; //last state (for goback function)
OnRecordChange:TNotifyEvent;
stack:TStack;
procedure Add(id:integer;ip,op:TProc;frame:TFrame;nbl:boolean;menu:TMainMenu); procedure SetInProc(proc:TProc;state:integer);
procedure Enter(id:integer);
constructor Create;
destructor Destroy; override;
var
states :TStateMachine;
sessionDate :TDateTime;
implementation
procedure TStateMachine.Add(id:integer;ip,op:TProc;frame:TFrame;
nbl:boolean;menu:TMainMenu);
var
l :integer;
begin
l := Length(states);
SetLength(states,l+1);
states[l].id := id;
states[l].inProc := ip;
states[l].outProc := op;
states[l].frame := frame;
states[l].menu := menu;
states[l].navBarL := nbl;
end;
procedure TStateMachine.Enter(id: integer);
var
i,j:integer;
begin
for i := 0 to length(states)-1 do
if id = states[i].id then
begin
stExit(current);
current := id;
frMain.frNavBarLeft.Visible := states[i].navBarL;
frMain.Menu := states[i].menu;
with states[i].frame do
begin
Align := alClient;
Visible := True;
end;
states[i].inProc;
end;
end;
procedure TStateMachine.stExit(id:integer);
var
i :integer;
begin
for i := 0 to length(states)-1 do
if id=states[i].id then
begin
last := current;
current := -1;
states[i].outProc;
states[i].frame.Align := alNone;
states[i].frame.Visible := False;
end;
end;
![]() Y un pequeño resumen, de cómo considero que son/deberían ser las cosas, pero que no consigo ver claro cómo hacer:
¿Qué patrones de diseño veis aquí? ¿Singleton para la máquina de estados? ¿Alguna manera de evitar el rollo de las referencias circulares... sin hacer el chapuceo de los uses en la implementación? (Perdón por el rollo :P ) |
|
#2
|
||||
|
||||
|
Cita:
1. Existe una única manquina de estados, por lo que estamos hablando de un singleton. 2. Cada estado es en cierta medida independiente pero las acciones del usuario conducen a que se provoquen ciertos cambios y en la elección de los estados. Eso es lo que entiendo . A simple vista pareciera que estamos en una combinación de estrategia (Strategy) y Composite.3. Los frames son indenpendientes pero son el reflejo de los estados. Um.... pareciera ser algo como el Patrón Observador/Observado pues, si los frames representan "visualmente" a los estados y estos dependerán de un curso de acción... y si se desea una cierta independencia entre la lógica de estados y los frames lo más "simple" es tener un modelo de Observador (Observer).Bueno... eso fue un primer análisis de lo que voy entiendo acerca de lo que deseas hacer. Muy posiblemente esté equivocado pero al menos ya tienes un punto de vista. Por otro lado recuerda que no existe una única alternativa, esto de los patrones, UML y POO es bastante subjetivo y pueden existir tantos diseños como personas en el mundo. Saludos, |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Patron GoF: Factoría ¿Como y cuando se usa? | Delphius | OOP | 2 | 26-12-2007 06:37:32 |
| En access hay botón buscador-en form permite buscar patron-existe uno en Delphi igual | Ale Alvarez | OOP | 9 | 26-09-2007 07:13:44 |
| Patrón observador, attach, notify,update ... | adpa | OOP | 5 | 22-01-2006 01:07:40 |
| Patrón de los Informáticos. | obiwuan | Varios | 20 | 10-09-2003 14:44:54 |
|