Autor Beitrag
NeoXan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

WinXP Sp1 Home
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mi 03.09.03 15:55 
Hi nochmal,

zu deiner anderen Frage (hab ich übersehen): ja, einfach den ItemIndex im OnClick abfragen:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

WinXP Sp1 Home
D7 Prof
BeitragVerfasst: Mi 03.09.03 15:57 
hmm, wie geht denn das mit TControl...wenn überhaupt...

ausblenden Delphi-Quelltext
1:
lbRon.ControlAtPos(p, true);					

Was aber nun TControl und kein Integerwert ist...ich benutze die TFlatListBox
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

WinXP Sp1 Home
D7 Prof
BeitragVerfasst: 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...
ausblenden volle Höhe Delphi-Quelltext
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 <> nilthen
    for I := FWinControls.Count - 1 downto 0 do
      if GetControlAtPos(FWinControls[I]) then
        Break;
  if (FControls <> niland
     (LControl = nilthen
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

WinXP Sp1 Home
D7 Prof
BeitragVerfasst: 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 :P)
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 04.09.03 09:15 
Hallo!

NeoXan hat folgendes geschrieben:
1. den Border der ListBox farbig macht (steht bestimmt in den Properties :P)

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 Suche in: Delphi-Forum, Delphi-Library 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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:

ausblenden 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;      // <---- Die Border-Farbe
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 04.09.03 20:24 
Hi,

folgendermaßen ändert man die Farbe der Markierung:

ausblenden 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;      // <---- Die Border-Farbe
    Canvas.FillRect(Rect);
    if (odSelected in State) then
    begin
      Canvas.Brush.Color := clSkyBlue; // <---- Farbe der Markierung
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

WinXP Sp1 Home
D7 Prof
BeitragVerfasst: Do 04.09.03 21:11 
kewl, danke :P...

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
ausblenden 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// <---- Farbe der Markierung
      Canvas.Rectangle(Rect.Left+3,Rect.Top+3,Rect.Right-3,Rect.Bottom-3);
    end;