Вопрос Как ещё сильнее сократить код и добавить вариативности?

zettend

Старожил
Здравствуйте.
У меня в коде присутствует очень четкая структура, которую я никак не хочу нарушать.
Есть файл Core.iss, который содержит такие строки:
Код:
Function TLabelCreate(WND: TWinControl; L, T, W, H, FontSize: Integer; Text, FontName: String; FontColor: TColor; FontStyle: TFontStyles; VAutoSize: Boolean; VAlignment: TAlignment; ClickEvent: TNotifyEvent; MouseDownEvent: TMouseEvent): TLabel;
begin
Result := TLabel.Create(WND);
With Result do begin
Parent := WND;
SetBounds(ScaleX(L), ScaleY(T), ScaleX(W), ScaleY(H));
AutoSize := VAutoSize;
Alignment := VAlignment;
Transparent := True;
WordWrap := True;
Caption := Text;
OnClick := ClickEvent;
OnMouseDown := MouseDownEvent;
With Font do begin
Name := FontName;
Size := FontSize;
Color := FontColor;
Style := FontStyle;
end;
end;
end;
Он отрисовывает TLabel сокращённым методом:
Код:
Title := TLabelCreate(WizardForm, 71, 124, 400, 26, 15, CustomMessage('SelectTasks1'), {#FontName2}, {#FontColor}, [], False, taLeftJustify, nil, nil);
А возможно ли ещё сократить сокращённый TLabel?

Что бы было так(будет в файле Typography.iss):
Код:
Function TitleLbl(WND: TWinControl; L, T, W, H, FontSize: Integer; Text, FontName: String; FontColor: TColor; FontStyle: TFontStyles; VAutoSize: Boolean; VAlignment: TAlignment; ClickEvent: TNotifyEvent; MouseDownEvent: TMouseEvent): TLabel;
begin
Result := TLabel.Create(WND);
With Result do begin
TLabelCreate(WizardForm, ScaleX(L), ScaleY(T), 400, 26, 15, 'Здесь текст', {#FontName2}, {#FontColor}, [], False, taLeftJustify, nil, nil);
end;
end;
Что бы текст можно было выводить так:
Код:
TitleText := TitleLbl(WizardForm, 273, 255, CustomMessage('GenreGame'), taLeftJustify);
Такая структура для меня очень важна, дабы работать с UI Kit и по нему делать несколько видов инсталляторов. Сам же UI Kit может постоянно меняться и важно его отделить от основного кода, так-же и ядро, это абсолютно асинхронные проекты над которыми могут работать разные независимые люди.
 

zettend

Старожил
Так-же было бы удобно убить CustomMessage('GenreGame'), и оставить лишь 'GenreGame'.
 

Nemko

Дилетант
Модератор
Incorrect, Pascal - не низкоуровневый язык, сократить до машинного не выйдет, да и не нужно (пример в ассемблере: dialogitem 'STATIC','Text',-1,6,15,217,13,WS_VISIBLE+ES_CENTER). Нот что-то сократил, хотя сложно убрать многие параметры, так как нужно учитывать версию Inno (везде по разному стоят параметры "по умолчанию", применяемые к Control'у).

Код:
[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[CustomMessages]
Text_01=My test caption.

[Code]
//-----------------------------------------------------------------------------------------------------------
const
  uiLeft    = 0;
  uiCenter  = 1;
  uiRight   = 2;
  //
  uiTop     = 0;
  uiBottom  = 2;

function uiLabelCreate(wnd: TWinControl; Text: String; uiAlign, uiLayout, Wrap, x, y, w, h: Integer): TLabel;
var
s: String;
begin
Result:=TLabel.Create(nil);
with Result do begin
  WordWrap:=Wrap > 0;
  if (w + h <> 0) then AutoSize:=False;
  case uiAlign of
    uiCenter: Alignment:=taCenter;
    uiRight: Alignment:=taRightJustify;
    else Alignment:=taLeftJustify;
  end;
  case uiLayout of
    uiCenter: Layout:=tlCenter;
    uiBottom : Layout:=tlBottom
    else Layout:=tlTop;
  end;
  SetBounds(ScaleX(x), ScaleY(y), ScaleX(w), ScaleY(h));
  Transparent:=False;
  ParentColor:=True;
  Caption:=CustomMessage(Text);
  Parent:=wnd;
 end;
end;

procedure uiLabelSetParam(Fnt: TLabel; FntName: String; FntColor: TColor; FntSize, B, I, U, S: Integer);
begin
with Fnt do begin
  Font.Size:=FntSize;
  Font.Name:=FntName;
  Font.Color:=FntColor;
  if B>0 then Font.Style:=Font.Style + [fsBold];
  if I>0 then Font.Style:=Font.Style + [fsItalic];
  if U>0 then Font.Style:=Font.Style + [fsUnderline];
  if S>0 then Font.Style:=Font.Style + [fsStrikeOut];
 end;
end;
//-----------------------------------------------------------------------------------------------------------
var
  MyLabel: TLabel;

procedure InitializeWizard;
begin
  WizardForm.OuterNotebook.Hide;
  MyLabel:=uiLabelCreate(WizardForm, 'Text_01', uiCenter, uiCenter, 1, 20, 30, 155, 100);
// ► WizardForm -  родитель для Control'a
// ► Text_01    -  надпись из секции [CustomMessages]
// ► uiCenter   -  выравнивание текста по X (uiLeft, uiCenter, uiRight)
// ► uiCenter   -  выравнивание текста по Y (uiTop, uiCenter, uiBottom), проверил в Inno 6.0.4 (u)
// ► 1          -  перенос строки (WordWrap), значение большее 0, то вкл.
// ► 20, 30,    -  координаты верхнего левого угла
// ► 155, 50    -  ширина, высота (если оба параметра будут равны 0, то включается AutoSize)


  uiLabelSetParam(MyLabel, 'Georgia', clNone, 14, 1, 0, 1, 0);
// ► MyLabel    -  пременная TLabel
// ►'Georgia'   -  имя применяемого шрифта
// ► clNone     -  цвет шрифта, в Inno'вском формате
// ► 14         -  изменить размер шрифта
// ► 1, 0, 1, 0 -  применить стили (Bold, Italic, Underline, StrikeOut), значение большее 0, применяет стиль
end;

P.S.: property Layout добавили в новых версиях Inno, шок просто:congratulate:(решил обновить недавно).
 
Последнее редактирование:

zettend

Старожил
Nemko, проблема вся в том, что основной TLabel и TitleLbl находятся в разных файлах, файл Core будет 100% применятся во всех разновидностях установщика, а файл Typography будет зависеть от стиля, который мы используем в данный момент. Хотелось бы, что бы один и тот же основной код мог был использовать разные Typography.
 
Сверху