Einzelnen Beitrag anzeigen

ruedigeruwe

Registriert seit: 19. Okt 2006
7 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Problem: ComboBox über 2.Unit wird nicht korrekt dargest

  Alt 7. Apr 2008, 15:50
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.
  Mit Zitat antworten Zitat