AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterrückgabe von Form an aufrufenden Prozess

Ein Thema von FediDelPr · begonnen am 8. Mär 2019 · letzter Beitrag vom 16. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2      
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Parameterrückgabe von Form an aufrufenden Prozess

  Alt 8. Mär 2019, 17:58
Hallo zusammen,

ich suche für folgendes Problem eine (elegante) Lösung:

Es existiert bereits ein Modul mit Form das eine komplexe Suche in einer DB ermöglicht.
Die Suche soll von überall aus dem Programm verwendet werden können.

Am Ort des Aufrufs soll z.B. ein Edit-Feld und zusätzlich ein Button (Bezeichnung Advanced Search) vorhanden sein. Mit dem Button wird das Search-Fenster geöffnet.
Jetzt kann nach etwas gesucht werden. Beim Schliessen des Fenster soll nun das Resultat
(idR eine Referenz zu einer ItemNr in der DB) direkt in das Edit-Feld auf dem Form von
dem aus die Suche aufgerufen wurde eingefüllt werden.

Wäre das Suchen nur eine einfache Funktion oder Procedure wäre das Ganze keine Hexerei.
Schwieriger wird's (für mich), weil das Aufbereiten des Resultates im Subfenster geschieht und
die Resultatübergabe erst beim Schliessen dieses Fensters erfolgen soll. (oder explizit mit
Button auf dem Suchfenster)

Ich kann mir gut vorstellen, dass unter euch jemand ist, der eine einfache,
perfekte Lösung bereit hält.
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
376 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 8. Mär 2019, 18:10
...naja wir müssten schon wissen wie die Ergebnisse aussehen, die die Suche ausspuckt. Dann kann man auch über eine Rückgabe spekulieren.
Andreas Schachtner
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 8. Mär 2019, 18:13
Hallo,
das SuchForm über eine lokale Variable erzeugen, starten, warten und fertig.

Delphi-Quellcode:
unit2

type
  TSuchForm = class(TForm)
    public
      ItemNr: Integer;
  end;


unit1

procedure TForm1.Suche;
var
  Frm: TSuchForm;
  ItemNr: Integer;
begin
  ItemNr:= 0;

  Frm:= TSuchForm.Create(Self);
  try
    if Frm.ShowModal=mrOK then
    begin
      ItemNr:= Frm.ItemNr;
    end;
  finally
    Frm.Free;
  end;

  if ItemNr=0 then
  begin
    Exit;
  end;

end;
Heiko
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#4

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 8. Mär 2019, 19:37
Hoika's Lösungsansatz ist einer, der mal als einfaches Beispiel formuliert wurde aber funktioniert.

Ein anderer wäre dem Suchen Fenster via Konstruktor eine Callback-Methode zu übergeben, die das Suchen
Fenster aufruft wenn es geschlossen wird und dem die Daten übergibt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 8. Mär 2019, 20:39
Hallo,
Zitat:
Ein anderer wäre dem Suchen Fenster via Konstruktor eine Callback-Methode zu übergeben, die das Suchen
Fenster aufruft wenn es geschlossen wird und dem die Daten übergibt.
Bo eh!
Der TE hat 43 Einträge !

Heiko
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 9. Mär 2019, 03:19
Die Variante von hoika funktioniert jetzt.

Die wesentlichen Elemente sind:
- ShowModal
- ModalResult, um z.B. mrOK.. selbst zu generieren (kein Standard-Dialog)
- Die Output-Variable als PUBLIC in der Klasse definiert

Ich verwende allerdings nicht die dynamische Form-Erzeugung. Wo liegt der Vorteil ?

Die andere Möglichkeit von TurboMagic ist für später sicher interessant.
Etwas in dieser Art schwebte mir ursprünglich vor. Da ich in dieser Hinsicht wenig
Erfahrungen habe konzentrierte ich mich auf die andere Lösung.
Sollte jemand Zeit haben die Details an einem einfachen Beispiel kurz zu erläutern, würde
mich das natürlich freuen.

Besten Dank für die Hilfe.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 9. Mär 2019, 06:55
Moin...
Zitat:
Ich verwende allerdings nicht die dynamische Form-Erzeugung. Wo liegt der Vorteil ?
Wieder mal ein Auto Vergleich...
Stelle dir mal vor, daß du in den Urlaub fahren willst.Dazu packst du deinen kompletten Hausstand (Forms) ein...jeder Koffer eine Form. Wenn du Pech hast (eher selten ) passen deine Koffer nicht ins Auto (Arbeitsspeicher zu klein). Besser ist, nur die Koffer zu packen, die du brauchst (dynamische Erzeugung) und nach dem Urlaub wieder auszupacken (Free). Somit hast immer den Kofferraum immer leer...

Bei einer Form spielt es keine Rolle, aber man sollte es gehört haben wie es auch anders geht.
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 9. Mär 2019, 13:23
Hallo,
das SuchForm über eine lokale Variable erzeugen, starten, warten und fertig.

Delphi-Quellcode:
unit2

type
  TSuchForm = class(TForm)
    public
      ItemNr: Integer;
  end;


unit1

procedure TForm1.Suche;
var
  Frm: TSuchForm;
  ItemNr: Integer;
begin
  ItemNr:= 0;

  Frm:= TSuchForm.Create(Self);
  try
    if Frm.ShowModal=mrOK then
    begin
      ItemNr:= Frm.ItemNr;
    end;
  finally
    Frm.Free;
  end;

  if ItemNr=0 then
  begin
    Exit;
  end;

