Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WM_SIZE löst nicht aus (https://www.delphipraxis.net/208810-wm_size-loest-nicht-aus.html)

Carsten Hölscher 16. Sep 2021 10:11

WM_SIZE löst nicht aus
 
Ich wollte mir eine kleine Komponente schreiben, die einen Dateinamen ggf. verkürzt anzeigt, wenn der Label zu schmal ist.
Wenn das Formular vergrößert wird, soll der Name neu berechnet werden, um sich an die neue Breite des Labels anzupassen.
Nach meinem Verständnis müßte das unten funktionieren, allerdings wird TLabelDateiname.WMSize(var Message: TWMSize); nicht aufgerufen, wenn ich das Fenster vergrößere (der Label ist recht sund links verankert), das beep ist zum Testen, wann die procedure ausgeführt wird.
Wenn ich in der Anwendung das OnResize-Event des Labels abfrage, dann wird das ausgeführt.
Hat jemand eine Idee (Delphi 10.4.2)?


Code:
unit LabelDateiname;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, FileCtrl, Messages;

type
  TLabelDateiname = class(TLabel)
  private
    { Private-Deklarationen }
    FDateiname:string;
    procedure SetzeDateiname(s:string);
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
    property Dateiname:string read FDateiname write SetzeDateiname;
    property OnResize;
  end;

procedure Register;

implementation

procedure TLabelDateiname.WMSize(var Message: TWMSize);
begin
  inherited;
  beep;
  Caption:=MinimizeName(FDateiname, canvas, Width);
end;

procedure TLabelDateiname.SetzeDateiname(s:string);
begin
  Caption:=MinimizeName(s, canvas, Width);
  FDateiname:=s;
end;


procedure Register;
begin
  RegisterComponents('Eigenes', [TLabelDateiname]);
end;

end.
Carsten

Bernhard Geyer 16. Sep 2021 10:17

AW: WM_SIZE löst nicht aus
 
AFAIK ist TLabel ein Control das nicht auf einem WinAPI-Control aufsetzt.
D.h. die normalen Windows-Events werden nicht funktionieren.

Entweder auf TStaticLabel umbauen oder das OnResize nutzen.
AFAIK nicht OnResize als Event nehmen, sondern es müsste ein DoResize als Methode zum überladen geben.

jaenicke 16. Sep 2021 10:30

AW: WM_SIZE löst nicht aus
 
Zitat:

Zitat von Carsten Hölscher (Beitrag 1494952)
Wenn ich in der Anwendung das OnResize-Event des Labels abfrage, dann wird das ausgeführt.

In solchen Fällen ist es am einfachsten dort dann einen Haltepunkt zu setzen und ganz einfach im Stacktrace zu schauen wo das Ereignis ausgelöst wird und wie man dort eingreifen kann.

Zum Thema:
Mach es dir nicht so schwer. ;-)
Du brauchst nur beim normalen TLabel EllipsisPosition auf epPathEllipsis zu setzen und schon hast du genau was du möchtest.

Carsten Hölscher 16. Sep 2021 10:45

AW: WM_SIZE löst nicht aus
 
Ah :-D
Danke, das kannte ich noch gar nicht.

Carsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf