Sehr geehrter Sakura,
Hallo jbg,
superschnelle Antworten - hätte ich gar nicht gedacht. Ich bin begeistert!!!
Vielleicht hätte ich doch etwas mehr schreiben sollen, aber ich wollte es mit den Erläuterungen auch nicht übertreiben. Die Hälfte Deines Vorschlages funktioniert und macht den Quelltext schlanker. Ich habe die ursprüngliche Variante als Kommentar zwecks Vergleich stehen lassen.
Beim Setzen des gewünschten Wertes kann ich Deinen Vorschlag nicht benutzen, da die zu ändernde Komponente nicht direkt angesprochen wird.
Zwecks besseren Verständnis habe ich die beiden Routinen mal komplett hinterlegt.
Delphi-Quellcode:
{Ereignisbehandlung für TCheckBox.onclick / TComboBox.onchange }
procedure TFKasse.ChgAdrZK(Sender: TObject);
var
adrid : integer;
s :
string;
begin
{öffnet die Datenbank (DB) in der die ZK = Zusatzkriterien gespeichert werden sollen}
UP_DBActiv(TabAdrZK, SessN, DataPath, fnAdrZK);
{öffnet die Datenbank}
{TabAdr steht für eine Adress-DB, AdrID sorgt für die eineindeutige
Identifizierung einer gewälten Adresse}
adrid := TabAdr.FieldByName('
AdrID').AsInteger;
{es werden nur die ZK der aktuellen Adresse gefiltert (falls vorhanden) }
SetFilter(TabAdrZK, '
AdrID='+IntToStr(adrid));
{liefert cb<nr> oder cbx<nr> zurück, wobei die nr beim Erzeugen eines ZK
automatisch generiert wurde }
s := Self.ActiveControl.
Name;
{wenn es ein gespeichertes ZK gibt, muß sich der Name von TCheckBox oder
TComboBox in einem Feld cbName finden lassen}
// an jbg: ich weiß, das begin und end an dieser Stelle überflüssig sind
{ wenn gefunden, dann nur Eigenschaft Checked oder Text ändern}
if TabAdrZK.Locate('
cbName', s, [])
then begin
TabAdrZK.Edit;
end
{ wenn nicht, dann der DB hinzufügen und dann Eigenschaften speichern}
else begin
TabAdrZK.Insert;
TabAdrZK.FieldByName('
AdrID').AsInteger := adrid;
TabAdrZK.FieldByName('
cbName').AsString := s;
end;
{ hier funktioniert die von skura vorgeschlagene Variante}
// if (FindComponent(s) is TCheckBox)
// then TabAdrZK.FieldByName('Checked').AsBoolean := (TCheckBox(FindComponent(s)).checked);
if (Sender
is TCheckBox)
then TabAdrZK.FieldByName('
Checked').AsBoolean := TCheckBox(Sender).Checked;
// if (FindComponent(s) is TComboBox)
// then TabAdrZK.FieldByName('Text').AsString := (TComboBox(FindComponent(s)).Text);
if (Sender
is TComboBox)
then TabAdrZK.FieldByName('
Text').AsString := TComboBox(Sender).Text;
TabAdrZK.Post;
end;
{ beim Wechsel der Adreßdatei müssen die ZusatzKriterien aus TabAdrZK
für die jeweilige Adresse (aus bereits geöffneter DB TabAdr) geladen werden;
für Testzwecke über einen SpeedButton realisiert }
procedure TFKasse.sbLoadAdrZKClick(Sender: TObject);
var
adrid : integer;
handle : HWND;
bValue : boolean;
s, sValue :
string;
// str : array[0..255] of char;
// comp : TComponent;
begin
UP_DBActiv(TabAdrZK, SessN, DataPath, fnAdrZK);
adrid := TabAdr.FieldByName('
AdrID').AsInteger;
SetFilter(TabAdrZK, '
AdrID='+IntToStr(adrid));
TabAdrZK.First;
while not TabAdrZK.Eof
do begin
{ Name einer geänderten Komponente aus DB holen;
wurde für die akt. Adresse aus TabAdr bei Änderung gespeichert
sollte keine Änderung durch Nutzer vorgenommen worden sein, steht
der Name der Komponente auch nicht in TabAdrZK }
s := TabAdrZK.FieldByName('
cbName').AsString;
handle := TCheckBox(FindComponent(s)).Handle;
if (FindComponent(s)
is TCheckBox)
then begin
bValue := TabAdrZK.FieldByName('
Checked').AsBoolean;
{ hier der Vorschlag von sakura
Ergebnis: der then-Zweig wird nicht angesprungen,
weil der Sender vom Typ TSpeedButton ist
}
if Sender
is TCheckBox
then TCheckBox(Sender).Checked := bValue;
end;
if (FindComponent(s)
is TComboBox)
then begin
sValue:= (TabAdrZK.FieldByName('
Text').AsString);
{ das gleiche Erg. wie oben
}
if Sender
is TComboBox
then TComboBox(Sender).Text := sValue;
end;
TabAdrZK.Next;
end;
end;
Ich hoffe, Du hast noch eine Idee.
mfg
eddy
PS: wie kriegt man die Formatierung des Quelltextes zwischen
hin ?
[edit=Sakura]CODE-Tags in DELPHI-Tags umbenannt. Deine Antwort [/edit]