end;
So wie du würde ich es auch lösen. Ich würde lediglich eine execute-Methode dem Form geben:
Delphi-Quellcode:
type
  TSuchForm = class(TForm)
  private
    FItemNr: Integer;
  public
    class function Execute(var AItemNr: Integer): Boolean;
  published
    property ItemNr: Integer read FItemNr write FItemNr;
  end;

...

class function TSuchForm.Execute(var AItemNr: Integer): Boolean;
var
  Form: TSuchForm;
begin
  Form := TSuchForm.Create(nil);
  try
    Form.ItemNr := AItemNr;
    Result := Form.ShowModal = mrOK;
    if Result then
      AItemNr := Form.ItemNr;
  finally
    FreeAndNil(Form);
  end;
end;
Das Form sollte natürlich aus der auto. erstellen Liste des Projekts entfernt werden.
Andreas Lauß
Blog

Geändert von Andreas L. ( 9. Mär 2019 um 13:26 Uhr)
  Mit Zitat antworten Zitat
Pfaffe

Registriert seit: 29. Jan 2009
297 Beiträge
 
Delphi 12 Athens
 
#9

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 9. Mär 2019, 17:26
Zitat:
Ich verwende allerdings nicht die dynamische Form-Erzeugung. Wo liegt der Vorteil ?
Bei Anwendungen, die der Anwender oft schießt und wieder öffnet, kann es nerven, wenn der Startvorgang lange dauert.
Es gibt aber auch Anwendungen, die schließt der Anwender selten, z.B. CAD-Programme, die halten möglichst viel im Speicher, da macht auch 64-Bit Sinn.
Bei Datenbankanwendungen wäre es blöd, wenn die Connection immer wieder zerstört wird. Habe schon Anwendungen gesehen, in der in jedem Form eine Connection auf und wieder zugemacht wurde
Es gibt noch eine weitere Möglichkeit. Die Formulare werden nicht in der dpr erzeugt, sondern dann, wenn der Anwender sie zum ersten Mal anfordert:
Delphi-Quellcode:
  if not Assigned(FSuchForm) then
    Application.CreateForm(TFSuchForm, FSuchForm);
  // FSuchForm.xxx
anstatt von
Delphi-Quellcode:
  Frm:= TSuchForm.Create(Self);
  try
    // Frm.xxx
  finally
    Frm.Free;
  end;
Nachdem das Formular erzeugt wurde, bleibt es im Speicher, bis die Anwendung beendet wird. Fordert der Anwender das Formular nicht an, dann wird es auch nicht erzeugt und verbraucht keinen Speicher.

Richtig/Falsch: Nicht zu viel Angst vor scheinbare Fehler, oft gibt es viele Lösungswege. Heuzutage wird in den Firmen zu lange geredet und es herrscht zu viel Angst davor, etwas nicht optimal zu machen. Meine Empfehlung: Demos mit den verschiedenen Techniken erstellen, kommentieren und archivieren.

Anmerkung zu DLL's: Bei den neueren Delphi-Versionen kann die Option delayed angeben werden, dann dauert das Erste ansprechen der DLL nicht so lange. (Bitte in der Hilfe nachlesen)
  Mit Zitat antworten Zitat
Pfaffe

Registriert seit: 29. Jan 2009
297 Beiträge
 
Delphi 12 Athens
 
#10

AW: Parameterrückgabe von Form an aufrufenden Prozess

  Alt 9. Mär 2019, 17:52
Noch eine Anmerkung zum Thema Programmierstil:
Nehmen wir an, es gibt viele Anwendungen in eine FSuchForm benötigen.
Man könnte diese in eine DLL auslagern.
Oder man ruft alle Formulare aus einem Datamodul (DM) auf, welches von sämtlichen Anwendungen verwendet wird.
Man hat dann auch nicht das Problem, dass sämtliche Formulare viele units, in denen die anderen Formularen deklariert sind, eingebunden werden müssen. Es muss immer nur das Datamodul eingebunden werden. Im Datamodul sind die notwendigen units eingebunden.
Das Datamodul stellt nun durch Hilfsroutinen den Zugriff auf die Formulare her. Auch die Verbindung zu Datenquellen.
Also nicht:
Delphi-Quellcode:
  Frm:= TSuchForm.Create(Self);
  try
    // Frm.xxx
  finally
    Frm.Free;
  end;
sondern:
  DM.Get_SuchFormItemNr; // in Get_SuchFormItemNr wir alles gemacht, was notwendig ist um das Formular anzuzeigen. Im Datamodul steht nun das
Delphi-Quellcode:
function DM.Get_SuchFormItemNr: integer;
begin
  result:= -1; // Initialisierung
  if not Assigned(FSuchForm) then
    Application.CreateForm(TFSuchForm, FSuchForm);
  if FSuchForm.Showmodal = mrOK then
    result:= FSuchForm.ItemNr
  else
    result:= -2; // z.B. besser Konstanten deklarieren
end;
Nachteil:
Delphi gibt ggf. Warnungen aus "deklariert, aber nicht verwendet" aus.
Die einzelnen Anwendungen (exe) werden ein bisschen größer, da der Linken nicht intelligent genug ist.
Es dürfen in einem Projektteam nicht zu viel Leute am Datamodul rumfummeln.

Bei Fachanwendungen kann im Datamodul der Datenbankzugriff gekapselt werden, nicht jeder Dr.-Ing. muss davon Ahnung haben.

Wenn es nur eine große Anwendung gibt, dann kann die Logik auch ins Hauptformular und muss nicht ins Datamodul.

Geändert von Pfaffe ( 9. Mär 2019 um 18:06 Uhr)
  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 09:27 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