Thema: Delphi Form nichtmodal anzeigen

Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: Form nichtmodal anzeigen

  Alt 12. Nov 2003, 03:57
Ok. Du hast meine leicht spitze Bemerkung mit dem Buch nicht krummgenommen - gut. So langsam ahne ich, wo Deine Reise hingehen soll. Wenn ich richtig vermute, dann solltest Du so eine Art CallBack-Funktion in Betracht ziehen. Damit überläßt Du dem MainForm die Kontrolle über die Art und Weise der Abspeicherung der Hilfetexte. Dann also so:
Delphi-Quellcode:
Type
  TMeinCallBack =procedure (Text : TStrings) of object;

  TMeinHilfsForm = class(TForm)
  private
    FmemHelpText : TMemo;
    FbtnClose : TButton;
    FCallBack : TMeinCallBack;
    FMeinCallBack: TMeinCallBack;
  protected
    procedure SetCallBack(Value:TMeinCallBack);
    procedure HideAway(Sender : TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property ReturnProc : TMeinCallBack read FMeinCallBack write SetCallBack;
    procedure ShowWithText(Text:TStrings);
  published
  end;

  TMeinMainForm = class(TForm)
  private
    FbtnShowHelp : TButton;
    FMeinHilfsForm: TMeinHilfsForm;
    FMeinHilfstext : TStringList;
  protected
    procedure SaveHelpText(Text:TStrings); virtual; // kann in Nachfahren
                                                    // überschrieben werden
    procedure ShowHelp(Sender:TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property HelpWindow : TMeinHilfsForm read FMeinHilfsForm write FMeinHilfsForm;
  published
  end;

implementation

{ TMeinHilfsForm }
constructor TMeinHilfsForm.Create(AOwner: TComponent);
begin
  inherited;
  FmemHelpText := TMemo.Create(self);
    // Werte setzen (Größe usw.)
  FbtnClose := TButton.Create(self);
    // Werte setzen (Größe usw.)
  FbtnClose.OnClick := HideAway;

end;

procedure TMeinHilfsForm.HideAway(Sender : TObject);
begin
  if Assigned(FCallBack) then FCallBack(FmemHelpText.Lines);
  FCallBack := nil;
  self.Hide;
end;

procedure TMeinHilfsForm.SetCallBack(Value:TMeinCallBack);
begin
  if Assigned(FCallBack) then FCallBack(FmemHelpText.Lines);
  FCallBack := Value;
end;

procedure TMeinHilfsForm.ShowWithText(Text: TStrings);
begin
  if Assigned(FCallBack) then begin
  FmemHelpText.Lines.Assign(Text);
  self.Show;
  end else raise Exception.Create('Keine CallBack-Prozedur angegeben!'#13#10+
                                  'Bitte vor Aufruf von ShowWithText '+
                                  'das Property ReturnProc setzen!');
end;

destructor TMeinHilfsForm.Destroy;
begin
  FreeAndNil(FmemHelpText);
  FreeAndNil(FbtnClose);
  inherited;
end;

{ TMeinMainForm }
constructor TMeinMainForm.Create(AOwner: TComponent);
begin
  inherited;
  FbtnShowHelp := TButton.Create(self);
  FbtnShowHelp.OnClick := ShowHelp;
  FMeinHilfstext := TStringList.Create;
  FMeinHilfstext.Text := 'Das ist mein Hilfetext!';
end;

procedure TMeinMainForm.SaveHelpText(Text: TStrings);
begin
  FMeinHilfstext.Assign(Text);
end;

procedure TMeinMainForm.ShowHelp(Sender: TObject);
begin
  if Assigned(FMeinHilfsForm) then begin
    FMeinHilfsForm.ReturnProc := SaveHelpText;
    FMeinHilfsForm.ShowWithText(FMeinHilfstext);
  end;
end;

destructor TMeinMainForm.Destroy;
begin
  FreeAndNil(FbtnShowHelp);
  FreeAndNil(FMeinHilfstext);
  inherited;
end;
Wenn Du nun Deine MainForms nicht von TForm sondern von TMeinMainForm ableitest, hast Du die Funktionalität, die Du haben möchtest in allen Erben von TMeinMainForm.

Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat