Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#13

AW: [FMX] Ansatz gesucht: Panels duplizieren?

  Alt 9. Apr 2018, 09:23
@Kodezwerg

Nehmen wir an, wir erstellen ein Frame frmEingabe, dieses enthält die Buttons btnOk und btnCancel, sowie die Edits edName und edVorname.

Fügen wir nun ein derartiges Frame auf einem Formular ein und geben ihm den Namen frmPerson1, so können wir im Formularquelltext z. B. so auf die Komponenten auf dem Frame zugreifen:
Delphi-Quellcode:
...
  ShowMessage(frmPerson1.edName.Text);
  if frmPerson1.edVorname.Text = 'Paulthen begin
     ...
  end;
...
Benötigen wir nun noch ein Frame und nennen es frmPerson2, dann erfolgt der Zugriff analog dazu:
Delphi-Quellcode:
...
  ShowMessage(frmPerson2.edName.Text);
  if frmPerson2.edVorname.Text = 'Paulthen begin
     ...
  end;
...
Eigentlich ist es nicht anders, als bei den Eigenschaften irgendeiner anderen Komponente, deren Eigenschaften über weitere Eigenschaften verfügen.

IrgendeineKlasse.Eigenschaft.EigenschaftDerEigenschaft
Framename.KomponenteAufDemFrame.EigenschaftderKomponente
frmWieErAuchHeissenMag.KomponenteDadrauf.EigenschaftDerKomponente

Ein Buttonereignis könnte man so im Frame implementieren, dabei gehe ich davon aus, dass sich auf dem Frame zusätzlich noch 'ne Komponenten vom Typ TDataSource befindet:
Delphi-Quellcode:
procedure TfrmPerson.btnOKClick(Sender: TObject);
begin
  Screen.Cursor := crSQLWait;
  // Inhalt der Texteigenschaften von edName und edVorname in eine Datenbank suchen.
  if fDataSource.DataSet.Filtered then begin
    fDataSource.DataSet.Filtered := False;
  end else
  if (edName.Text <> '') and (edVorname.Text <> '') then begin
    Try
      fDataSource.DataSet.Filtered := False;
      fDataSource.DataSet.Filter := Format('Name = ''%s'' and Vorname = ''%s''',[edName.Text, edVorname.Text]);
      fDataSource.DataSet.Filtered := True;
    except
      on e : Exception do begin
        fDataSource.DataSet.Filtered := False;
        MessageDlg('Fehler beim Setzen des Filters.' + #13 + #13 + e.Message,mtError, [mbOk], 0);
      end;
    end;
  end;
  Screen.Cursor := crDefault;
end;
(Über den tieferen Sinn der Beispiele wollen wir jetzt nicht diskutieren, es geht nur ums Prinzip einer möglichen Framenutzung.)

Hat man nun alle Frames auf einem Formular in einer Liste, so muss man im Quelltext nichtmalmehr den Namen der einzelnen Frames wissen.
Delphi-Quellcode:
for i := 0 to IrgendeineListe.Count - 1 do begin
  if IrgendeineListe[i] is tfrmPerson then begin
    MemoNamensliste.Lines.Add(tfrmPerson(IrgendeineListe[i]).edName.Text + ', ' + tfrmPerson(IrgendeineListe[i]).edVorName.Text);
  end;
end;
oder:
Delphi-Quellcode:
var
   myFrame : TfrmPerson;
   i : Integer;
begin
  for i := 0 to IrgendeineListe.Count - 1 do begin
    if IrgendeineListe[i] is tfrmPerson then begin
      myFrame := IrgendeineListe[i];
      VerschickeEmail(Format('%s.%s@woauchimmer.de',[myFrame.edVorname.Text, myFrame.edName.Text));
    end;
  end;
end;
Ob man jetzt die Frames bereits zur Entwicklungszeit auf 'nem Formular platziert oder sie zur Laufzeit dynamisch erzeugt, ändert nichts an der Funktionalität.

Frames sind eigentlich, gut implementiert, genauso zu nutzen, wie eine Klasse mit diversen Eigenschaften, Methoden, Ereignissen ... (genaugenommen sind sie es ja auch type TfrmPerson = class(TFrame) ... ).
  Mit Zitat antworten Zitat