Avatar billede coladrenge Nybegynder
07. februar 2006 - 16:06 Der er 6 kommentarer og
1 løsning

Sende class defination som parameter

hej

Jeg er ved at lave et standard skærmbillede som skal bruges vi skal bruge i en ny application.

det som jeg gerne vil er at kunne sende et navn med på en provider som skal bruges i skærmbilledet

så man eventuelt kunne skrive følgende i et skærmbillede som arver fra stdform.

inherited Create(Aowner, TUserData)


unit uStdForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,      Controls, Forms, Dialogs, dxBar, ActnList, uAspSystemData, uAspRecords, AscSysUtils,
  ExMessageBox, StdCtrls, Buttons, uAspProvider;

type
  TSaveAndCloseProcedure = procedure (var SaveData : Boolean; DataSet : TAspQuery) of object;


  TAspSTDForm = class(TForm)
    ActionList1: TActionList;
    dxBarManager1: TdxBarManager;
    bGem: TBitBtn;
    bClose: TBitBtn;
  private
    FEnterAsTab : Boolean;
    oProvider : TAspProvider;
    { Private declarations }
  protected
    function MessageDlgEx(Text, Titel: string;msgType: integer): integer;
    function ShowQuestion(Text, Titel: string): integer;
    function ShowWarning(Text, Titel: string): integer;
    procedure CMDialogKey(var Msg: TCMDialogKey); message CM_DIALOGKEY;
    procedure SaveAndClose;
    Procedure Close;
  public
    Constructor Create(Aowner : TComponent; ProviderClass : TClass; bEnterAsTab : boolean = true);

    { Public declarations }
  end;

var
  AspSTDForm: TAspSTDForm;

implementation

{$R *.dfm}

{ TAspSTDForm }

constructor TAspSTDForm.Create(Aowner : TComponent; ProviderClass : TClass; bEnterAsTab : boolean = true);
begin
  inherited Create(Aowner);
  self.FEnterAsTab := bEnterAsTab;
  self.dxBarManager1.Bars[0].Caption := self.Caption;
  self.oProvider := TAspProvider(ProviderClass).Create(Application.MainForm);
end;

function TAspSTDForm.MessageDlgEx(Text, Titel: string;
  msgType: integer): integer;
begin
  Result := ExMessageBox.MessageDlgEx(Text, Titel,msgType);
end;

function TAspSTDForm.ShowQuestion(Text, Titel: string): integer;
begin
  Result := ExMessageBox.ShowQuestion(Text, Titel);
end;

function TAspSTDForm.ShowWarning(Text, Titel: string): integer;
begin
  Result := ExMessageBox.ShowWarning(Text, Titel);
end;

procedure TAspSTDForm.CMDialogKey(var Msg: TCMDialogKey);
begin
  if (GetParentForm(Self).ActiveControl is TButtonControl) then
    inherited
  else
    if (Msg.CharCode = VK_RETURN) and self.FEnterAsTab then
    begin
      GetParentForm(Self).Perform(CM_DIALOGKEY, VK_TAB, 0);
      Msg.Result := 1;
    end
  else
    inherited;
end;

procedure TAspSTDForm.Close;
begin

end;

procedure TAspSTDForm.SaveAndClose;
begin

end;
Avatar billede kroning Nybegynder
07. februar 2006 - 21:46 #1
Jeg er ikke lige helt klar over hvad du mener, men hvis i vil have en standard grund form er det så ikke bare et spørgsmål om at lade alle jeres forme arve fra TAspSTDForm formen?
Avatar billede hrc Mester
10. februar 2006 - 10:34 #2
Du kan lave en parameter af typen TClass:

procedure OpretForm(aForm : TClass)
var
  UndeterminedForm : TForm;
begin
  UndeterminedForm := aForm.Create(self); // Måske MakeInstance eller sådan noget

Kan ikke lige huske om jeg rent faktisk skriver aForm.Create eller om der er en anden metode til at instantiere via en TClass. Har noget kode derhjemme.
Avatar billede coladrenge Nybegynder
17. februar 2006 - 09:51 #3
hej HRC

Tak for dit indslag.

ved du hvordan man så eventuelt gør det hvis constructoren eksempelvis er forskellig på de enkelte forme - dvs. forskellig parametre.
Avatar billede hrc Mester
17. februar 2006 - 10:23 #4
Ikke på en pæn måde. Det må være noget med at gøre følgende der hvor du opretter objekterne:

  if aClass is TMyClass1 then
    MyObj := aClass.Create(nn,22,33,..)
  else aClass is TMyClass2 then
    MyObj := aClass.Create(xx,yy,aa)

  osv.

Mener ikke at syntaksen er helt korrekt, men vil prøve at kigge i noget af det gamle kode derhjemme - hvis jeg får tid. Der er ferie i luften og det betyder som regel alt andet end afslapning hos os.
Avatar billede coladrenge Nybegynder
17. februar 2006 - 14:04 #5
hej

det vil fungere - men jeg faktisk gerne have det således at det er mere dynamisk - her er point til dig. vil være glad og rundhåndet med point hvis du vil bruge lidt tid på at se din gamle kode igennem.
Avatar billede hrc Mester
26. februar 2006 - 19:54 #6
Jeg ledte lidt rundt, men hold fast hvor der hober sig kode op. Fandt noget kode som blev brugt i en forrige ansættelse. Det virker, men det eksempel jeg ledte var altså mere i Borlands ånd.

type
  TFormType = class of TForm;

// ----- Selve koden ----------------------------------------------------------

// Kunne ligeså godt bare bruge TForm
function CreateAndShowFormModal(aFormType: TFormType): integer;
type
  TBaseFormType = class of TBaseForm1;
  TBmpFormType = class of TBmpForm;
var
  AForm: TForm;
begin
  // Create form - finder ud af om der er en speciel constructor
  if AFormType.InheritsFrom(TBaseForm1) then
    AForm := TBaseFormType(AFormType).Create(Application, 'Karla er med')
  else if AFormType.InheritsFrom(TBmpForm) then
    AForm := TBmpFormType(AFormType).Create(Application, 'Hanneglad Mandeglad')
  else // Eller bare en almindelig form
    AForm := AFormType.Create(Self);

  result := ShowFormModal(AForm);
end;

function ShowFormModal(aForm: TForm; const aFreeForm : boolean = true) : integer;
begin
  // Opdater form med theme
  if ThemeServices.ThemesEnabled then
    LastGridHeaderColor := UpdateFormTheme(AForm, DefaultGridHeaderColor);

  try
    Result := AForm.ShowModal;
  finally
    if AFreeForm then
      AForm.Free; // Eller Release om du synes
  end;
end;
Avatar billede hrc Mester
26. februar 2006 - 19:59 #7
Jeg fandt desværre ikke det jeg selv havde skruet sammen - desværre forsvundet da jeg ikke kan komme på hvad jeg skal søge efter.

I ShowFormModal bliver der opdateret nogle farver efter det valgte windows-tema. De tre linier skulle egentlig ikke (Ellers en ret avanceret funktion der blev kaldt).

function ShowFormModal(aForm: TForm; const aFreeForm : boolean = true) : integer;
begin
  try
    Result := AForm.ShowModal;
  finally
    if AFreeForm then
      AForm.Free; // Eller Release om du synes
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester