Суть проблемы такая.
На панели программно моздаётся календарик
FDatePicker := TMonthCalendar.Create(MainPanel);
FDatePicker.Parent := MainPanel;
FDatePicker.AutoSize := true;
Календарик может иметь разную ширину. По умолчанию компоненту TMonthCalendar задаётся какое-то значение. Но оно не совпадает с тем какая ширина у календаря, и он создаётся с отступами по бокам.
Я хочу сделать так чтоб их небыло. Но при этом сразу хочу знать ширину которую должен установить AutoSize.
Т.е допустим написать так:
FDatePicker := TMonthCalendar.Create(MainPanel);
FDatePicker.Parent := MainPanel;
FDatePicker.AutoSize := true;
MainPanel.Width := FDatePicker.Width;
Но после прохода строки с AutoSize ширина календарика не изменилась.
А уже только тогда когда я покажу форму на которой это всё создаётся календарик появится с изменёнными размерами. А мне нудно эти размеры изменить зарание. И знать их чтобы в соответствии с ними разместить всё остальное.
Здравствуйте, Inna_Z, Вы писали:
I_Z>А уже только тогда когда я покажу форму на которой это всё создаётся календарик появится с изменёнными размерами. А мне нудно эти размеры изменить зарание. И знать их чтобы в соответствии с ними разместить всё остальное.
Если ты знаешь, какое значение будет у календаря, то можно померять его (значения) ширину.
Вот кусочек кода:
type
THackedWinControl = class(TWinControl)
public
property Font;
end;
function CalcTextLineExtend(aControl: TWinControl; aText: string; aWidth: Integer = 0;
aMultiline: Boolean = False): TPoint;
var
l_Flags: LongWord;
l_DC: HDC;
SaveFont: HFont;
l_Rect: TRect;
begin
l_DC := GetDC(0);
try
SaveFont := SelectObject(l_DC, THackedWinControl(aControl).Font.Handle);
l_Rect := xiRect0;
l_Flags := DT_LEFT or DT_CALCRECT;
if aMultiline then
begin
l_Rect.Right := aWidth-1;
l_Flags := l_Flags or DT_WORDBREAK;
end;
DrawText(l_DC, PChar(aText), Length(aText), l_Rect, l_Flags);
SelectObject(l_DC, SaveFont);
Result := l_Rect.BottomRight;
finally
ReleaseDC(0, l_DC);
end;
end;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>