habe da ein Problem entdeckt und wollte wissen, wie sich dieses auf anderen Plattformen verhält.
Versuche ich ein Formular an eine Stelle von einem Control zu platzieren, so benötige ich ClientToScreen. Das funktioniert nur bei einigen Controls (z.B. TPanel, TButton). Andere Controls (z.B. TEdit, TMemo) liefern ein Ergebnis ohne Berücksichtigung der Border zurück. Wiederrum andere Controls (z.B. TGroupBox) liefern per LCL ein Ergebnis ohne Border zurück, nutze ich direkt Windows.ClientToScreen, so bekomme ich ein korrektes Ergebnis:
Code: Alles auswählen
procedure TForm1.FormShow(Sender: TObject);
var
aForm: TForm;
i: Integer;
p: TPoint;
WC: TWinControl;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TWinControl then
begin
WC := Components[i] as TWinControl;
p := classes.Point(0, 0);
// windows.ClientToScreen(WC.Handle, p);
p := WC.ClientToScreen(p);
aForm := TForm.CreateNew(Self);
aForm.SetBounds(p.x + WC.Width, p.y, 10, WC.Height);
aForm.Color := clGreen;
aForm.BorderStyle := bsNone;
aForm.FormStyle := fsStayOnTop;
aForm.Show;
end;
end;
Wie verhält sich dies unter Linux?
Beispielsnapshot und Testprogramm anbei.