Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   UnterForm mit Daten aus Hauptform versorgen (https://www.delphipraxis.net/185021-unterform-mit-daten-aus-hauptform-versorgen.html)

Hannes Kuhn 8. Mai 2015 12:38

UnterForm mit Daten aus Hauptform versorgen
 
Hallo,

ich habe eine HauptForm und eine UnterForm. Die HauptForm kennt die UnterForm (unter Uses aufgeführt). Die UnterForm kennt die HauptForm nicht.

Wenn ich nun in der UnterForm Daten benötige die nur die HauptForm kennt, dann mache ich es so:

In der UnterForm wird ein Event ausgelöst welches in der HauptForm eine Procedure aufruft.
In der Procedure werden die benötigten Daten dann in eine Property der UnterForm geschrieben.

Die UnterForm holt sich dann die Daten dort ab und verarbeitet sie weiter.

Das funktioniert so, ist aber nicht gerade elegant. Gibt es evt. eine „schöne“ Lösung ?

Viele Grüße
Hannes

Luckie 8. Mai 2015 12:52

AW: UnterForm mit Daten aus Hauptform versorgen
 
Meinst du so was: http://michael-puff.de/Programmierun...tauschen.shtml

Kralle 8. Mai 2015 13:05

AW: UnterForm mit Daten aus Hauptform versorgen
 
Moin Hannes,

wie wäre es mit einem Datenmodul auf das Beide Formulare zugreifen?

Gruß HEiko

Perlsau 8. Mai 2015 14:20

AW: UnterForm mit Daten aus Hauptform versorgen
 
Zitat:

Zitat von Hannes Kuhn (Beitrag 1300737)
In der UnterForm wird ein Event ausgelöst welches in der HauptForm eine Procedure aufruft.
In der Procedure werden die benötigten Daten dann in eine Property der UnterForm geschrieben.
Die UnterForm holt sich dann die Daten dort ab und verarbeitet sie weiter.
Das funktioniert so, ist aber nicht gerade elegant. Gibt es evt. eine „schöne“ Lösung ?

Mir fällt auf Anhieb nichts ein, was dagegen sprechen würde, das so zu machen. Mir ist aber auch nicht klar, was genau du unter einer "schönen Lösung" verstehst. "Schön" ist für mich im Zusammenhang mit Anwendungsentwicklung, wenn's erstens funktioniert und zweitens übersichtlich programmiert wurde, so daß ich auch noch nach Jahren nahezu auf Anhieb erkennen kann, was ich da zusammengewurschtelt habe :)

Wenn ich z.B. mit Frames arbeite (statt z.B. mit TPageControl und Tabsheets), werden die Frames alle von der Mainform gesteuert. Das hat den Vorteil, daß ich z.B. Datenbank-Operationen quasi nur einmal programmieren muß und sie auf alle Frames, die Tabellen darstellen und bearbeiten lassen, anwenden kann. Die Frames stellen dabei eigentlich nur die Schnittstelle für den Anwender dar: Bedienung (Editfelder, DBGrids etc.) und Darstellung. Die eigentliche Funktionalität (Append, Delete, Edit, Post, Cancel etc.) erledigt eine eigene Klasse, die je nach dem, welches Frame gerade angezeigt wird, das entsprechende Dataset bzw. Query aus dem Datenmodul verwendet. Aber das würde jetzt zu weit führen.

Benötigen die Frames in seltenen Fällen doch einmal Reaktionen von der MainForm, mache ich das ganz genau so, wie du es oben dargestellt hast: Ich löse ein Ereignis aus. Die allermeisten Ereignisse werden bei mir aber vom Datenmodul ausgelöst und von der MainForm verarbeitet. Also ich finde diesen Aufbau gelungen und in gewisser Weise auch "schön", weil für mich übersichtlich und leicht zu erweitern/ändern.

Zitat:

Zitat von Kralle (Beitrag 1300740)
wie wäre es mit einem Datenmodul auf das Beide Formulare zugreifen?

... oder irgend einer "klassenlosen" Unit, die beide Formulare in ihre Uses-Klausel aufnehmen (Implementation-Abschnitt)? Geht natürlich auch mit dem Datenmodul, das aber mehr Ressourcen benötigt. Ich verwende Datenmodule ausschließlich für Datenbank-Sachen. Eine einfache Unit, wo man die benötigten globalen Variablen und Konstanten einfach im Interface-Abschnitt deklariert, tut's auch. Dort kann man dann auch prima häufig benötigte Hilfs-Funktionen und -Prozeduren unterbringen wie z.B. den Aufruf einer URL via Default-Browser oder das Ausführen einer externen Anwendung oder oder ... Bei mir werden dort z.B. auch Benutzerdaten und -einstellungen zwischengespeichert, die beim Programmstart aus der Datenbank (oder Registry oder Ini-Datei) gelesen und beim Programmende wieder zurückgeschrieben werden. Aus meiner Sicht hat sich diese Vorgehensweise bewährt.

Hannes Kuhn 8. Mai 2015 20:48

AW: UnterForm mit Daten aus Hauptform versorgen
 
Hallo,

elegant wäre in meinen Augen ein "Funktionszeiger" für ein Ereignis.

Das Ereignis in der UnterForm ruft eine Funktion in der HauptForm auf und kriegt die gewünschten
Daten gleich als Rückgabewert der Funktion geliefert.

Gruß
Hannes

Sir Rufo 8. Mai 2015 20:59

AW: UnterForm mit Daten aus Hauptform versorgen
 
Zitat:

Zitat von Hannes Kuhn (Beitrag 1300774)
Hallo,

elegant wäre in meinen Augen ein "Funktionszeiger" für ein Ereignis.

Das Ereignis in der UnterForm ruft eine Funktion in der HauptForm auf und kriegt die gewünschten
Daten gleich als Rückgabewert der Funktion geliefert.

Gruß
Hannes

Dann übergib doch der UnterForm so einen Funktionszeiger

Popov 8. Mai 2015 21:23

AW: UnterForm mit Daten aus Hauptform versorgen
 
Also ich weiß nicht ob du das meinst, aber ich hab verstanden, dass du das Haupt-Formular (z. B. Unit1) hast und ein zweites Formular (z. B. Unit2). Wenn das so ist, kannst du natürlich auch über Kreuz aufeinender zugreifen:
Delphi-Quellcode:
unit Unit1;

interface

...

implementation

uses Unit2; //hier

{$R *.dfm}
und
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, ..., Unit1;

...

implementation

{$R *.dfm}
Das klappt.

Eine andere Möglichkeit wären Messages. Du schickst eine Message an das Hauptform und bekommst etwas zurück:
Delphi-Quellcode:
unit Unit1;

interface

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

const
  MSG_TEST = WM_USER + 1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure MsgTest(var Msg: TMessage); message MSG_TEST;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.MsgTest(var Msg: TMessage);
var
  s: String;
begin
  s := 'Hallö Welt';
  Msg.Result := Integer(PChar(s));
end;
und
Delphi-Quellcode:
unit Unit2;

interface

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

const
  MSG_TEST = WM_USER + 1;

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

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  iResult: Integer;
  s: String;
begin
  iResult := SendMessage(Application.MainForm.Handle, MSG_TEST, 0, 0);
  s := PChar(iResult);
  ShowMessage(s);
end;

DeddyH 9. Mai 2015 10:53

AW: UnterForm mit Daten aus Hauptform versorgen
 
Suchst Du vielleicht so etwas?
Delphi-Quellcode:
type
  (* Methodensignatur für eigenen Eventhandler *)
  TOnSomethingHappenedEvent = procedure(Sender: TObject; var Value: integer) of object;

  TBlubb = class
  private
    (* Feld des oben definierten Eventhandlers *)
    FOnSomethingHappened: TOnSomethingHappenedEvent;
    (* Das Feld, das ggf. von außen geändert werden soll *)
    FValue: integer;
  public
    (* Auslösende Methode *)
    procedure DoSomething;
    property OnSomethingHappened: TOnSomethingHappenedEvent read FOnSomethingHappened write FOnSomethingHappened;
  end;

...

{ TBlubb }

procedure TBlubb.DoSomething;
begin
  (* Falls Handler zugewiesen, ausführen *)
  if Assigned(FOnSomethingHappened) then
    FOnSomethingHappened(self, FValue);
  ShowMessage(IntToStr(FValue));
end;
Das Formular, das diese Klasse benutzt:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    btnGo: TButton;
    procedure btnGoClick(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure DoOnSomethingHappened(Sender: TObject; var Value: integer);
  public
    { Public-Deklarationen }
  end;

...

{ TForm1 }

procedure TForm1.DoOnSomethingHappened(Sender: TObject; var Value: integer);
begin
  Value := 42;
end;

procedure TForm1.btnGoClick(Sender: TObject);
var
  Blubb: TBlubb;
begin
  Blubb := TBlubb.Create;
  try
    (* Eventhandler zuweisen *)
    Blubb.OnSomethingHappened := DoOnSomethingHappened;
    (* Auslösende Methode aufrufen *)
    Blubb.DoSomething;
  finally
    Blubb.Free;
  end;
end;

Hannes Kuhn 9. Mai 2015 11:02

AW: UnterForm mit Daten aus Hauptform versorgen
 
Hallo DeddyH,

das gefällt mir schon mal sehr gut.

Vielen Dank
Hannes

Perlsau 9. Mai 2015 11:54

AW: UnterForm mit Daten aus Hauptform versorgen
 
Das ist aber doch genau das, was du bereits hattest, wie du in deinem Eingangsposting ausgeführt hast:

Zitat:

Zitat von Hannes Kuhn (Beitrag 1300809)
In der UnterForm wird ein Event ausgelöst welches in der HauptForm eine Procedure aufruft.
In der Procedure werden die benötigten Daten dann in eine Property der UnterForm geschrieben.
Die UnterForm holt sich dann die Daten dort ab und verarbeitet sie weiter.
Das funktioniert so, ist aber nicht gerade elegant. Gibt es evt. eine „schöne“ Lösung ?

Oder was hast du mit "wird ein Event ausgelöst" genau gemeint?


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

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