Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi dynamisch erzeugte Forms richtig freigeben (https://www.delphipraxis.net/185719-dynamisch-erzeugte-forms-richtig-freigeben.html)

Dalai 2. Jul 2015 15:13

AW: dynamisch erzeugte Forms richtig freigeben
 
Außerdem kann man das Schließen eines Forms via [X] im OnCloseQuery "abfangen" oder besser gesagt be-/verarbeiten.

MfG Dalai

DeddyH 2. Jul 2015 15:15

AW: dynamisch erzeugte Forms richtig freigeben
 
Dann eben so, aber nicht mrOK. Und nur das sollte man im Normalfall prüfen.

BadenPower 2. Jul 2015 15:21

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von DeddyH (Beitrag 1307487)
Wozu das "X" deaktivieren? Wird das Fenster einfach geschlossen, ist ModalResult mrNone, bei Abbrechen mrCancel und nur bei Bestätigung mrOK. Wo ist das Problem?

Die Antwort bezog sich jetzt nicht auf dieses Fenster/Problem, sondern rein auf den Beitrag von mm1256.

Er wollte doch alle BorderIcons und das Systemmenu verbannen und noch ALT+F4 abfangen.

In diesem Falle, wenn er verhindern wollte, dass das [X] angeklickt werden kann, finde ich es praktischer nur das [X] zu deaktivieren, damit alles andere rund um die Titelleiste aktiv bleibt.

baumina 2. Jul 2015 15:21

AW: dynamisch erzeugte Forms richtig freigeben
 
Ich ärger mich aber auch immer, dass man anhand des ModalResults keinen Unterschied erkennen kann, ob der Button "Abbrechen" geklickt wurde, oder nur das Formular geschlossen wurde.

baumina 2. Jul 2015 15:24

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von BadenPower (Beitrag 1307496)
... finde ich es praktischer nur das [X] zu deaktivieren, damit alles andere rund um die Titelleiste aktiv bleibt.

Wie macht man das?

Sir Rufo 2. Jul 2015 15:26

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von baumina (Beitrag 1307497)
Ich ärger mich aber auch immer, dass man anhand des ModalResults keinen Unterschied erkennen kann, ob der Button "Abbrechen" geklickt wurde, oder nur das Formular geschlossen wurde.

Ja, wenn es mal so etwas wie Delphi-Referenz durchsuchenmrAbort geben würde, dann könnte man ja das an den Button klatschen :stupid:

Hier die Liste aller ModalResult Werte http://docwiki.embarcadero.com/Libra...ogs.MessageDlg

baumina 2. Jul 2015 15:35

AW: dynamisch erzeugte Forms richtig freigeben
 
Das ist mir sowieso schon immer schleierhaft, warum der eine Knopf "Abbruch" und der andere "Abbrechen" heißt, ist das denn Windows oder ist das Delphi?

Nachtrag: Ich glaube sogar, dass in den ganz frühen Delphiversionen der Knopf für Kind=bkCancel "Abbruch" und nicht "Abbrechen" hieß, kann mich aber auch irren.

BadenPower 2. Jul 2015 15:39

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von baumina (Beitrag 1307498)
Zitat:

Zitat von BadenPower (Beitrag 1307496)
... finde ich es praktischer nur das [X] zu deaktivieren, damit alles andere rund um die Titelleiste aktiv bleibt.

Wie macht man das?

So wie Du jeden MenuEintrag manipulieren kannst:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure DoFormCloseButtonEnable(AHandle: HWND; AEnable: Boolean);
var
  lMenue: Integer;
begin
  lMenue := Windows.GetSystemMenu(AHandle, LongBool(False));
  if (lMenue <> 0) then
   begin
    if (AEnable) then
     begin
      Windows.EnableMenuItem(lMenue, SC_CLOSE, MF_BYCOMMAND or MF_SYSMENU);
     end
    else
     begin
      Windows.EnableMenuItem(lMenue, SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
     end;
   end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoFormCloseButtonEnable(Handle,false);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DoFormCloseButtonEnable(Handle,true);
end;

end.

Stevie 2. Jul 2015 15:52

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von baumina (Beitrag 1307501)
Das ist mir sowieso schon immer schleierhaft, warum der eine Knopf "Abbruch" und der andere "Abbrechen" heißt

Weil das die Übersetzung von Abort und Cancel ist? :stupid:

Sir Rufo 2. Jul 2015 17:23

AW: dynamisch erzeugte Forms richtig freigeben
 
Eine dynamische Dialog-Form gibt man einfach wieder frei:
Delphi-Quellcode:
procedure Foo;
var
  LForm: TForm;
begin
  LForm := TFooDialo.Create(nil);
  try
    case LForm.ShowModal of
      mrOK :
        begin
          ...
        end;
      mrCancel :
        begin
          ...
        end;
      ...
    end;
  finally
    LForm.Free;
  end;
end;
Wenn in dem Dialog noch weitere Daten erfasst werden sollen, dann übergibt man vor dem Anzeigen diese Daten und holt sich diese im Erfolgsfall wieder ab:
Delphi-Quellcode:
type
  TFooData = class( TPersistent )
  public
    property SomeStr: string;
    property SomeBool: Boolean;
  end;

type
  TFooDialog = class( TForm )
    Edit1: TEdit;
    Checkbox1: TCheckBox;
  private
    procedure AssignTo( FooData: TFooData ); overload;
    procedure AssignFrom( FooData: TFooData );
  protected
    procedure AssignTo( Dest: TPersistent ); overload; override;
  public
    procedure Assign( Source: TPersistent ); override;
  end;

procedure TFooDialog.AssignTo( FooData: TFooData );
begin
  FooData.SomeStr := Edit1.Text;
  FooData.SomeBool := CheckBox1.Checked;
end;

procedure TFooDialog.AssignFrom( FooData: TFooData );
begin
  Edit1.Text := FooData.SomeStr;
  CheckBox1.Checked := FooData.SomeBool;
end;

procedure TFooDialog.AssignTo( Dest: TPersistent );
begin
  if Dest is TFooData then
    AssignTo( TFooData( Dest ) )
  else
    inherited;
end;

procedure TFooDialog.Assign( Source: TPersistent );
begin
  if Source is TFooData then
    AssignFrom( TFooData( Source ) )
  else
    inherited;
end;
und dann so
Delphi-Quellcode:
procedure Foo( FooData: TFooData );
var
  LDialog: TForm;
begin
  LDialog := TFooDialog.Create( nil );
  try
    LDialog.Assign( FooData ); // Daten an die Form schreiben
    if LDialog.ShowModal = mrOK then
      FooData.Assign( LDialog ); // Daten von der Form lesen
  finally
    LDialog.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz