Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 09.12.02 22:42 
Zitat:
@Peter: Beziehst du dich damit auf zu 2, oder was? Was meinst du , wenn dem nicht so ist?

Ich habe versucht, Popov zu erklären, was Du meintest. Und ich hoffe, ich habe das richtig gemacht.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 10.12.02 00:28 
D0P3 F!$H hat folgendes geschrieben:
@Popov: Ich verstehe nicht, was du meinst. Ich habe doch Werte in den ComboBoxen, die ich auswählen kann. Was meinst du mit deinem Post?


Betrachte bitte die ComboBox. Die Eigenschaft Text kannst du nur bei csDropDown und csSimple nutzen. Text ist unabhängig von den Items, d.h. es muß keinen passenden Item zu dem Text geben. Bei csDropDownList ist das aber anders. Hier muß es zu dem angezeigtem Wert (es ist ja kein Text) einen Item-Wert geben. Wenn du also in der ComboBox1 nicht den Wert von ComboBox1 als Item haben willst, dann kannst du auch nicht den Wert in der Anzeige haben. Der angezeigte Wert ist der markierte Item und umgekehrt. Das ist eine Art Paradoxon. Ohne das Eine gibt es das Andere nicht. Und wenn du das immer noch nicht verstanden hast, dann lies dir das 10 mal durch und dann die Hilfe.

Natürlich kann man da mit Tricks arbeiten. Allerdings werde ich es nicht für dich machen.

Zu dem anderen Problem: du solltest dir langsam auch die Eigenschaften und Methoden von ComboBox durchlesen. Du muß ja nicht wegen jeder kleinsten Frage gleich hier posten. Zwar schreibst du das Programm alleine, fragst aber bei jeder Zeilen wie sie geschreiben werden soll. Wenn du dir das durchgelesen hättest, dann hättest du ItemIndex bemerkt. Dann einfach in der FormCreate ComboBox.ItemIndex := 0 eingeben und schon startet dein Programm mit dem ersten Eintrag.
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 10.12.02 12:13 
Zitat:
Betrachte bitte die ComboBox.
Was du da sagst verstehe ich nicht so ganz.
Was ich weiss ist, dass bei csSimple nur ein Eintrag möglich ist, den man selbst editieren kann.
Bei csDropDown gibt es vorgegebene Werte, allerdings kann man auch eigene Einträge angeben (Das darf bei mir nicht sein, weil ich in den ComboBoxen die Walzen auswähle und eigene Einträge nicht berücksichtigt werden können und deshalb das Prorgamm nicht funktionieren würde).
Bei csDropDownList gibt es nur vorgegebene Werte. Man kann keine eigenen Einträge hinzufügen.

Zitat:
Zu dem anderen Problem:
Kann ja sein, dass ich mich etwas umständlich ausgedrückt habe. aber wenn du wirklich glaubst, dass ich so blöde bin, dann tust du mir leid! Natürlich habe ich im ObjectInspector ItemIndex auf einen beliebigen Wert gesetzt, damit beim Progammstart eine Walzeneinstellung vorhanden ist.

Ich habe dein Programm ein bisschen umgestaltet:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
  Liste = '"Walze Nr. I", "Walze Nr. II", "Walze Nr. III", "Walze Nr. IV", "Walze Nr. V", "Walze Nr. VI", "Walze Nr. VII", "Walze Nr. VIII"';

implementation

{$R *.dfm}

procedure TForm1.WalzenDropDownListe(Sender: TObject);
begin
 with TComboBox(Sender).Items do begin
  CommaText := Liste;
  with ComboBox1 do Delete(IndexOf(Items[ItemIndex]));
  with ComboBox2 do Delete(IndexOf(Items[ItemIndex]));
  with ComboBox3 do Delete(IndexOf(Items[ItemIndex]));
 end;
end;
Der Style ist auf csDropDownList und es gibt eine Voreinstellung. Es klappt soweit richtig, nur wenn ich einen Eintrag ändern will, so wird beim DropDown der ausgewähte Eintrag nicht angezeigt. Wenn ich beim DropDown keinen Eintrag asuwähle so wird leider keiner mehr angezeigt. Das sind die einzigen "Fehler".
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 10.12.02 13:24 
D0P3 F!$H hat folgendes geschrieben:
... aber wenn du wirklich glaubst, dass ich so blöde bin, dann tust du mir leid! Natürlich habe ich im ObjectInspector ItemIndex auf einen beliebigen Wert gesetzt, damit beim Progammstart eine Walzeneinstellung vorhanden ist.


Wo? Kann sein, daß es in der 6'er oder 7'er Version möglich ist im OI ItemIndex einzustellen. In der 3'er und 5'er kann man das nicht.

Zu deiner verkürzten Version:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.WalzenDropDownListe(Sender: TObject); 
begin 
with TComboBox(Sender).Items do begin 
  CommaText := Liste; 
  with ComboBox1 do Delete(IndexOf(Items[ItemIndex])); 
  with ComboBox2 do Delete(IndexOf(Items[ItemIndex])); 
  with ComboBox3 do Delete(IndexOf(Items[ItemIndex])); 
end;


