Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ComboBox(itemIndex-Farbe)


Major - Mo 01.07.02 19:17
Titel: ComboBox(itemIndex-Farbe)
hi!!!
ich bin neu hier und ein Anfänger was Delphi angeht
so nun zu meinem Problem ich möchte einen ItemIndex
in der ComboBox, der wärend der Laufzeit definiert wird,
farblich hervorheben
wie geht das???

gruß an alle
Major


Klabautermann - Mo 01.07.02 19:26

Willkommen,

ich bin nicht sicher was du meinst?
Wenn du willst, das die Combobox nachdem du einen ItemIndex gesetzt hast zum Aktiven Element wird dann füge diese Ueile ein:

Quelltext
1:
ComboBox1.SetFocus                    

Wenn du den im Editfeld enthaltenden Text Selektieren willst ohne die Box Aktiv zu machen sieht das so aus:

Quelltext
1:
ComboBox1.SelectAll;                    


Wenn du was anderes willst melde dich noch einmal.

Gruß
Klabautermann


Major - Mo 01.07.02 20:07

sorry hab mich wohl etwas verdrigst ausgekehrt
also ich mach einfach mal ein Beispiel
die Combobox bekommt fünf Zahlen zugewiesen
5
4
3 (die zahl soll in eine andere Farbe z.b rot haben)
2
1
bis dann
Major


Klabautermann - Mo 01.07.02 20:25

Achso,

na da fängs du ja gleich mit dem Richtigen Kaliber an ;).

Die Combobox kann soetwas nicht von alleine. Glücklicherweise erlaubt sie dir, ihr die Arbeit abzunehmen.
Dazu must du die Eigenschaft Style auf csOwnerDrawFixed stellen. Dann fügst du im Ereignis OnDrawItem folgenden Code ein:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
  VAR
    aCB : tComboBox;
begin
  IF (Control IS tComboBox) THEN BEGIN
    aCB := tComboBox(Control);
    IF aCB.Items[Index] = '3' THEN
      aCB.Canvas.Font.Color := clRED
    ELSE
      aCB.Canvas.Font.Color := clBlack;
    aCb.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, aCB.Items[Index]);
  END;
end;


und es sollte Klappen ;).

Wenn du Fragen hast, dann weißt du ja wo du sie stellen kannst (aber erst in die Online-Hilfe gucken :shock: )

Gruß
Klabautermann


mathias - Mo 01.07.02 21:24

In diesen FAQ Beitrag hat es auch sowas ähnliches.
http://www.auq.de/viewtopic.php?t=147 :)


Major - Di 02.07.02 08:42

hi!!!
dank dir erst mal für die schnelle Antwort, ich hab’s genauso gemacht, aber so wie ich das sehen kann bewirkt es nur eine Veränderung
der Farbdarstellung, wenn der Markierungsbalken darüber steht.


Tino - Di 02.07.02 09:03

Major hat folgendes geschrieben:
aber so wie ich das sehen kann bewirkt es nur eine Veränderung der Farbdarstellung, wenn der Markierungsbalken darüber steht.
Und ? :roll:


Klabautermann - Di 02.07.02 09:39

Hast du Style auf csOwnerDrawFixed stehen?

Bei mir klappt es nämlich. Oder beziehst du dich auf das FAQ?

Gruß
Klabautermann


Major - Di 02.07.02 10:27

hallo
ja, Style steht auf csOwnerDrawFixed
kann es daran liegen:
die Items werden erst wärend der Laufzeit erstellt
und das geschiet in der Unit1, die ComboBox ist
aber in der Unit2 ??

Gruß
Major


Klabautermann - Di 02.07.02 10:44

Hi,

dan bin ich überfragt.
Ich habe dir mal ein [url=http://www.oitmann.de/prob/BuntCombo.zip]Beispielprojekt[/url] ins Netzt gespielt.
Gucke dir bitte zuerst an wie sich die EXE verhält, und dann ob sich das verhalten nach neucompilieren änder (wegen unterschiedlicher DELPHI Version). Wenn es so bleibt kann dir das ganze als Experimeniergrundlage dienen. Denn ich wüsste nicht wodran es liegen könnte.

Gruß
Klabautermann


Major - Di 02.07.02 11:22

ich schau mir das gleich mal an
du hast recht, dein beispiel funktioniert wenn
ich über die Eigenschaft Items welche hinzufüge
also Items "statisch" vorhanden sind, daß ist bei
meinem Projekt aber nicht der Fall weil sie "dynamisch" sind
naja, ich dank dir für deine Gedult und hoffe das ich
mit deinem Projektbeispiel weiterkomme

bis dann
Major


Major - Di 02.07.02 12:55

@Klabautermann
man bin ich blööööd du hast natürlich die richtige Antwort zu meiner
falschen Frage gegeben sorry,
ich muß mein Beispiel abändern das ganze ist doch komplizierter als ich
dachte...
so, und jetzt die neue Frage

1. es findet eine Berechnung statt

2. das Ergebnis der Berchnung lass ich vergleichen mit diesem array

Quelltext
1:
2:
kv1: array[1..23]of real=(0.025,0.04,0.063,0.1,0.25,0.4,0.63,1.0,1.6,
2.5,4.0,6.3,10.0,16,25.0,40.0,63.0,100.0,160,250.0,360,400.0,630.0);

3. die Berechnung und Wahl des wertes der rot hervorgehoben werden soll

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
        kvs:= (mar/1000)*sqrt(1/p1);         
        indexko:= 24;
        sk:= 0;

        for ik:= 1 to 23 do begin
            if kvs = kv1[ik] then sk:= ik;
        end;

        for ik:= 23 downto 1 do begin
            if kvs < kv1[ik] then indexko:= ik;
        end;

        if sk > 0 then begin
           kvs1:= kv1[sk];            
        end;

        if sk = 0 then begin
           kvs1:= kv1[indexko];
        end;

Form2.combobox1.Items.Add(formatfloat('0.000',kvs1));

z.b. Ergebnis der Berechnung=0.063
dann steht in die Combobox kommt nun 0.063
ist das Ergebnis = 0.05 dann steht in der Combobox der nächst höhere
Wert in dem Fall auch 0.063 so der Wert(kvs1), der aus der Berechnung zugewiesen wird, soll nun immer eine Rote Farbe haben

4. zuzüglich stehen in der Combobox noch die beiden nächst größeren
werte aus dem array und die beiden nächst kleineren werte(wenn es welche gibt)

das funktioniert auch alles, wie gesagt ich möchte jetzt farblich den Wert
aus Punkt 3. hervorheben lassen

jo, das ist nun mein Problem



Gruß
Major

Code-Tags hinzugefügt. Tino


Klabautermann - Di 02.07.02 14:00

Hallo noch einmal,

Dann musst du im grunde nur die Zeile

Quelltext
1:
IF aCB.Items[Index] = '3' THEN                    

aus meinem Beispiel ensprechend anpassen.
Du füllst die Werte ja sicherlich ähnlich wie der Knopf in meinem Beispiel in die Combo Box, nur das die Inhalte etwas komplizierter ermittelt werden.
Du hast sicherlich auch eine Funktion die dir den Wert ermittelt, welcher hervorgehoben werden muss.
Das ganze musst du dann urnoch richtig zusammenbauen. Ungefer so:

Quelltext
1:
IF aCB.Items[Index] = FloatToStr(BerechneWert) THEN                    


Ein wenig hört sich das bei dir so an als sollte immer der 3te Wert in der List markiert werden. In dem Fall währe die Bedingund natürlich sehr einfach

Quelltext
1:
IF Index = 2 THEN                    


Gruß
Klabautermann


Major - Di 02.07.02 18:42

@Klabautermann
die Firma dankt