// Feststellen, welcher Buchstabe in einem Label angeklickt wurde:
// Getestet mit RS 10.4 unter Win11
function BST(LB: TLabel; X: Integer; out ST: Integer): String;
var
I, Y: Integer;
begin
Y := 0;
ST := 0;
Result := '';
with LB do
for I := 1 to length(Caption) do
with Canvas do
begin
inc(Y, TextWidth(Caption[I]));
if X < Y then
begin
Result := Caption[I];
ST := I;
Break;
end;
end;
end;
// Beispiel
// S = angeklickter Buchstabe
// Y = der wievielte Buchstabe ist es
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
S: String;
begin
S := BST(TLabel(Sender), X, Y);
Label2.Caption := S + #13 + InttoStr(Y);
end;
// -------------------------------------------------------
// Erweiterung:
// Beim Klick auf ein Label wird der Teilpfad (bzw. der Pfad) am Klickpunkt ermittelt.
// Steht beispielsweise im Label C:\Program Files\Windows Media Player\de-DE
// und man klickt auf einen Buchstaben von Files, dann erhält man C:\Program Files\
// zurück. Mittels der Variablen "pruef" kann man einstellen, dass auf das
// Vorhandensein des Ordners oder der Datei geprüft wird. Im Zweifelsfall wird ein
// leerer String zurückgegeben.
function PFD(LBL: TLabel; X: Integer; pruef: Boolean = False): String;
var
I, Y, ST: Integer;
S: String;
function Exists(Nm: string): Boolean;
begin
Result := Integer(GetFileAttributes(PChar(Nm))) <> -1;
end;
begin
Y := 0;
Result := '';
with LBL do
begin
ST := Length(Caption);
for I := 1 to ST do
with Canvas do
begin
inc(Y, TextWidth(Caption[I]));
if X < Y then
begin
ST := I;
Break;
end;
end;
S := Caption;
for I := ST to length(S) do
if S[I] = '\' then
begin
S := copy(S, 1, I);
Break;
end;
if pruef and not Exists(S) then
exit;
Result := S;
end;
end;
// Beispiel: Anzeige eines (Teil)Pfades
// Es wird geprüft, ob das Objekt vorhanden ist
procedure TForm1.Label3MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage(PFD(TLabel(Sender), X, True));
end;
|