AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein UnterForm mit Daten aus Hauptform versorgen
Thema durchsuchen
Ansicht
Themen-Optionen

UnterForm mit Daten aus Hauptform versorgen

Ein Thema von Hannes Kuhn · begonnen am 8. Mai 2015 · letzter Beitrag vom 9. Mai 2015
Antwort Antwort
Seite 1 von 2  1 2      
Hannes Kuhn

Registriert seit: 4. Apr 2006
Ort: Kassel
48 Beiträge
 
Delphi 7 Professional
 
#1

UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 13:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 13:52
Meinst du so was: http://michael-puff.de/Programmierun...tauschen.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#3

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 14:05
Moin Hannes,

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

Gruß HEiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 15:20
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.

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.

Geändert von Perlsau ( 8. Mai 2015 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Hannes Kuhn

Registriert seit: 4. Apr 2006
Ort: Kassel
48 Beiträge
 
Delphi 7 Professional
 
#5

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 21:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 21:59
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 8. Mai 2015, 22:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 9. Mai 2015, 11:53
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Hannes Kuhn

Registriert seit: 4. Apr 2006
Ort: Kassel
48 Beiträge
 
Delphi 7 Professional
 
#9

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 9. Mai 2015, 12:02
Hallo DeddyH,

das gefällt mir schon mal sehr gut.

Vielen Dank
Hannes
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: UnterForm mit Daten aus Hauptform versorgen

  Alt 9. Mai 2015, 12:54
Das ist aber doch genau das, was du bereits hattest, wie du in deinem Eingangsposting ausgeführt hast:

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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr.
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