Disculpen que habra este hilo desde hace tiempo... lo que pasa es que yo estaba buscando en los foros algo que me ayude a determinar un error.
Hace un tiempo dejé un
hilo inconcluso. Pues, empecé a retomarlo... y estuve metiendo código.
Veran, estoy declarando un descendiente de TForm ,lo llamé TExpertForm. Pues en dicha forma se encapsulan procedimientos y propiedades que permitan realizar visualizaciones tanto en forma modales como no modales... y que funcionen tanto para aplicaciones MDI como SDI (es asi?
)
Me leí todo y al llegar aqui:
Cita:
Empezado por Lepe
- Solo permitimos una ventana abierta de cada tipo al mismo tiempo. En algunos casos es una desventaja, en otros una ventaja, depende de la filosofía que se quiera seguir.
El método de kesu si tiene un pequeño error, pero al haber sido escrito de memoria, demasiado bien está. Por otra parte, es "la otra filosofía" para trabajar con ventanas MDI, ese método si permite tener varias ventanas FrmClientes abiertas al mismo tiempo, pero tambien tiene sus inconvenientes. Si interesa ese método, pregunten.
Lo que sí es muy importante es no mezclar ambos métodos, porque tendríamos Access Violation, Abstract Error y otras muchas excepciones nada obvias de localizar
|
¡Y eso es lo que me pasa!
Hasta ahora (todavia estoy viendo esto) el código que tengo es como sigue:
Código Delphi
[-]
unit UExpertForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
const
MAX_VARIABLES = 25;
type
TStateModal = (smModal, smNotModal);
TInstancePermits = (ipOnlyOne, ipMultiple);
TVarDomain = (vdPublic, vdPrivate);
TVarInfo = record
Value: Variant;
Domain: TVarDomain;
end;
TArrayVariables = array [0..MAX_VARIABLES - 1] of TvarInfo;
TExpertForm = class(TForm)
private
FVars: TArrayVariables;
FInstancePermits: TInstancePermits;
FState: TStateModal;
protected
FID: integer;
FOptionView: integer;
function GetID: integer; virtual; abstract;
procedure SetID(const Value: integer); virtual; abstract;
function GetOptionView: integer; virtual; abstract;
procedure SetOptionView(const Value: integer); virtual; abstract;
procedure VariableChange(Index: integer; Value, OldValue: Variant); virtual; abstract;
procedure DomainChange(Index: integer; Domain, OldDomain: TVarDomain); virtual; abstract;
public
property ID: integer read GetID;
property OptionView: integer read GetOptionView;
property InstancePermits: TInstancePermits read FInstancePermits write FInstancePermits;
procedure SetVariable(const Index: integer; Value: Variant; Domain: TVarDomain);
function GetVariable(Sender: TObject; Index: integer): Variant;
procedure View(OptionView: integer; NewInstance: boolean);
procedure ViewModal(OptionView: integer);
procedure ViewNotModal(OptionView: integer; NewInstance: boolean);
end;
implementation
{$R *.dfm}
procedure TExpertForm.SetVariable(const Index: integer; Value: Variant; Domain: TVarDomain);
var OldV: Variant;
OldD: TVarDomain;
begin
OldV := FVars[Index].Value;
OldD := FVars[Index].Domain;
if (Value <> OldV)
then begin
FVars[Index].Value := Value;
VariableChange(Index, Value, OldV);
end;
if (Domain <> OldD)
then begin
FVars[Index].Domain := Domain;
DomainChange(Index, Domain, OldD);
end;
end;
function TExpertForm.GetVariable(Sender: TObject; Index: integer): Variant;
begin
if (Sender <> Self) AND (FVars[Index].Domain = vdPrivate)
then raise Exception.Create('Error. Variable is private')
else result := FVars[Index].Value;
end;
procedure TExpertForm.View(OptionView: integer; NewInstance: boolean);
begin
if FState = smModal
then ViewModal(OptionView)
else ViewNotModal(OptionView, NewInstance);
end;
procedure TExpertForm.ViewModal(OptionView: integer);
begin
if (NOT Assigned(Self))
then begin
with Create(Application) do
try
SetOptionView(OptionView);
FState := smModal;
ModalResult := ShowModal;
finally
Free;
end;
end
else begin
SetOptionView(OptionView);
FState := smModal;
ModalResult := ShowModal;
end;
end;
procedure TExpertForm.ViewNotModal(OptionView: integer; NewInstance: boolean);
var Frm: TExpertForm;
begin
LockWindowUpdate(Application.MainForm.Handle);
try
if NOT (Assigned(Self))
then begin
with Create(Application) do
try
FState := smNotModal;
FOptionView := OptionView;
Show;
finally
Free;
end;
end
else begin
FState := smNotModal;
FOptionView := OptionView;
if Self.WindowState = wsMinimized
then Self.WindowState := wsNormal;
Self.BringToFront;
Self.Show;
Exit;
end;
finally
LockWindowUpdate(0);
end;
end;
end.
Me preguntaba si se podrá realizar lo que pretendo... se que tiene errores... y algunos los veo ahorita. Mi pregunta mas que nada pasa por el hecho de como controlar que se pueda operar tanto para una sola instancia como para varias.
Desde ya muchas gracias,
Saludos,