Daten aus nichtmodalen Formularen abrufen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Daten aus Formularen abrufen


Aus nichtmodalen Formularen können Informationen sehr einfach durch den Aufruf der public-Elementfunktionen oder durch Lesen der Formulareigenschaften abgerufen werden. Angenommen, in einer Anwendung ist das nichtmodale Formular ColorForm mit dem Listenfeld ColorListBox enthalten, das eine Liste verschiedener Farben anzeigt (Rot, Grün, Blau usw.). Sobald der Benutzer in der Liste einen neuen Eintrag auswählt, wird der betreffende Farbname automatisch in der Eigenschaft CurrentColor gespeichert. Die entsprechende Klassendeklaration lautet folgendermaßen:

TColorForm = class(TForm)
  ColorListBox:TListBox;
  procedure ColorListBoxClick(Sender: TObject);
private
  FColor:String;
public
  property CurColor:String read FColor write FColor;
end;
class TColorForm : public TForm {
__published: // IDE-managed Components

	TListBox *ColorListBox;

	void __fastcall ColorListBoxClick(TObject *Sender);

private: // User declarations
	String getColor();
	void setColor(String);

	String curColor;

public: // User declarations

	virtual __fastcall TColorForm(TComponent* Owner);
	__property String CurrentColor = {read = getColor, write = setColor};
};

In der OnClick-Ereignisbehandlungsroutine für das Listenfeld (ColorListBoxClick) wird der Eigenschaft CurrentColor immer dann eine neue Farbe zugewiesen, wenn der Benutzer einen neuen Listeneintrag wählt. Die Ereignisbehandlungsroutine erhält den String aus dem Listenfeld, der den Farbnamen enthält, und weist diesen der Eigenschaft CurrentColor zu. CurrentColor verwendet intern die Schreibfunktion SetColor, um den Wert im private-Datenelement FColor zu speichern:

procedure TColorForm.ColorListBoxClick(Sender: TObject);
var
  Index: Integer;
begin
  Index := ColorListBox.ItemIndex;
  if Index >= 0 then
    CurrentColor := ColorListBox.Items[Index]
  else
    CurrentColor := '';
end;
void __fastcall TColorForm::ColorListBoxClick(TObject *Sender) {
	int index = ColorListBox->ItemIndex;
	if (index >= 0) { // make sure a color is selected
		CurrentColor = ColorListBox->Items->Strings[index];
	}
	else // no color selected
			CurrentColor = "";
}

// ---------------------------------------------------------------------
void TColorForm::setColor(String s) {
	curColor = s;
}

Nun sei angenommen, dass in einem anderen Formular namens ResultsForm die aktuelle Farbe (ColorForm) ermittelt werden muss, wenn eine Schaltfläche (UpdateButton) angeklickt wird. Der Quelltext der OnClick-Ereignisbehandlungsroutine für UpdateButton sieht folgendermaßen aus:

procedure TResultForm.UpdateButtonClick(Sender: TObject);
var
  MainColor: String;
begin
  if Assigned(ColorForm) then
  begin
    MainColor := ColorForm.CurrentColor;
    {do something with the string MainColor}
  end;
end;
void __fastcall TResultsForm::UpdateButtonClick(TObject *Sender) {
	if (ColorForm) { // verify ColorForm exists
		String s = ColorForm->CurrentColor;
		// do something with the color name string
	}
}

Zuerst wird mithilfe der Funktion Assigned geprüft, ob das Formular ColorForm vorhanden ist. Danach wird der Wert der Eigenschaft CurrentColor von ColorForm gelesen.

Alternativ dazu könnte die aktuelle Farbe auch ohne die Eigenschaft CurrentColor ermittelt werden, wenn in ColorColor die Funktion GetColor als public definiert wäre (z.B. MainColor := ColorForm.GetColor;). Die ausgewählte Farbe kann in einem anderen Formular natürlich auch durch direktes Abfragen des Listenfeldes abgerufen werden:

with ColorForm.ColorListBox do
  MainColor := Items[ItemIndex];
String s = ColorListBox->Items->Strings[ColorListBox->ItemIndex];

Die Verwendung einer definierten Schnittstelle in Form einer Eigenschaft ermöglicht jedoch einen einfacheren Zugriff auf ColorForm. Andere Formulare brauchen dann nur den Wert von CurrentColor abzurufen.

Siehe auch