ClientToScreen liefert Punkte ohne Border

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

ClientToScreen liefert Punkte ohne Border

Beitrag von Michl »

Servus,

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;

Habe ich einen Denkfehler?
Wie verhält sich dies unter Linux?

Beispielsnapshot und Testprogramm anbei.
Dateianhänge
example.png
example.png (7.49 KiB) 1154 mal betrachtet
ClientToScreen.zip
(2.89 KiB) 79-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ClientToScreen liefert Punkte ohne Border

Beitrag von wp_xyz »

Oje, ich denke, da hast du ins Wespennest getroffen:
Zuletzt geändert von wp_xyz am Sa 21. Mai 2016, 00:46, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ClientToScreen liefert Punkte ohne Border

Beitrag von wp_xyz »

Oje, ich denke, da hast du ins Wespennest getroffen: Linux Mint gtk2
gtk2.png
und qt
qt.png

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: ClientToScreen liefert Punkte ohne Border

Beitrag von Michl »

Oha, und ich dachte, die Controls, die unter Windows ein falsches Ergebnis zurückliefern, wären ein Problem.

Werde heute abend ein Bugreport dazu aufmachen.

Aber erstmal vielen Dank für die Info!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: ClientToScreen liefert Punkte ohne Border

Beitrag von Michl »

Hallo wp,

ich habe nochmal eine Weile darüber nachgedacht und festgestellt, dass dies ein Denkfehler von mir war. Unter Windows passt das bei den meisten Controls, da ClientToScreen die Koordinate vom Client wiedergibt (https://msdn.microsoft.com/de-de/library/windows/desktop/dd183434%28v=vs.85%29.aspx). Daher muss die Border bei dem Beispiel mit berücksichtigt werden.

Die gewünschte Funktion ist nicht ClientToScreen, sondern ControlToScreen, dann passt das Beispiel hier.

Sorry für die Umstände :oops:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten