Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - CheckListBox - Edit auf Position der markierten Zeile


galagher - Mo 24.04.06 22:13
Titel: CheckListBox - Edit auf Position der markierten Zeile
Hallo!

Ich habe wieder eine Frage an euch. Ich selektiere ein Item in einer CheckListBox und möchte nun, dass man den Text in einem Edit bearbeiten kann. Dazu möchte ich das Edit genau über die markierte Zeile legen. Wie errechne ich die X - und Y-Position dieser Zeile?

Das Edit erreicht man über ein Popup-Menü.
Ich habe versucht, mit ScreenToClient(PopupMenu1.PopupPoint).X und ScreenToClient(PopupMenu1.PopupPoint).Y weiter zu kommen, ist aber nicht zufriedenstellend.


Lannes - Di 25.04.06 00:12

Hallo,

versuchs mal damit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var aRect : TRect;
    aPoint : TPoint;
begin
  aRect := CheckListBox1.ItemRect(CheckListBox1.ItemIndex);
  aPoint.x := aRect.Left;
  aPoint.y := aRect.Top;
  aPoint := ScreenToClient(CheckListBox1.ClientToScreen(aPoint));
  aRect.Bottom := aRect.Bottom-aRect.Top+aPoint.Y;
  aRect.Right := aRect.Right-aRect.Left+aPoint.x;
  aRect.Left := aPoint.x+16;
  aRect.Top := aPoint.Y;
  Edit1.BoundsRect := aRect;


galagher - Di 25.04.06 18:10

Leider klappt das nicht. Das Edit wird zu tief und zu weit rechts angezeigt; ab dem zweiten Mal stimmt ausserdem die Höhe nicht mehr.

Vielleicht hätte ich folgendes erwähnen sollen:
CheckListBox1 liegt auf einem PageControl (Align := alClient), das PageControl1 wiederum hat Left := 10 und Top := 10, vom linken bzw. oberen Rand von Form1 gemessen.


galagher - Di 25.04.06 19:08

Ich frage jetzt einfach Pixels[Left, Top] ab. Wenn das den Wert $006A240A ergibt, ist es ok. $006A240A entspricht bei meinem PC clHighLight, leider funktioniert es aber mit clHighLight nicht. Das bedeutet, wenn ich irgendwann mal clHighLight einen andere Farbe zuordne, funktioniert mein Programm nicht mehr richtig, weil es ja mit $006A240A arbeitet! Wie kann ich nun clHighLight verwenden?


Lannes - Di 25.04.06 19:10

Hallo,

dann ist es natürlich auch erforderlich das Parent-Control anzugeben:

Delphi-Quelltext
1:
aPoint := TabSheet1.ScreenToClient(CheckListBox1.ClientToScreen(aPoint));                    


weil es sonst mit Form1 rechnet:

Delphi-Quelltext
1:
aPoint := Form1.ScreenToClient(CheckListBox1.ClientToScreen(aPoint));                    


galagher - Di 25.04.06 19:27

user profile iconLannes hat folgendes geschrieben:
dann ist es natürlich auch erforderlich das Parent-Control anzugeben:[/delphi]

Das funktioniert jetzt. Seltsamerweise wird ab dem 2. Ausführen dieses Codes die Höhe zu klein, aber das lässt sich ja anschliessend ändern!

Danke!


Lannes - Di 25.04.06 19:40

Hallo,
user profile icongalagher hat folgendes geschrieben:
...Seltsamerweise wird ab dem 2. Ausführen dieses Codes die Höhe zu klein, aber das lässt sich ja anschliessend ändern!
kann eigentlich nicht an dem Code liegen, hab den Code gerade mehrmals über einen Button ausgeführt, die Höhe des Edits stimmt immer.