Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Auswahl der Checklistbox


Kurdt67 - Mo 28.02.05 22:26
Titel: Auswahl der Checklistbox
Hi! Mal ne Frage : Ich hab ne Checklistbox und ich will nur AKZEPTIEREN wenn der Benutzer auch ein häkchen macht! nun hab ich gemerkt, das man auch nur die stringzeile anklicken kann (die blaue) ohne das dann das häkchen aktiviert ist, jedoch wird dann auch akzeptiert das diese Zeile ausgewählt ist!! Kann ich das verhindern??? :?:
Und gleich noch ne Frage! Wie angesprochen färbt sich eine Zeile ja so blau, kann ich das ändern, und die z.B. Grau machen? Wenn ja wie? :roll:
DANKE EUCH... :roll:


retnyg - Mo 28.02.05 22:28

wenn du nicht willst dass ein click auf den text deiner checkbox das teil ein/ausschaltet verwende halt ein label für deinen text und die caption der checkbox stellst du auf ''


cartridge - Mo 28.02.05 22:32

Hi!

Ich weiß ja nicht worauf Du geprüft hast. Du musst jedoch auch Checed über eine Schleife prüfen!

Gruß
Ingo


Dominique - Mo 28.02.05 22:46

retnyg hat folgendes geschrieben:
wenn du nicht willst dass ein click auf den text deiner checkbox das teil ein/ausschaltet verwende halt ein label für deinen text und die caption der checkbox stellst du auf ''


hat er nicht CHECKLISTBOX geschrieben???


zu frage 1:
cartridge hat folgendes geschrieben:
Hi!

Ich weiß ja nicht worauf Du geprüft hast. Du musst jedoch auch Checed über eine Schleife prüfen!

Gruß
Ingo


zu frage 2:

setze die Eigenschaft "Style" auf "lbOwnerDrawFixed" und Zeichne im OnDrawItem-Ereignis neu:

Delphi-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.CheckListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  if Control is TCheckListBox then
  begin
    TCheckListBox(Control).Canvas.FillRect(Rect);
    if (odSelected in State) then
      with TCheckListBox(Control).Canvas do
      begin
        Pen.Style := psClear;
        Brush.Style := bsSolid;
        Brush.Color := clSilver;
        FillRect(Rect);
        Font.Color := clWindow;
      end
    else
      TCheckListBox(Control).Canvas.Font.Color := clMoneyGreen;
    DrawText(TCheckListBox(Control).Canvas.handle,
      pChar(TCheckListBox(Control).Items[Index]),
      Length(TCheckListBox(Control).Items[Index]), Rect, DT_SINGLELINE);
  end;
end;


mit den Farben und Linienstilen (Brush.Style) kannst du nach belieben herumspielen


Kurdt67 - Mo 28.02.05 22:49

@ cartridge : jo, ich hab mit ner FOR-schleife geprüft, ob checklistbox1.checked[i] true
ist. er akzeptiert das aber auch so...
@ retnyg : das geht nicht mit dem label bei mir, weil ich jetzt das programm schon so geschrieben hab, das er das in die listbox schreibt!!! dann muss ich soviel ändern!!!


retnyg - Mo 28.02.05 23:00

im normalfall führt das clicken auf einen text nicht zu einem check-vorgang

also wenn du auf checked prüfst müsste das auf jeden fall gehen. bedenke aber dass die numerierung der items einer listbox mit 0 beginnt und nicht mit 1 !
also nicht ...checked[i] sondern ...checked[i-1]


Kurdt67 - Mo 28.02.05 23:11

SORRY @ retnyg : ich hatte doch als eigenschaft SELECTED, du hast recht ich hab jetzt checked genommen, jetzt gehts einwandfrei!!

Bloß mit den farben komm ich net klar, ist ganz schön schwer... :oops:


Dominique - Mo 28.02.05 23:15

Kurdt67 hat folgendes geschrieben:
Bloß mit den farben komm ich net klar, ist ganz schön schwer... :oops:


ist ganz schön Bunt würde ich sagen :lol:

wo hakt es denn? den Source von oben kannst du praktsch 1:1 übernehmen

nur die Style-Property nicht vergessen (lbOwnerDrawFixed")


Kurdt67 - Mo 28.02.05 23:25

ok soll ichs wirklich wagen?? ich probiers mal, also es geht los : :wink:
zu "checkListBox2DrawItem" sagt er undefinierter bezeichner.
meine checklist heißt aber 2!!!!! muss da noch nen punkt zwischen?
dann gehts weiter : undefin. bezeichern "control",
[Fehler] Unit1.pas(225): Operator ist auf diesen Operandentyp nicht anwendbar
[Fehler] Unit1.pas(227): Es gibt keine überladene Version von 'Rect', die man mit diesen Argumenten aufrufen kann
[Fehler] Unit1.pas(228): Undefinierter Bezeichner: 'State'
[Fehler] Unit1.pas(234): Es gibt keine überladene Version von 'Rect', die man mit diesen Argumenten aufrufen kann
[Fehler] Unit1.pas(240): Undefinierter Bezeichner: 'Index'
[Fehler] Unit1.pas(241): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
[Fehler] Unit1.pas(40): Ungenügende Forward- oder External-Deklaration: 'TForm1.FormCreate'

Und jetzt schlagt mich bitte net zusammen!!! :wink:


Dominique - Mo 28.02.05 23:30

Kurdt67 hat folgendes geschrieben:
ok soll ichs wirklich wagen?? ich probiers mal, also es geht los : :wink:
zu "checkListBox2DrawItem" sagt er undefinierter bezeichner.

das ist ein ereignis, also im Objektinspektor (vorher deine checklistbox2 markieren!)
auf das register "Ereignisse" und dann einen doppelklick neben "OnDrawItem"


Kurdt67 hat folgendes geschrieben:

meine checklist heißt aber 2!!!!! muss da noch nen punkt zwischen?
dann gehts weiter : undefin. bezeichern "control",
[Fehler] Unit1.pas(225): Operator ist auf diesen Operandentyp nicht anwendbar
[Fehler] Unit1.pas(227): Es gibt keine überladene Version von 'Rect', die man mit diesen Argumenten aufrufen kann
[Fehler] Unit1.pas(228): Undefinierter Bezeichner: 'State'
[Fehler] Unit1.pas(234): Es gibt keine überladene Version von 'Rect', die man mit diesen Argumenten aufrufen kann
[Fehler] Unit1.pas(240): Undefinierter Bezeichner: 'Index'
[Fehler] Unit1.pas(241): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
[Fehler] Unit1.pas(40): Ungenügende Forward- oder External-Deklaration: 'TForm1.FormCreate'

Und jetzt schlagt mich bitte net zusammen!!! :wink:


der rest sind folgefehler, ausser, dass du die deklaration von FormCreate wohl mal von hand gelöscht hast


Kurdt67 - Mo 28.02.05 23:38

uppps, stimmt ja...
ok jetzt geht es wunderbar :D
DANKE AN Dominique!!!!!!


Dominique - Mo 28.02.05 23:43

Kurdt67 hat folgendes geschrieben:
uppps, stimmt ja...
ok jetzt geht es wunderbar :D
DANKE AN Dominique!!!!!!


:oops: ähmmm, schon ok... hoffentlich springen dir meine farben nicht zu sehr in's auge


Kurdt67 - Mo 28.02.05 23:48

ne die farben fetzen schon :wink: