Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Werte aus einer DBComboBox in eine andere übernehmen (https://www.delphipraxis.net/41267-werte-aus-einer-dbcombobox-eine-andere-uebernehmen.html)

kongo 28. Feb 2005 20:38

Datenbank: MS Access • Zugriff über: ADO

Werte aus einer DBComboBox in eine andere übernehmen
 
N'abend,
ich wähle Werte für die Eingabe in eine ADO/Access-DB aus einer DBComboBox aus. Diese Werte sind über ItemIndex mit Konstanten belegt. Die Zuweisung der Konstanten erfolgt über das OnChange-Ereignis mittels case-Anweisung. Nun möchte ich über ein PopupMenu die Möglichkeit bieten, den ausgewählten Wert zwei anderen, mit den selben Items gefüllten DBComboBox-Komponenten zuzuweisen. Irgendwie steh' ich jetzt im Wald, weil 1.:
bei (sinngemäß)
Delphi-Quellcode:
DBComboBox2.ItemIndex := DBComboBox1.ItemIndex
vermutlich kein OnChange-Ereignis ausgelöst wird und somit keine Konstantenzuweisung erfolgt und 2.:
der Eintrag nach
Delphi-Quellcode:
ADOTable1.Post
aus der DBComboBox verschwunden ist und natürlich auch nicht in der DB steht. Die Struktur der Access-DB darf nicht verändert werden.
Weiß jemand Rat bzw. einen anderen Weg?

Stevie 2. Mär 2005 08:28

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
Hi kongo,

könntest du dein Problem bitte etwas erläutern, ich blick - ehrlich gesagt - noch nicht ganz dahinter... :oops:

kongo 2. Mär 2005 19:51

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
Hallo Stevie,

erstmal danke für Dein Interesse,
die DB enthält u.a. drei Felder, die nur mit bestimmten Werten belegt werden dürfen. Diese Werte sind als Items in drei DBComboBox-Komponenten hinterlegt. Mit der Auswahl eines Wertes wird gleichzeitig ein Wert vom Typ SINGLE in die DB geschrieben, mit dem später etwas berechnet wird. Die Zuweisung erfolgt beim OnChange-Ereignis über case-Anweisung:

Delphi-Quellcode:
procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
  ADOTable1.Edit;
   case DBComboBox1.ItemIndex of
    0: ADOTable1.FieldByName('UC_SpCA').AsFloat := 0.112;
    (..)
    7: ADOTable1.FieldByName('UC_SpCA').AsFloat := 0.173;
    end
end;
Das klappt soweit auch wie gewünscht. Da es allerdings oft der Fall ist, das der Nutzer drei mal den gleichen Wert auswählen möchte, habe ich ein PopupMenu eingebaut mit dem es möglich sein soll den Wert aus DBComboBox1 in DBComboBox2 und DBComboBox3 zu übernehmen.
Da natürlich auch der SINGLE-Wert übernommen werden soll, dachte ich mir in meiner naiven Birne, mache ich das am Besten über ItemIndex:

Delphi-Quellcode:
procedure TForm1.copy1Click(Sender: TObject);
begin
  DBComboBox2.ItemIndex := DBComboBox1.ItemIndex;
  DBComboBox3.ItemIndex := DBComboBox1.ItemIndex;
end;
Das klappt allerdings nur zum Teil, es steht zwar in allen DBComboBoxen der gleiche Wert, aber die SINGLE-Werte werden wohl deshalb nicht übernommen, weil das OnChange-Ereignis für die anderen DBComboBoxen gar nicht stattfindet wenn ich den ItemIndex gleichsetze.
Wie komme ich da raus ohne alles umzuschreiben?

Das zweite Problem ist, dass die 'kopierten' Werte nicht in die DB geschrieben werden. Sobald
Delphi-Quellcode:
ADOTable1.Post;
ausgelöst wird, sind DBComboBox1 und 2 wieder 'leer' (ItemIndex: -1) und die entsprechenden DB-Felder auch.

Ich hoffe, Du siehst jetzt etwas klarer..
gruß, kongo

kiar 2. Mär 2005 20:17

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
hallo kongo,

ich weis nicht, ob das mit dbcombobox geht, aber ein versuch ist es wert
Delphi-Quellcode:

deinclick
begin
  DBComboBox2.items.add(DBComboBox1.items[DBComboBox1.itemindex]);

end;
raik

kongo 2. Mär 2005 21:26

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
Hallo kiar,
danke für Deinen Vorschlag, aber ich fürchte, Du hast mein Problem missverstanden (oder ich habe es immer noch nicht richtig dargestellt :wink: ). Die Items sind in allen drei DBComboBoxen gleich. Ich suche eine Möglichkeit, bei der Auswahl des Items der ersten DBCB (ich mag das jetzt nicht mehr ausschreiben) die anderen beiden 'automatisch' gleichzusetzen, wobei dabei für DBCB2 und DBCB3 ein OnChange-Ereignis ausgelöst werden muß.
Als Voraussetzung habe ich das PopupMenu mit RadioItems bestückt:
Delphi-Quellcode:
if PopupRadioItem1.Checked then begin
{setze DBCB2 und 3 gleich DBCB1}
(..)
end;
Habe auch schon CopySelection ausprobiert, das fügt mir aber nur einen weiteren Items-Eintrag hinzu.
Da muss es doch einen (simplen) Weg geben!? :wall:
gruß, kongo

Stevie 3. Mär 2005 07:57

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
Ah, jetzt versteh ich dein Problem - glaube ich... ;-)

Erstens solltest du keine DBComboBoxen nehmen, sondern "normale". DBComboBoxen sind dafür da, den Wert, der ausgewählt wurde, auch in dem Feld zu speichern, aber das machst du scheinbar nicht - du speicherst ja intern nen anderen Wert ab, als der Benutzer auswählt. Wenn du einen Datensatz holst, musst du selbstverständlich den umgekehrten Weg gehen - aus dem Wert im Feld das dazugehörige Item in der ComboBox auswählen. Wenn du die anderen beiden auch auf diesen Wert stellen möchtest, dann ruf doch nach dem Setzen des richtigen Item-Indizes das OnChange-Event für die beiden ComboBoxen auf (Sender kann ruhig nil sein, wenn du ihn nicht benutzt).

Ich hoffe, jetzt hab ich mich verständlich ausgedrückt

kiar 3. Mär 2005 11:12

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
hallo kongo,

versuche es so:

Delphi-Quellcode:
procedure TForm1.CB1Change(Sender: TObject);
begin
       CB2.ItemIndex:= CB1.ItemIndex;
       CB3.ItemIndex:= CB1.ItemIndex;
       if CB2.ItemIndex <> -1 then
          CB2.OnChange(CB2);
          if CB3.ItemIndex <> -1 then
             CB3.OnChange(CB3);
end;

procedure TForm1.CB2Change(Sender: TObject);
begin
     Showmessage('Cb2.Change');
end;

procedure TForm1.CB3Change(Sender: TObject);
begin
      Showmessage('CB3.Change');
end;
raik

kongo 8. Mär 2005 19:24

Re: Werte aus einer DBComboBox in eine andere übernehmen
 
Hallo kiar & Stevie,

vielen Dank nochmal, ich habe es zwar erstmal auf eine etwas umständliche und unschöne Art gelöst,
Delphi-Quellcode:
case DBComboBox1.ItemIndex of
0 :   begin a := 0.112; (..)end;

(..)

if ind_type.Checked then begin
    ADOTable1.FieldByName('DataField von ComboBox2').AsString :=
    DBComboBox1.Text;
    ADOTable1.FieldByName('b').AsFloat := a;
    end;
werde aber eure Vorschläge auf jeden Fall noch ausprobieren und an dieser Stelle kommentieren. :wink:
Muss jetzt aber erstmal andere 'Probleme' angehen..

Gruß,
kongo


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz