mit einer Function eine Form aufrufen und Werte übergeben?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

mit einer Function eine Form aufrufen und Werte übergeben?

Beitrag von TT73GP7 »

Hallo Zusammen,
Also ich möchte mit einer Funktion ein Fenster Aufrufen. Das Fenster hat ein DBGrid drauf und mit onEnter wird ein Wert wieder zurückgegeben.
So habe ich mir das vorgestellt. Nur irgendwie komme ich da nicht so recht weiter.
Also wie ist der Plan?

Aufruf:

Code: Alles auswählen

 
procedure TfrmMain.MenuItem1Click(Sender: TObject);
begin
  sListe('dbArtikel', 'Artikelname');
end;
 


PAS der Funktion:

Code: Alles auswählen

 
Function sListe(cTable, cAnz: String):String;
begin
 
  frmListe.cFeldueber := cAnz;
  frmListe.cTableGL   := cTable;
  Liste.frmListe.Show;
  sListe := cFeldRueck;
 
end;
 
 


Zuzeigende Form:

Code: Alles auswählen

 
unit Liste;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes,
  SysUtils,
  FileUtil,
  Forms,
  Controls,
  Graphics,
  Dialogs,
  DBGrids,
  ZDataset,
  db;
 
type
 
  { TfrmListe }
 
  TfrmListe = class(TForm)
    DS_Liste: TDataSource;
    DBGrid1: TDBGrid;
    zListe: TZQuery;
    procedure DBGrid1Enter(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    cFeldueber    : String;
    cTableGL      : String;
    cListeRueck   : String;
 
  end;
 
var
  frmListe: TfrmListe;
 
 
implementation
 
{$R *.lfm}
 
{ TfrmListe }
 
procedure TfrmListe.FormCreate(Sender: TObject);
var
  Colum: TColumn;
begin
end;
 
procedure TfrmListe.FormClick(Sender: TObject);
begin
  frmListe.cListeRueck := DS_Liste.DataSet.FieldByName('ID').Text;
  Close;
end;
 
procedure TfrmListe.DBGrid1Enter(Sender: TObject);
begin
 frmListe.cListeRueck :=  DS_Liste.DataSet.FieldByName('ID').Text;
 Close;
end;
 
procedure TfrmListe.FormShow(Sender: TObject);
begin
  If (frmListe.cFeldueber <> '') then begin
    zListe.SQL.Text := 'SELECT ID, '+frmListe.cFeldueber+' FROM '+frmListe.cTableGL;
    zListe.Active   := True;
 
    DBGrid1.Columns.Items[0].FieldName     := frmListe.cFeldueber;
    DBGrid1.Columns.Items[0].Title.Caption := frmListe.cFeldueber;
    DBGrid1.Columns.Items[0].Width         := 170;
    DBGrid1.Refresh;
 
  end;
end;
 
end.
 
 



Nun wo ist mein Problem?
A habe ich nun so viel rumprobiert und komme irgendwie nicht weiter (knoten in kopf oder so)
B die Globen Variablen stören mich

Kann sich das gewuschel mal jemand ansehen und mir sagen wie nach seiner Ansicht der beste Weg wäre?

Viele Grüße

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: mit einer Function eine Form aufrufen und Werte übergebe

Beitrag von Michl »

Man könnte ein Ereignis erzeugen, das die Wahl eines Eintrages an die aufrufende Klasse sendet. Man könnte es aber auch so lösen wie du es schon vorbereitet hast und nach der Wahl eines Eintrages, diesen zwischenspeichern und, nach dem Schließen des Forms, diesen nutzen.
Dazu könntest du das Ereignis OnAfterScroll vom Query (bei dir zListe) nutzen.
Das Schließen des Formulars bzw. die Bestätigung würde ich über einen <OK> Button machen, der das Modalresult mrOK setzt.

Das Ganze sieht dann so aus:

Code: Alles auswählen

Function sListe(cTable, cAnz: String):String;
begin
 
  frmListe.cFeldueber := cAnz;
  frmListe.cTableGL   := cTable;
  if frmListe.ShowModal = mrOK then
    Result := frmListe.cListeRueck
  else
    Result := 'Irgend ein Standardeintrag';
 
end;

Nun noch die Methoden TfrmListe.FormClick, TfrmListe.FormCreate, TfrmListe.DBGrid1Enter entfernen (oder wenigstens den Code darin) und Methode TfrmListe.zListeAfterScroll einfügen (und verknüpfen):

Code: Alles auswählen

procedure TfrmListe.zListeAfterScroll(DataSet: TDataSet);
begin
  cListeRueck := DataSet.FieldByName('ID').AsString;
end;

Ich hoffe, ich habe nichts vergessen.

Achso, noch ein Hinweis am Rande. Es ist immer günstig eine Instanz entsprechend der Klasse eines Controls zu benennen, ansonsten versteht man mal später den eigenen Code nicht mehr. Ein ZQuery würde ich daher Query, ZQuery, queryListe oder sonstwie ...Query... nennen aber nicht zListe (ein TList wäre für mich eine Liste).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: mit einer Function eine Form aufrufen und Werte übergebe

Beitrag von TT73GP7 »

ahh stimmt ja

einfach den Status von ShowModal abfragen ;)

Code: Alles auswählen

 
Function sListe(cTable, cAnz: String):String;
begin
   frmListe.cFeldueber := cAnz;
   frmListe.cTableGL   := cTable;
 
  if frmListe.ShowModal = mrOK then
    Result := frmListe.cListeRueck
  else
    Result := 'Irgend ein Standardeintrag';
end;
 


Aber mit mrOK frage ich doch eigentlich ab ob einer auf einen Button geklickt hat oder?
was ist wenn ich keinen Button will

sondern nur drauf warte das einer auf das DBGrid klickt und dann die Form mit Close schliesse?
dann würde er doch immer in Else reingehen?

was müsste ich dann machen?
mrClose?

gibt eine Auflistung der Möglichkeiten der abfrage von ShowModal?
habe da nix gefunden?

Viele Grüße
:)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: mit einer Function eine Form aufrufen und Werte übergebe

Beitrag von wp_xyz »

Ich würde dieses Formular, da es modal ist, nicht mit Close schließen, sondern indem ich sein ModalResult auf mrOK setze. Das ist effektiv dasselbe wie ein Click auf den OK-Button. Die Schleife, die in ShowModal durchlaufen wird, wird verlassen, wenn ModalResult <> mrNone ist --> Das Formular schließt und das Ergebnis von ModalResult ist mrOK.

Aus customform.inc:

Code: Alles auswählen

repeat
  ...
  if ModalResult <> 0 then
  begin
    CloseModal;
    if ModalResult <> 0 then break;  //also: ModalResult <> mrNone, da mrNone = 0
  end;
...
until False;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: mit einer Function eine Form aufrufen und Werte übergebe

Beitrag von Michl »

TT73GP7 hat geschrieben:sondern nur drauf warte das einer auf das DBGrid klickt und dann die Form mit Close schliesse?
Das kannst du machen. Du könntest dafür einfach im DBGrid.OnCellClick "Close" aufrufen (Query.OnAfterScroll wird zuvor aufgerufen, sodaß das mit dem Bsp. oben problemlos funktionieren müsste).

Ansonsten, wenn du kein modales Formular haben möchtest und keinen Button, könnte man auch die Wahl eines Eintrages auch mit <Enter> oder einem Doppel-Klick bestätigen. Dafür könntest du einfach im DBGrid.OnKeyDown bei der Taste VK_RETURN und im DBGrid.OnDblClick "Close" aufrufen (und nimm einfach den Code von dir und vergiss das mit der Auswertung des Modalresults).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten