Ich habe jetzt mal in den letzten Stunden noch ein wenig herumexperimentiert, dabei zwar nicht die Lösung des eigentlichen Problems für das ItemIndex-Phänomen gefunden, aber immerhin einen "Königsweg", der das Problem zumindestens löst (ACHTUNG: die folgenden Code-Beispiele sind nur aktualiserte oder NEU hinzugekommene Code-Schnipsel, die noch in das erste Script eingefügt/aktualisiert werden müßten):
1. In der Unit1 zusätzlich wurde ein Record erstellt, welches mir von allen dynamisch erzeugten Comboboxen die ItemIndex- Werte speichern soll, die angesprochen werden. Diese Werte werden dann via einem Timer, der sofort nach dem Create der Form1 gestartet und beendet wird via der Unit2 ausgeführt
Delphi-Quellcode:
Type
TarrRunTimeComboDefault = record
x1 : integer;
x2 : integer;
ItemIndex : integer; //DIESER WERT BEINHALTET DEN ANZUSPRECHENDEN ITEMINDEX !!!
end;
//..
var arrRunTimeComboDefault : array of TarrRunTimeComboDefault;
//..
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled := false;
unit2.ButtonsErstellen_ComboDefault;
end;
2. In der UNIT2 wurden dann folgende Prozeduren eingefügt / aktualisiert
Delphi-Quellcode:
procedure ButtonsErstellen(Sender:TObject);
var xEdit,x,xArrCombo,hoehe,edtLaenge : integer;
begin
x := 0;
hoehe := 20;
edtLaenge := 100;
//HILFSARRAY setzen und initialisieren (Standard 100 DS)
xArrCombo :=-1;
SetLength(unit1.arrRunTimeComboDefault,100);
for xEdit := 0 to 2 do
begin
RunTimeCombo[xEdit,x] := TEnhComboBox.Create(Form1);
with RunTimeCombo[xEdit,x] do
begin
Parent := Form1;
Style := csOwnerDrawFixed;
Top := (Hoehe+2) + (45*(x+1));
Tag := x+1;
TagParam := xEdit;
Width := edtLaenge;
Left := 160 + ((edtLaenge+5)*(xEdit));
enabled:= true;
visible := true;
RunTimeCombo[xEdit,x].Items.Add('A|AAAA'+inttostr(xEdit));
RunTimeCombo[xEdit,x].Items.Add('B|BBBB'+inttostr(xEdit));
RunTimeCombo[xEdit,x].Items.Add('C|CCCC'+inttostr(xEdit));
OnDrawItem := Form1.ComboBoxDrawItem;
OnDropDown := Form1.RunTimeEditClick;
if unit1.RunTimeCombo[xEdit,x].Items.Count > 0 then
begin
unit1.RunTimeCombo[xEdit,x].Perform(CB_SETDROPPEDWIDTH,400,0);
unit1.RunTimeCombo[xEdit,x].DroppedDown := true;
unit1.RunTimeCombo[xEdit,x].DroppedDown := false;
//HIER WERDEN DIE ERSTELLTEN COMBOBOXEN IN DAS HILFSARRAY DER UNIT1 GESCHRIEBEN
inc(xArrCombo);
unit1.arrRunTimeComboDefault[xArrCombo].x2 := xEdit;
unit1.arrRunTimeComboDefault[xArrCombo].x1 := x;
unit1.arrRunTimeComboDefault[xArrCombo].ItemIndex := 0; //oder andere Werte
end;
end;
end;
//wenn alles erstellt dann schneide arrCombo auf eigentliche Länge ab
SetLength(unit1.arrRunTimeComboDefault,xArrCombo+1);
end;
procedure ButtonsErstellen_ComboDefault;
var x : integer;
begin
for x:= 0 to high(unit1.arrRunTimeComboDefault) do
begin
RunTimeEditX2 := arrRunTimeComboDefault[x].x2;
RunTimeEditX1 := arrRunTimeComboDefault[x].x1;
RuntimeCombo[unit1.RunTimeEditX2 ,unit1.RunTimeEditX1].ItemIndex :=
arrRunTimeComboDefault[x].ItemIndex;
end;
end;
Das ist wie gesagt noch nicht die Lösung des Problems bringt mich aber zu genau dem Ergebnis, was für mich gewünscht ist.
Uwe R.