Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сократить код / 25 сообщений из 34, страница 1 из 2
26.02.2021, 14:10
    #40048960
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Всем привет, может кто-нибудь знает можно ли как-то сократить такие макароны:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  if not edtSubject.Visible then
  begin
    if edtObject.Visible then
      edtNum.Left := edtObject.Left + edtObject.Width + 5
    else
      edtNum.Left := edtName.Left + edtName.Width + 5;
  end
  else
    edtNum.Left := edtSubject.Left + edtSubject.Width + 5;
...
Рейтинг: 0 / 0
26.02.2021, 14:17
    #40048964
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
26.02.2021 14:10, wsnet пишет:
> Всем привет, может кто-нибудь знает можно ли как-то сократить такие макароны:

begin и end убери
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.02.2021, 14:18
    #40048966
DHDD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var edt: TEdit;
...
	if edtSubject.Visible then edt:=edtSubject
	else if edtObject.Visible then edt:=edtObject
	else edt:=edtName;
	
	edtNum.Left := edt.Left + edt.Width + 5;
...
Рейтинг: 0 / 0
26.02.2021, 14:19
    #40048968
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CurLeft = 0;

If edtSubject.Visible then
  begin
   edtSubject.Left = CurLeft;
   Inc(CurLeft, etdSubject.Width + 5);
  end

If edtObject.Visible then
  begin
   edtObject.Left = CurLeft;
   Inc(CurLeft, etdObject.Width + 5);
  end

If edtName.Visible then
  begin
   edtName.Left = CurLeft;
   Inc(CurLeft, etdName.Width + 5);
  end


Сокращения кода нет, но читаемость повышается. При желании это можно спрятать под капот
функции с сокращением видимого кода:
Код: sql
1.
2.
3.
4.
CurLeft = 0;
SetLeft(edtSubject, CurLeft);
SetLeft(edtObject, CurLeft);
SetLeft(edtName, CurLeft);
...
Рейтинг: 0 / 0
26.02.2021, 14:20
    #40048969
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Код: pascal
1.
edtNum.Left := IfThen(edtSubject.Visible, edtSubject.Left + edtSubject.Width, IfThen(edtObject.Visible, edtObject.Left + edtObject.Width, edtName.Left + edtName.Width)) + 5;


доработанный вариант DHDD :
Код: pascal
1.
2.
var edt: TEdit := TEdit(IfThen(edtSubject.Visible, Cardinal(edtSubject), IfThen(edtObject.Visible, Cardinal(edtObject), Cardinal(edtName))));
edtNum.Left := edt.Left + edt.Width + 5;
...
Рейтинг: 0 / 0
26.02.2021, 14:28
    #40048977
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
asutp2
Код: pascal
1.
edtNum.Left := IfThen(edtSubject.Visible, edtSubject.Left + edtSubject.Width, IfThen(edtObject.Visible, edtObject.Left + edtObject.Width, edtName.Left + edtName.Width)) + 5;

Да. Можно еще пробелы убрать.
...
Рейтинг: 0 / 0
26.02.2021, 14:29
    #40048979
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function GetNextLeft(AControl: TControl): Integer;
begin
  Result := AControl.Left + AControl.Width + 5;
end;

var
  NextLeft: Integer;
begin
  if not edtSubject.Visible then
  begin
    if edtObject.Visible then
      NextLeft := GetNextLeft(edtObject)
    else
      NextLeft := GetNextLeft(edtName);
  end
  else
    NextLeft := GetNextLeft(edtSubject.Width);
  edtNum.Left := NextLeft;
end;


Или даже так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function GetVisibleControl(const AControls: array of TControl): TControl;
var
  Li: Integer;
begin
  for Li := 0 to Length(AControls) - 1 do begin
    if AControls[Li].Visible then begin
      Result := AControls[Li];
      Exit;
    end;
  end;
  Result := nil;
end;

var
  LControl: TControl;
begin
  LControl := GetVisibleControl([edtSubject, edtObject, edtName]);
  if LControl = nil then
    raise Exception.Create('Visible control not found');
  edtNum.Left := LControl.Left + LControl.Width + 5;
end;


Если Делфи хотя бы 2006 версии, то функцию GetVisibleControl можно переписать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
]function GetVisibleControl(const AControls: array of TControl): TControl;
begin
  for Result in AControls do begin
    if Result.Visible the
      Exit;
  end;
  Result := nil;
end;
...
Рейтинг: 0 / 0
26.02.2021, 14:30
    #40048981
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
DHDD
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var edt: TEdit;
...
	if edtSubject.Visible then edt:=edtSubject
	else if edtObject.Visible then edt:=edtObject
	else edt:=edtName;
	
	edtNum.Left := edt.Left + edt.Width + 5;

Самый норм. вариант. Можно еще edt переименовать в edtLeft для большей очевидности.
...
Рейтинг: 0 / 0
26.02.2021, 14:36
    #40048986
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Dimitry Sibiryakov,

классно. Имхо, лучше всех.
...
Рейтинг: 0 / 0
26.02.2021, 16:22
    #40049038
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Dimitry Sibiryakov,

Логика нарушена.

У тебя могут сработать все 3 условия сразу, а у него только одно из 3-х.
Это не говоря уже о том, что ты меняешь совсем не то(те) значение что топик-стартер.
...
Рейтинг: 0 / 0
26.02.2021, 16:34
    #40049042
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
rgreatЛогика нарушена.

Если исходить только из кода топикстартера - да. Если принять во внимание историю его
топиков и наиболее правдоподобную решаемую задачу - нет.

Мой код делает "dynamic layout".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.02.2021, 19:14
    #40049098
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
wsnet,

а чё эти контролы просто в таблицу не загнать и удалить эту фигню?
...
Рейтинг: 0 / 0
26.02.2021, 23:14
    #40049132
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
DHDD
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var edt: TEdit;
...
	if edtSubject.Visible then edt:=edtSubject
	else if edtObject.Visible then edt:=edtObject
	else edt:=edtName;
	
	edtNum.Left := edt.Left + edt.Width + 5;


сорри, в синтаксисе delphi не силен, но, может быть, что-то в таком стиле:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var edt: TEdit;
  case (Integer(edtObject.Visible) + 2*Integer(edtSubject.Visible)) of
    0:  edt := edtName;
    1:  edt := edtObject;
  else edt := edtSubject;
  end;
  
  edtNum.Left := edt.Left + edt.Width + 5;
...
Рейтинг: 0 / 0
27.02.2021, 00:00
    #40049136
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
booby
Код: pascal
1.
case (Integer(edtObject.Visible) + 2*Integer(edtSubject.Visible)) of

Очень наглядно и понятно
...
Рейтинг: 0 / 0
27.02.2021, 00:51
    #40049140
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
YuRock
booby
Код: pascal
1.
case (Integer(edtObject.Visible) + 2*Integer(edtSubject.Visible)) of

Очень наглядно и понятно

2 логических переменных образуют 4 состояния, закодированные в виде 0,1,2,3,

edtObject.VisibleedtSubject.VisibleInteger(edtObject.Visible)Integer(edtSubject.Visible)(Integer(edtObject.Visible) + 2*Integer(edtSubject.Visible)) FalseFalse000TrueFalse101FalseTrue012TrueTrue113
Это наглядно, и понимать здесь особо нечего.
Простое принятие решения на основе значения выражения.
...
Рейтинг: 0 / 0
27.02.2021, 01:07
    #40049141
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
booby,
за
Код: pascal
1.
Integer(x : Boolean)


- огребёшь когда-нибудь.
...
Рейтинг: 0 / 0
27.02.2021, 01:14
    #40049142
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
ъъъъъ
booby,
за
Код: pascal
1.
Integer(x : Boolean)


- огребёшь когда-нибудь.

я - точно нет: по счастью, дельфи целиком мимо меня прошел.
Ты дальше какашками с учетом этой оговорки кидайся, пожалуйста.
...
Рейтинг: 0 / 0
27.02.2021, 01:30
    #40049144
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
booby
YuRock
пропущено...
Очень наглядно и понятно

2 логических переменных образуют 4 состояния, закодированные в виде 0,1,2,3,

edtObject.VisibleedtSubject.VisibleInteger(edtObject.Visible)Integer(edtSubject.Visible)(Integer(edtObject.Visible) + 2*Integer(edtSubject.Visible)) FalseFalse000TrueFalse101FalseTrue012TrueTrue113

Это наглядно, и понимать здесь особо нечего.
Простое принятие решения на основе значения выражения.За такую "наглядность" надо наказывать, без обид.
Можете воинствующе упорствовать в своём мнении, это ничего не меняет.
...
Рейтинг: 0 / 0
27.02.2021, 01:39
    #40049145
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
YuRock
...
Можете воинствующе ...


да, себя-то вы и не читаете...

Ну, раз вы знаете, за что надо наказывать, то персонально вас я освобождаю от обязанности следовать моим советам.
...
Рейтинг: 0 / 0
27.02.2021, 03:37
    #40049148
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Dimitry Sibiryakov

...Мой код делает "dynamic layout".


кстати, в этих терминах, по вероятности, прототип кода (с вероятным будущим делением) выглядит как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Procedure Show_And_Adjust(iopt :Integer);
  var 
     edt: TEdit;
Begin

  //1) HideAll
  edtSubject.Visible := False;
  edtObject.Visible := False;
  edtName.Visible := False;

  //2) Select showable
  case iopt of
    0:  edt := edtName;
    1:  edt := edtObject;
  else edt := edtSubject;
  end;

  //3) show  
  edt.Visible := True;
   
  //4) adjust right child
  edtNum.Left := edt.Left + edt.Width + 5;

End;



совершенно очевидно, что это безусловно наказуемый подход за недостаточностью ифов.
...
Рейтинг: 0 / 0
27.02.2021, 05:05
    #40049149
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
wsnet
Всем привет, может кто-нибудь знает можно ли как-то сократить такие макароны:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  if not edtSubject.Visible then
  begin
    if edtObject.Visible then
      edtNum.Left := edtObject.Left + edtObject.Width + 5
    else
      edtNum.Left := edtName.Left + edtName.Width + 5;
  end
  else
    edtNum.Left := edtSubject.Left + edtSubject.Width + 5;



Код: pascal
1.
2.
3.
    edtNum.Left := ( ( edtSubject.Left + edtSubject.Width + 5 ) * Ord( edtSubject.Visible ) ) +
                   ( ( edtObject.Left  + edtObject.Width  + 5 ) * Ord( edtObject.Visible  ) ) +
                   ( ( edtName.Left    + edtName.Width    + 5 ) * Ord( not edtObject.Visible ) );


Вариант вырви глаз :)
...
Рейтинг: 0 / 0
27.02.2021, 08:23
    #40049152
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
wsnet,

Загоните в панель + AlignWithMargins
...
Рейтинг: 0 / 0
27.02.2021, 15:05
    #40049204
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
Cobalt747
wsnet,

Загоните в панель + AlignWithMargins

Красивый вариант, но, к сожалению, если играть свойством visible может нарушиться порядок расположения компонентов и все одно придется выставлять .left что бы его восстановить.
...
Рейтинг: 0 / 0
27.02.2021, 16:25
    #40049210
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
предлагаю переписать на ассемблере !
...
Рейтинг: 0 / 0
28.02.2021, 00:40
    #40049290
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сократить код
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function L (AControl: TControl): boolean;
begin
  Result :=  AControl.Visible;
  if  Result then 
    edtNum.Left := AControl.Right + 5;
end;

if not L (edtNum) then 
  if not L (edtObject) then 
    L (edtName);



Но это для этого конкретного случая, для других может быть что-то другое (дополнительная параметризация).
Для Right пишется хелпер
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сократить код / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]