Autor |
Beitrag |
NeoXan
      
Beiträge: 81
WinXP Sp1 Home
D7 Prof
|
Verfasst: Mi 03.09.03 15:26
heho,
also ich wollte, dass wenn man mit dem MouseCursor über ein Listbox item fährt, dieses automatisch ausgewählt wird...die Click-Action kann ich ja dann mit ItemIndex machen, oder?
Für das andere muss ich das MouseOver Event benutzen, denk ich mir mal...nur wie kann ich jetzt feststellen, über welchem Item sich der Cursor befindet, so dass ich dieses markieren kann...
mfg
NeoXan
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Mi 03.09.03 15:39
Hi,
MouseOver gibts bei einer ListBox nicht. Da musst du mit dem OnMouseMove-Ereigniss arbeiten. Das würde z.B. so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var p: TPoint; index: Integer; begin p.X := X; p.Y := Y; index := ListBox1.ItemAtPos(p, True); ListBox1.ItemIndex := index; end; |
MFG
- Ernesto -
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Mi 03.09.03 15:55
Hi nochmal,
zu deiner anderen Frage (hab ich übersehen): ja, einfach den ItemIndex im OnClick abfragen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.ListBox1Click(Sender: TObject); var i: Integer; begin for i := 0 to ListBox1.Items.Count - 1 do if ListBox1.ItemIndex = i then caption := ListBox1.Items[i]; end; |
MFG
- Ernesto -
|
|
NeoXan 
      
Beiträge: 81
WinXP Sp1 Home
D7 Prof
|
Verfasst: Mi 03.09.03 15:57
hmm, wie geht denn das mit TControl...wenn überhaupt...
Delphi-Quelltext 1:
| lbRon.ControlAtPos(p, true); |
Was aber nun TControl und kein Integerwert ist...ich benutze die TFlatListBox
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Mi 03.09.03 16:00
Hi,
funktioniert mein Code, oder nicht? Und wenn nicht, welcher Fehler wird ausgegeben? Besitzt die FlatListBox eine Methode namens ItemAtPos? Ich kenne diese Komponente nicht.
MFG
- Ernesto -
|
|
NeoXan 
      
Beiträge: 81
WinXP Sp1 Home
D7 Prof
|
Verfasst: Mi 03.09.03 16:43
Joah, dein Code funzt 100%ig (danke!)...mit dem normalen ListBox
Nein die TFlatListBox besitzen so etwas leider net :/, obwohl ich jetzt schon eigentlich die mehr oder weniger neueren besitzen müsste (die Site ist ja offline)
Ich habe halt nur etwas ähnliches in der TFlatListBox gefunden...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function TWinControl.ControlAtPos(const Pos: TPoint; AllowDisabled, AllowWinControls: Boolean): TControl; var I: Integer; P: TPoint; LControl: TControl; function GetControlAtPos(AControl: TControl): Boolean; begin with AControl do begin P := Point(Pos.X - Left, Pos.Y - Top); Result := PtInRect(ClientRect, P) and ((csDesigning in ComponentState) and (Visible or not (csNoDesignVisible in ControlStyle)) or (Visible and (Enabled or AllowDisabled) and (Perform(CM_HITTEST, 0, Longint(PointToSmallPoint(P))) <> 0))); if Result then LControl := AControl; end; end; begin LControl := nil; if AllowWinControls and (FWinControls <> nil) then for I := FWinControls.Count - 1 downto 0 do if GetControlAtPos(FWinControls[I]) then Break; if (FControls <> nil) and (LControl = nil) then for I := FControls.Count - 1 downto 0 do if GetControlAtPos(FControls[I]) then Break; Result := LControl; end; |
Als ich versuchte ItemAtPos selbst hinzuzufügen gab es diverse Error msg's...
Apro pos Error...also ItemAtPos gibt es net, bei ControlAtPos kommt natürlich "Inkompatible Typen...Integer und TControl"
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Mi 03.09.03 16:56
Hi,
ControlAtPos() gibt es bei der normalen ListBox auch und dient dazu untergeordnete Komponenten zu ermitteln. Also kannst du das nicht gebrauchen. Aber vielleicht kannst du dich auch mit der Standart-ListBox anfreunden. Wenn du da die Eigenschaft Ctl3d auf False stellst hat sie auch einen flachen Rahmen.
MFG
- Ernesto -
|
|
NeoXan 
      
Beiträge: 81
WinXP Sp1 Home
D7 Prof
|
Verfasst: Do 04.09.03 07:17
hmmm...dann müsste ich nur noch wissen, wie man
1. den Border der ListBox farbig macht (steht bestimmt in den Properties  )
2. die markierung des ausgwählten Items farbig machen und
3. den Border der Markierung des ausgewählten Items auch farbig machen...
mit Owner Draw, oder? Nur wie... :/
mfg
NeoXan
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Do 04.09.03 09:15
Hallo!
NeoXan hat folgendes geschrieben: | 1. den Border der ListBox farbig macht (steht bestimmt in den Properties ) |
Dann schau dir doch mal die Eigenschaften an wenn du schon weißt wo du so etwas finden kannst. Aber so eine Eigenschaft gibt es leider nicht.
NeoXan hat folgendes geschrieben: | 2. die markierung des ausgwählten Items farbig machen |
Das markierte Item wird doch so wie so schon in einer anderen Farbe dargestellt. Nämlich so wie der User es in den Darstellungsoptionen des Desktop eingestellt hat. Aber wenn du trotzdem die Farbe ändern möchtest musst du das über das Event ONDRAWITEM machen. Beispiel findest du einige hier im Forum.
NeoXan hat folgendes geschrieben: | den Border der Markierung des ausgewählten Items auch farbig machen... |
Ob das auch mit dem OnDrawItem Event funktioniert weiß ich leider nicht.
Gruß
Tino
Zuletzt bearbeitet von Tino am Do 04.09.03 10:15, insgesamt 1-mal bearbeitet
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 04.09.03 10:05
Hi,
die Border-Farbe kriegst du folgendermaßen hin: BorderStyle der ListBox auf bsNone stellen, und Style auf lbOwnerDraxFixed stellen, dann folgenden Code ins OnDrawItem-Ereignis schreiben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var r: TRect; begin r := ListBox1.ClientRect; with ListBox1 do begin Canvas.Pen.Color := clRed; Canvas.FillRect(Rect); Canvas.Brush.Style := bsClear; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, Items[Index]); Canvas.Rectangle(r); end; end; |
Das mit den markierten Items hab ich noch nicht ausprobiert aber vielleicht schick ich dir hierzu nachher ein Beispiel, wenn ich Zeit habe.
MFG
- Ernesto -
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 04.09.03 20:24
Hi,
folgendermaßen ändert man die Farbe der Markierung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var r: TRect; begin r := ListBox1.ClientRect; with ListBox1 do begin Canvas.Pen.Color := clMaroon; Canvas.FillRect(Rect); if (odSelected in State) then begin Canvas.Brush.Color := clSkyBlue; Canvas.Rectangle(Rect); end; Canvas.Brush.Style := bsClear; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, Items[Index]); Canvas.Rectangle(r); end; end; |
MFG
- Ernesto -
|
|
NeoXan 
      
Beiträge: 81
WinXP Sp1 Home
D7 Prof
|
Verfasst: Do 04.09.03 21:11
kewl, danke  ...
hmm, der Markierung selbst noch einen Border zu geben geht net, oder?
also, dass man sie sieht...so sieht man ja nur so eine Art Trennstrich zwischen den beiden Items...
mfg
NeoXan
Ok, hab jetzt alles hinbekommen....danke nochmal
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if (odSelected in State) then begin Canvas.Brush.Color:= $00FFFFFF; Canvas.FillRect(Rect); Canvas.Brush.Color := $00FDF9F7; Canvas.Rectangle(Rect.Left+3,Rect.Top+3,Rect.Right-3,Rect.Bottom-3); end; |
|
|