Einzelnen Beitrag anzeigen

Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#4
  Alt 4. Jan 2003, 22:15
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
Code:
 und
hin ?

[edit=Sakura]CODE-Tags in DELPHI-Tags umbenannt. Deine Antwort [/edit]
  Mit Zitat antworten Zitat