über die Weihnachtstage habe ich ein wenig experimentiert, aber ich finde einfach keine Lösung. Vielleicht denke ich auch etwas zu kompliziert?
Ich habe diverse kleine Hilfsprogramme und möchte die Liste noch erweitern. Da ich aber nicht jedes Programm separat aufrufen möchte, habe ich mir überlegt einen sogenannten Programm-Manager als MDI zu programmieren.
Wenn ich die kleinen Hilfsprogramme direkt einbinde, funktioniert es soweit auch. Jetzt möchte ich aber das Ganze über eine Datenbank machen, damit ich nicht jedes Mal den Programm-Manager anpassen muss.
In der Datenbank habe ich eine Tabelle ‚Formulare‘ mit den Spalten ‚Id‘, ‚FrmKlasse‘, ‚FrmName‘, ‚FrmCaption‘.
Der Zugriff von der Datenbank funktioniert auch soweit, aber wie kann ich mit der Funktion ,ControlNameIsTForm‘ herausfinden ob die Form bereits gestartet wurde und dass diese nicht doppelt geöffnet wird, sondern in den Vordergrund springt?
Zudem wie kann ich die Form mit dem Stringnamen registrieren den ich aus der Datenbank nehme.
Am Ende möchte ich einfach nur noch die Daten von den Programmen in der Tabelle eintragen.
Code: Alles auswählen
Unit FProgManager;
{$mode objfpc}{$H+}
Interface
Uses
Classes,
ComCtrls,
Controls,
Dialogs,
ExtCtrls,
Forms,
Graphics,
StdCtrls,
SysUtils,
UMaske1,
UMaske2,
UMaske3;
Type
{ TFrmProgManager }
TFrmProgManager = Class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
MDIScrollBox: TScrollBox;
Procedure Button1Click(Sender: TObject);
Procedure Button2Click(Sender: TObject);
Procedure Button3Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure FormClose(Sender: TObject; Var CloseAction: TCloseAction);
Private
Procedure ppMenueClick(Sender: TObject);
Procedure MDIFenster(uForm : TForm);
function ControlNameIsTForm(const aControlName: String; out Formname: TForm): Boolean;
Public
function MDIChildCreated(const FormTag: Integer): Boolean;
function MDIChildState(FormTag: Integer; uActivate: Boolean; FormClass: TFormClass; var Form: TForm): Boolean;
End;
Type
TMDIRecord = Record
MDIStatus_bol : Boolean;
End;
grTMDI = Array of TMDIRecord;
Var
FrmProgManager : TFrmProgManager;
grMDI : grTMDI;
Implementation
{$R *.lfm}
Var
pvCaption_str : String;
pvIntName_str : String;
pvFrmID_int : Integer;
pvFrmKlassen_str : String;
pvForm_frm : TForm;
pvFormClass_frc : TFormClass;
{ TFrmKasse }
Procedure TFrmProgManager.FormCreate(Sender: TObject);
Var
lvZaehler_int : Integer;
Begin
SetLength(grMDI, 10);
For lvZaehler_int := 0 to 10 Do
Begin
grMDI[lvZaehler_int].MDIStatus_bol := False;
End;
FrmProgManager.Caption := 'Programm Manager';
FrmProgManager.Left := 10;
FrmProgManager.Top := 10;
RegisterClass(TFrmMaske1);
RegisterClass(TFrmMaske2);
RegisterClass(TFrmMaske3);
End;
Procedure TFrmProgManager.MDIFenster(uForm : TForm);
Begin
{
Constant Value Description
ANSI_CHARSET 0 ANSI characters.
DEFAULT_CHARSET 1 Font is chosen based solely on Name and Size. If the
described font is not available on the system, Windows will substitute
another font.
SYMBOL_CHARSET 2 Standard symbol set.
MAC_CHARSET 77 Macintosh characters. Not available on NT 3.51.
SHIFTJIS_CHARSET 128 Japanese shift-jis characters.
HANGEUL_CHARSET 129 Korean characters (Wansung).
JOHAB_CHARSET 130 Korean characters (Johab). Not available on NT 3.51
GB2312_CHARSET 134 Simplified Chinese characters (mainland china).
CHINESEBIG5_CHARSET 136 Traditional Chinese characters (taiwanese).
GREEK_CHARSET 161 Greek characters. Not available on NT 3.51.
TURKISH_CHARSET 162 Turkish characters. Not available on NT 3.51
VIETNAMESE_CHARSET 163 Vietnamese characters. Not available on NT 3.51.
HEBREW_CHARSET 177 Hebrew characters. Not available on NT 3.51
ARABIC_CHARSET 178 Arabic characters. Not available on NT 3.51
BALTIC_CHARSET 186 Baltic characters. Not available on NT 3.51.
RUSSIAN_CHARSET 204 Cyrillic characters. Not available on NT 3.51.
THAI_CHARSET 222 Thai characters. Not available on NT 3.51
EASTEUROPE_CHARSET 238 Includes diacritical marks for eastern european
countries. Not available on NT 3.51.
OEM_CHARSET 255 Depends on the codepage of the operating system.
}
uForm.Parent := MDIScrollBox;
uForm.Left := 10;
uForm.Top := 10;
uForm.BorderIcons := [biSystemMenu];
uForm.BorderStyle := bsSizeable;
uForm.Color := clBtnFace;
uForm.Font.CharSet := 0; //ANSI_CHARSET;
uForm.Font.Color := clWindowText;
uForm.Font.Height := -12;
uForm.Font.Name := 'Arial';
uForm.FormStyle := fsMDIChild;
uForm.KeyPreview := True;
uForm.ParentFont := True;
uForm.Position := poOwnerFormCenter;
uForm.ShowHint := True;
uForm.Caption := pvCaption_str;
uForm.Show;
End;
function TFrmProgManager.ControlNameIsTForm(const aControlName: String; out Formname: TForm): Boolean;
var
AComponent: TComponent;
begin
AComponent := FindComponent(aControlName);
Result := Assigned(AComponent) and AComponent.InheritsFrom(TForm);
case Result of
True: Formname := TForm(AComponent);
False: Formname := Nil;
end;
end;
Procedure TFrmProgManager.ppMenueClick(Sender: TObject);
Begin
If (pvFrmKlassen_str <> '') Then
Begin
pvFormClass_frc := TFormClass(FindClass(pvFrmKlassen_str));
ControlNameIsTForm(pvFrmKlassen_str, pvForm_frm);
MDIChildState(TComponent(Sender).Tag, True, pvFormClass_frc, pvForm_frm);
If (grMDI[pvFrmID_int].MDIStatus_bol) Then
Begin
// pvForm_frm.BringToFront;
End
Else
Begin
MDIFenster(pvForm_frm);
End;
End
End;
Procedure TFrmProgManager.FormClose(Sender: TObject; Var CloseAction: TCloseAction);
Begin
Free;
End;
Function TFrmProgManager.MDIChildCreated(Const FormTag: Integer): Boolean;
Var
I: Integer;
Begin
Result := False;
If (grMDI[pvFrmID_int].MDIStatus_bol) Then Result := True;
End;
Function TFrmProgManager.MDIChildState(FormTag: Integer; uActivate: Boolean; FormClass: TFormClass; Var Form: TForm): Boolean;
Procedure Init(FormClass: TFormClass; Var Form: TForm);
Begin
If uActivate Then
Begin
If Not MDIChildCreated(FormTag{TForm(Form)}) Then
Begin
Form := FormClass.Create(Application);
MDIFenster(Form);
Form.Tag := FormTag;
grMDI[pvFrmID_int].MDIStatus_bol := True;
End;
If Form.WindowState = wsMinimized Then Form.WindowState := wsNormal;
// Form.BringToFront;
End
Else If MDIChildCreated(FormTag) Then Form.Close;
End;
Begin
Result := True;
Init(FormClass, TForm(Form));
{
case pvFrmID_int of
1 : Init(TFrmMaske1, TForm(FrmMaske1));
2 : Init(TFrmMaske2, TForm(FrmMaske2));
3 : Init(TFrmMaske3, TForm(FrmMaske3));
end; }
End;
Procedure TFrmProgManager.Button1Click(Sender: TObject);
Begin
pvCaption_str := 'Maske1';
pvFrmID_int := 1;
pvFrmKlassen_str := 'TFrmMaske1';
ppMenueClick(Sender);
End;
Procedure TFrmProgManager.Button2Click(Sender: TObject);
Begin
pvCaption_str := 'Maske2';
pvFrmID_int := 2;
pvFrmKlassen_str := 'TFrmMaske2';
ppMenueClick(Sender);
End;
Procedure TFrmProgManager.Button3Click(Sender: TObject);
Begin
pvCaption_str := 'Maske3';
pvFrmID_int := 3;
pvFrmKlassen_str := 'TFrmMaske3';
ppMenueClick(Sender);
End;
End.