Daten aus nichtmodalen Formularen abrufen
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.