Natürlich kannst du dir die Sicherheitsabfrage hier sparen. Hier kann man davon ausgehen, daß eigentlich nichts passiert (solange alle CB's gleiche Liste haben und mehr als zwei Einträge). Allerdings kann es sonst passieren, daß IndexOf = -1 ist. In desem Fall bekommst du eine schöne Fehlermeldung. Bei meiner Version wird zuerst geprüft ob der Wert größer -1 ist. Mit Regeln ist es wie mit (keiner Ahnung mit was). Wenn man sich angewöhnt Sicherheitsabfragen im Code einzusetzen, dann kommt sowas später automatisch. Man denkt garnicht mehr drann und die Finger tippen solche Abfragen automatisch. Wenn man aber nur dann die Abfragen einbaut wenn man muß, dann muß man auch immer gut aufpassen.

IndexOf kann einen Fehler verursachen. Das könnte dein Lehrer auch bemerken und dich dannach fragen. Dann solltest du Ihm eine Antwort liefern können wieso es hier nicht zu Fehler kommen kann.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 10.12.02 15:39 
Popov hat folgendes geschrieben:
Wo? Kann sein, daß es in der 6'er oder 7'er Version möglich ist im OI ItemIndex einzustellen. In der 3'er und 5'er kann man das nicht.
Ja, in meiner Version 6 ist das möglich. Allerdings wird bei Deinem Programm ja die Liste erst nach Programmstart geladen, dann klappt das natürlich nicht mehr.

Regeln: ich mache auch lieber ein paar Regeln zu viel als nur eine zu wenig. (Okay, wenn ich schnell was ausprobieren will in einem Programm, dass ich noch nicht mal speichern will, lasse ich die weg, aber ansonsten baue ich auch immer ziemlich (zu?) viele ein.

DOP3 F!$H hat folgendes geschrieben:
Was du da sagst verstehe ich nicht so ganz.

csDropDownList kann nur Einträge anzeigen, die auch in der Liste drin sind, die beim DropDown angezeigt wird. Es kann kein separates Label anzeigen. Also: wenn Du den Eintrag, der momentan angezeigt wird (weil er irgendwann vorher mal ausgewählt worden ist) nicht in der Liste haben willst, geht das nur dann, wenn er auch in dem Feld, welches die aktuelle Auswahl anzeigt, nicht mehr erscheinen soll.

DOP3 F!$H hat folgendes geschrieben:
Es klappt soweit richtig, nur wenn ich einen Eintrag ändern will, so wird beim DropDown der ausgewähte Eintrag nicht angezeigt. Wenn ich beim DropDown keinen Eintrag asuwähle so wird leider keiner mehr angezeigt.

Ich glaube nicht, dass man ersteres irgendwie ändern kann. Letzteres war das, von dem ich sagte, dass man es wahrscheinlich mit der richtigen Kombination von Ereignisbehandlungen lösen kann.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 11.12.02 21:17 
Zitat:
Wo? Kann sein, daß es in der 6'er oder 7'er Version möglich ist im OI ItemIndex einzustellen. In der 3'er und 5'er kann man das nicht.
:oops: Sorry, wusste nicht, dass es auch Versionen gibt, bei denen das nicht geht!

Zitat:
Das könnte dein Lehrer auch bemerken und dich dannach fragen.
Könnte zwar sein, glaub ich aber eher nicht. Der konnte sich nicht genau vorstellen, wie ich denn die Enigma proggen wollte! :P

Zitat:
Ich glaube nicht, dass man ersteres irgendwie ändern kann.
In meinem Enigma-Prog hab ich das ComboBox-Ereignis OnChange benutzt und da funktioniert die Anzeige des momentan ausgewählten Wertes.

Ich habe allerdings bei meiner Enigma das Problem, dass ich bei Auswahl einer Walze diese ausgewählte Walze, die eigentlichen einen String darstellt, in die Variable Walze1 kopierern muss.
Nur wenn ich nun ein Item aus einen ComboBox lösche, so ändert sich ja auch die "Zahl", die das Item repräsentiert.
Beispiel:

In der ComoBox1 sind folgende Items aufgelistet:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Walze Nr. I
Walze Nr. II
Walze Nr. III
Walze Nr. V
Walze Nr. VI
Walze Nr. VIII
I wird in ComboBox1 "verwendet", IV in ComboBox2 und VII in ComboBox3.
Wenn ich jetzt aber Walze Nr. VI auswählen will, so heisst das (wie es eigentlich funktionieren müsste), dass in ComboBox1 das Item "Walze Nr. I" durch "Walze Nr. VI" ersetzt wird. Zusätzlich wird dann aus
ausblenden Quelltext
1:
2:
3:
4:
AlleWalzen :  String = 'EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE
                        BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB
                        VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW
                        NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV'
der passende Abschnitt für "Walze Nr. VI" gesucht wird. Dies geschieht durch
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.WalzenAuswahl(Sender: TObject);
var i : Integer;
begin
  AlleReflektoren := 'YRUHQSLDPXNGOKMIEBFZCWVJATFVPJIAOYEDRZXWGCTKUQSBNMHL';
  AlleWalzen := 'EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE
               BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB
               VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW
               NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV';

  if TComboBox(Sender).Name = 'AuswahlReflektor' then 
   for i := 1 to 26 do Reflektor[i] := AlleReflektoren[i + 26 * AuswahlReflektor.ItemIndex];

  if TComboBox(Sender).Name = 'AuswahlWalze1' then begin
   for i := 1 to 26 do Walze1[i] := AlleWalzen[i + 26 * AuswahlWalze1.ItemIndex];
  end;
  if TComboBox(Sender).Name = 'AuswahlWalze2' then begin
  for i := 1 to 26 do Walze2[i] := AlleWalzen[i + 26 *  AuswahlWalze2.ItemIndex];
  end;
  if TComboBox(Sender).Name = 'AuswahlWalze3' then begin
  for i := 1 to 26 do Walze3[i] := AlleWalzen[i + 26 *  AuswahlWalze3.ItemIndex];
  end;
end;
Der eigentlich richtige Abschnitt zu Walze Nr. VI ist JPGVOUMFYQBENHZRDKASXLICTW aber weil VI in ComboBox1 an 5. Position (ItemIndex = 4). Deshalb wird - durch meine Prozedur bedingt - für VI der Abschnitt ESOVPZJAYQUIRHXLNFTGKDCMWB (was der Walze Nr. IV entspricht!) ausgesucht.

Daher weiss ich nicht, wie ich das ohne neue Variablen richtig hinkriegen kann.
Eigene Werte sind durch csDropDownList nicht möglich.
In meinem Programm funktioniert die anzeige des momentan ausgewählten Items bei DropDown und wenn ich nichts auswähle, so wird das zuletzt ausgewählte Item weiterbenutzt.

Könbnt ihr mir da helfen, wie ich (ihr) das gescheid hinkriegen kann (könnt)?
Hoffe, ihr seid noch mitgekommen, sonst einfach fragen!
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!