क्या वैसे भी मैं पास्कल स्क्रिप्ट में एक स्ट्रिंग की चौड़ाई और ऊंचाई प्राप्त कर सकता हूं?

जैसे:

var
  S: String;

S := 'ThisIsMyStringToBeChecked'

यहां मुझे इसके वर्तमान फ़ॉन्ट आकार और फ़ॉन्ट के अनुसार इसकी ऊंचाई और चौड़ाई वापस करने की आवश्यकता है।

मैंने पढ़ा है .

मैं चाहता हूं कि यह माप (चौड़ाई और ऊंचाई) TLabel.Caption जैसे 'Too Long To Display' को clRed के साथ बदलें, जब इसके कैप्शन की स्ट्रिंग की चौड़ाई TLabel.Width से अधिक हो।

अग्रिम में धन्यवाद।

1
GTAVLover 12 सितंबर 2016, 06:28

1 उत्तर

सबसे बढ़िया उत्तर

TNewStaticText के लिए निम्नलिखित कार्य करता है (TLabel के लिए नहीं):

type
  TSize = record
    cx, cy: Integer;
  end;

function GetTextExtentPoint32(hdc: THandle; s: string; c: Integer;
  var Size: TSize): Boolean;
  external 'GetTextExtentPoint32W@Gdi32.dll stdcall';
function GetDC(hWnd: THandle): THandle;
  external 'GetDC@User32.dll stdcall';
function SelectObject(hdc: THandle; hgdiobj: THandle): THandle;
  external 'SelectObject@Gdi32.dll stdcall';

procedure SmartSetCaption(L: TNewStaticText; Caption: string);
var
  hdc: THandle;
  Size: TSize;
  OldFont: THandle;
begin
  hdc := GetDC(L.Handle);
  OldFont := SelectObject(hdc, L.Font.Handle);
  GetTextExtentPoint32(hdc, Caption, Length(Caption), Size);
  SelectObject(hdc, OldFont);

  if Size.cx > L.Width then
  begin
    L.Font.Color := clRed;
    L.Caption := 'Too long to display';
  end
    else
  begin
    L.ParentFont := True;
    L.Caption := Caption;
  end;
end;
1
Martin Prikryl 13 सितंबर 2016, 08:47
शानदार ............ अच्छा काम करता है। लेकिन मुझे यह जानना अच्छा लगता है कि यह TLabel के साथ काम क्यों नहीं करेगा?
 – 
GTAVLover
13 सितंबर 2016, 02:51
क्योंकि TLabel TWinControl नहीं है, इसलिए इसमें .Handle नहीं है। TLabel के लिए कोड कुछ अलग होना चाहिए। हो सकता है, कोई इसके बजाय WizardForm.Handle का उपयोग कर सकता है, या शायद nil को GetDC में पास किया जा सकता है।
 – 
Martin Prikryl
13 सितंबर 2016, 08:46