Autor Beitrag
der_ich
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Do 02.02.06 17:56 
hi

ich habe eine checklistbox erstellt, mit daten gefüllt, doch soll immer nur ein haken setzbar sein

mein versuch:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for x:=0 to checklist.Items.Count-1 do
  if checklist.Checked[x] then

    for y:=0 to checklist.Items.Count-1 do
      if (checklist.Checked[y]=true) and (y<>x) then
         checklist.Checked[y]:=false;


wird auch wunderbar durchlaufen, wenn ich ein haken nach oben setze
wenn ich aber einen darunter setzen will wird der wieder gelöscht (laut queltext logisch)

ich hatte schon überlegt mit gettime denjenigen haken zu bestmmen, der als erster gesetzt wurde, doch das ist ziemlich doof, wenn man schnell klickt

hat jemand eine vernünftige idee?

thx

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconGausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 02.02.2006 um 18:01
JayK
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1013



BeitragVerfasst: Do 02.02.06 18:06 
Kann man nicht bei OnClick des Checklistbox herausfinden, auf welches Item geklickt wurde? Dann könntest du einfach alle Items unchecken und den Haken wieder im Code an das Item setzen, auf das geklickt wurde.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 02.02.06 18:09 
Muss es denn ne CheckListBox sein, oder geht auch ne RadioGroup?

Ansonsten würde ich die Eigenschaft Tag der Checklistbox dafür nehmen: Im Tag wird immer der Index des markierten Items gespeichert. Wird ein Item gecheckt (Ereignis OnClickCheck), dann wird das Item mit entsprechendem Index unchecked, und der Tag auf das neu gecheckte Item gesetzt.

Das geht so natürlich nicht, wenn die Anzahl der Items zur Laufzeit verändert werden kann....

_________________
We are, we were and will not be.
der_ich Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Do 02.02.06 18:15 
nee muss schon ne checkbox sein
und die daten werden zur laufzeit ständig geändert

ich hab mal das probiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for x:=0 to kaufliste_checklist.Items.Count-1 do
   if kaufliste_checklist.Checked[x] then hilf:=x;

for x:=0 to kaufliste_checklist.Items.Count-1 do
  kaufliste_checklist.Checked[x]:=false;

kaufliste_checklist.Checked[hilf]:=true;


mm aber irgendwie ist ein knick in der leitung - das geht nicht

Moderiert von user profile iconGausi: Folgepost gelöscht und hier reineditiert.
Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
JayK
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1013



BeitragVerfasst: Do 02.02.06 20:46 
1. es gibt etwas, das nennt sich Edit-Funktion ;-)
Das ist dieser Button an deinem Post: user defined image
Moderiert von user profile iconGausi: Hab ich mal erledigt...

2. rücke mal bitte anständig (in deinem Fall gleichmäßig) ein. Hinter then einen Zeilenumbruch und die bedingte Ausführung (das danach) eingerückt.

3. ist klar, das es nicht geht: bei dem ersten Item wird gleich dafür gesorgt, dass alle Items ungecheckt werden. Du musst zuerst eine Schleife durchlaufen, in der nur das Item ermittelt wird, das als einziges gecheckt werden soll, anschließend alle Items unchecken und zum Schluss nur das eine Item wieder checken.
Wenn du weitere Hilfe dabei brauchst, dann sag Bescheid ;-)
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Do 02.02.06 23:14 
Naja, du könntesz es ja so machen:

Da gibts ne Funktion namens TCheckListBox.ItemAtPos
Der übergibst du die Mauskoordinaten (ich glaub, da musst noch mit ScreenToClient du Koordinaten konvertieren) und bekommst das Item zurück.
Vllcht hilft dir das etwas weiter

_________________
Programmers never die, they just GOSUB without RETURN
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 02.02.06 23:25 
Hallo,
user profile iconJayK hat folgendes geschrieben:
...Du musst zuerst eine Schleife durchlaufen, in der nur das Item ermittelt wird, das als einziges gecheckt werden soll...
das ist IMHO nicht nötig da man(wie Gausi schrieb) im OnClickCheck der CheckListBox das betreffende Item ermitteln kann:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if CheckListBox1.checked[CheckListBox1.ItemIndex] then
  showmessage('Item '+IntToStr(CheckListBox1.ItemIndex)+' wurde gecheckt')
  else 
    showmessage('Item '+IntToStr(CheckListBox1.ItemIndex)+' ist jetzt ungecheckt');

Zu dem Lösungsvorschlag von Gausi mit der Tag-Eigenschaft:
Auch wenn Einträge hinzugefügt oder gelöscht werden ist es möglich.
Man muss dann halt, wenn Einträge vor dem Gechecked-Item eingefügt oder gelöscht werden,
die gesetzte Tag-Eigenschaft um 1 erhöhen oder erniedrigen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )