zub писал(а):Спасибо за критику. конструктивной критики много небывает
1 - Это моя нелюбовь к формошлепанью. Исправить тут что либо не представляется возможным. Разве что за жто возьмется кто то другой, не я
2 - скрин? размер и ручек и курсора настраивается на вкладке "отображение" в инспекторе - размер прицела, размер перекрестия, размер ручек. ЕМНИП перекрестие в процентах от размера рабочей области, остальное в пикселях
3 - настраиваемо. двигаешь сплитеры, в конце делаешь в меню настройкасохранить настройку окон по умолчанию, чтоб настройки не пропали с текущей сессией
можно настроить несколько раскладок окон, одну из них сделав пустой с гиганской областью отрисовки и переключать их налету комбобоксом (предвалительно включив соответствующий тулбар видпоказать_окнопанели_инструментовLayouts)
4 - нескончаемая стадия глубокой разработки. инсталятор сейчас просто трата времени. имхо
5 - поведение я копирую с автокада, такчто это классика))
Добавлено спустя 7 минут 27 секунд:
>>с закладками задвигающим и выдвигающими всяческие инструменты и инспекторы
Анхордокинг пока этого непозволяет((
1 Так зачем формошлепать ? Можно динамически формы создавать прямо из кода .... Более того можно сделать простой удобный инструмент для создания стандартных диалогов (даже координаты и размер окна могут быть не нужны ).
2 Извиняюсь не нашел.
3 Возможно стоит сделать по примеру IDE лазаруса то есть добавить возможность "выдергивать" рабочую область в отдельное окно ? (Там можно работать и так и так )
4 Есть чертова куча разных "конструкторов инсталляций" и они настолько просты что тратить время на их изучение практически не нужно.
5 Z-Cad мне напоминает не Автокад, а ранний "компас" Например у автокада всегда была одна очень специфическая фишка: встроенная командная консоль полностью дублирующая все действия по созданию чертежа.
(Даже я именно под впечатлением от автокада добавил в свою программу что-то отдаленно похожие... только у меня список "команд" не редактируется как обычный текст "прямо из консоли" но есть возможность "ручного ввода команд" впрочем редактировать в форме "команды" тоже можно но не "в общем мемо" а "построчно" . )
Зы
Как обойтись без формошлепанья ? Например так ...
(Заметь нет ни какой надобности вводить координаты для добавления новых элементов )
Код: Выделить всё
// Добавить
procedure TF1.Button1Click(Sender: TObject);
begin
If self.ListBox1.ItemIndex <> -1 then
begin
// if ListBox1.ItemIndex in [0..20] the begin
C2P_ADD_Divider(ListBox1.Items[ListBox1.ItemIndex]);//Разделитель из списка
Case ListBox1.ItemIndex of
0:begin
//'Яркость'
C2P_ADD_INT('Интенсивость 0-255','100');
C2P_ADD_Bool('Включить фльтр','0');
end;
1:begin
//'Контраст'
C2P_ADD_INT('Интенсивость 0-255','100');
C2P_ADD_Bool('Включить фльтр','0');
end;
2:begin
//' Emboss '
C2P_ADD_Bool('Включить фльтр','0');
end;
3:begin
//' Зеркало '
C2P_ADD_Bool('Включить фльтр','0');
end;
4:begin
//' Градиент серого '
C2P_ADD_Bool('Включить фльтр','0');
end;
5:begin
//' Инверсия '
C2P_ADD_Bool('Включить фльтр','0');
end;
6:begin
//' Перевернуть '
C2P_ADD_Bool('Включить фльтр','0');
end;
7:begin
//' Бинаризация '
C2P_ADD_INT('Min 0-255','8');
C2P_ADD_INT('Max 0-255','20');
C2P_ADD_Bool('Включить фльтр','0');
end;
8:begin
//' Соляризация '
C2P_ADD_INT('Интенсивость 0-255','100');
C2P_ADD_Bool('Включить фльтр','0');
end;
9:begin
//' Seamless '
C2P_ADD_INT('Интенсивость 0-255','100');
C2P_ADD_Bool('Включить фльтр','0');
end;
10:begin
//' Trace '
C2P_ADD_INT('Интенсивость 0-255','1');
C2P_ADD_Bool('Включить фльтр','0');
end;
11:begin
//' Posterize '
C2P_ADD_INT('Интенсивость 0-255','100');
C2P_ADD_Bool('Включить фльтр','0');
end;
12:begin
//' ConvolveFilter '
C2P_ADD_INT('Фильтр 0-8','1');
C2P_ADD_INT('Edgenr 0-2','2');
C2P_ADD_Bool('Включить фльтр','0');
end;
13:begin
//'Рыбий глаз'
C2P_ADD_Float('Фокус 0.51-2.0 ','+0000.5100');
C2P_ADD_Bool('Включить фльтр','0');
end;
14:begin
//' HSV + '
C2P_ADD_Float('H -360.0 - 360.0 ','+0000.0000');
C2P_ADD_Float('S -1.0 - 1.0 ','+0000.0000');
C2P_ADD_Float('V -1.0 - 1.0 ','+0000.0000');
C2P_ADD_Bool('Включить фльтр','0');
end;
15:begin
//' Простое сглаживание '
C2P_ADD_INT('Сдвиг','1');
C2P_ADD_INT('Повторы ','1');
C2P_ADD_Bool('Включить фльтр','0');
end;
16:begin
//' Фильтр Робертса '
C2P_ADD_INT('Порог 0-255 ','20');
C2P_ADD_Bool('Очистка','0');
C2P_ADD_Bool('Включить фльтр','0');
end;
17:begin
//' Фильтр Собела '
C2P_ADD_INT('Порог 0-255 ','200');
C2P_ADD_Bool('Очистка','0');
C2P_ADD_Bool('Включить фльтр','0');
end;
18:begin
//'Детектор Канни'
C2P_ADD_INT('Стадия 0-7','7');
C2P_ADD_Bool('RGB','0');
C2P_ADD_Bool('Включить фльтр','0');
end;
19:begin
//'Изменить разрешение'
C2P_ADD_INT('Ширина (px)','320');
C2P_ADD_INT('Высота (px)','200');
C2P_ADD_Bool('Включить фльтр','0');
end;
20:begin
//'Вернуть разрешение'
C2P_ADD_Bool('Включить фльтр','0');
end;
21:begin
//'Скелетизация
C2P_ADD_Color('C','$00FF00');
C2P_ADD_Color('Pr','$AAAAAA');
C2P_ADD_Bool('Full','0');
C2P_ADD_Bool('Cl','0');
C2P_ADD_Bool('Включить фльтр','0');
end;
//'Темпоральный след'
22:begin
C2P_ADD_INT('Хвост 0-100','80');
C2P_ADD_Bool('Включить фльтр','0');
end;
//'Выделить движение'
23:begin
C2P_ADD_INT('Чуствительность','120');
C2P_ADD_INT('Хвост ','10');
C2P_ADD_Bool('Показать фон','1');
C2P_ADD_Bool('Включить фльтр','0');
end
end; // Casse
ID_ListView;
end
end;
Там правда есть возможность сделать диалоговую панель "совсем уж динамической" ...
Но начальный стартовый набор задается так ...
Код: Выделить всё
procedure TF1.FormCreate(Sender: TObject);
Var I:Integer;
begin
DI_List:=Tlist.Create;
ExBmp:=Nil;
ListBox1.Items.Text:=
'Яркость'#13#10+
'Контраст'#13#10+
' Emboss '#13#10+
' Зеркало '#13#10+
' Градиент серого '#13#10+
' Инверсия '#13#10+
' Перевернуть '#13#10+
' Бинаризация '#13#10+
' Соляризация '#13#10+
' Seamless '#13#10+
' Trace '#13#10+
' Posterize '#13#10+
' ConvolveFilter '#13#10+
'Рыбий глаз'#13#10+
' HSV + '#13#10+
'Простое сглаживание'#13#10+
'Фильтр Робертса'#13#10+
'Фильтр Собела'#13#10+
'Детектор Канни'#13#10+
'Изменить разрешение'#13#10+
'Вернуть разрешение'#13#10+
'Скелетизация '#13#10+
'Темпоральный след'#13#10+
'Выделить движение';
ListBox1.ItemIndex:=0 ;
For I:=0 to ListBox1.Count-1 do
begin
ListBox1.ItemIndex:=i;
Button1Click(Sender);
end;
ID_ListView;
end;
а в ID_ListView; я просто и тупо добавляю контролы...
Это разумеется самый безобразный кусок "спагетти кода" но он может быть написан
ОДИН РАЗ ДЛЯ ВСЕХ ДИАЛОГОВ. Код: Выделить всё
// Сборка и показ инспектора данных
procedure TF1.ID_ListView;
var
PLS,PL,PL1,PL2:TPanel;
B:Tbutton;
E:TEdit;
CB:TCheckBox;
CBox:TComboBox;
C,DL_Top,I,j,er:LongInt;
S,s1:String;
Em:TMaskEdit;
Const
Clist:Tlist=Nil;
BP:Tpanel=nil;
begin
If Cfv then exit; Cfv:=True;
if BP=Nil then Bp:=Panel4;
if Clist=Nil then Clist:=Tlist.Create;
panel4.Visible:=False;
// Очистка предыдущего состояния....
if CList.Count >0 then
For I:=0 to CList.Count-1 do
TControl(CList[I]).Free;
CList.Clear;
DL_Top:=ScrollBar1.Position;
C:=panel2.Height div 25;
for I:=DL_Top to (DL_Top+C)-1 do
if I <DI_List.Count then begin
PL:=TPanel.Create(panel2);
PL.Top:=(I-DL_Top)*25;PL.Height:=25;pl.Width:=panel2.Width;
PL1:=TPanel.Create(pl);PL1.Height:=25;pl1.Width:=panel2.Width div 2;
PL1.Caption:=PDI_Rec( DI_List[I])^.Name;
case PDI_Rec( DI_List[I])^.DType of
DT_Str: begin
E:=TEdit.Create(pl);
E.OnKeyDown:=ID_KeyDown;
E.Left:=pl1.Width;E.Width:=pl1.Width; E.Height:=25;
If PDI_Rec(DI_List[I])^.Data <> nil then
E.Text:=PString(PDI_Rec(DI_List[I])^.Data)^
else E.Text:='';
e.HelpContext:=I;E.OnChange:=EditChange;
pl.InsertControl(E);
end;
DT_Int: begin
E:=TEdit.Create(pl);
e.OnKeyDown:=IntEditKeyDown;
E.Left:=pl1.Width;E.Width:=pl1.Width; E.Height:=25;
If PDI_Rec(DI_List[I])^.Data<> nil then
E.Text:=PString(PDI_Rec(DI_List[I])^.Data)^
else E.Text:='';
e.HelpContext:=I;E.OnChange:=EditChange;
pl.InsertControl(E);
end;
...// и т. д.
DT_Divider:begin
PL1.Align:=alClient;
end;
end;
pl.InsertControl(PL1);
CList.Add(PL);
end;
//Со списком чуть надежнее
if CList.Count >0 then
For I:=0 to CList.Count-1 do
bp.InsertControl(CList[I]);
panel4.Visible:=true;
CFV:=false;
end;
end.
Для инспектора данных это не очень хороший вариант но если сделать что-то похожее для диалогов то "шлепать формы" не понадобится от слова совсем . Доступ к данным идет "одной функцией"
Function C2P_Get(N:Integer):String;.
Как-то так...
Код: Выделить всё
Procedure Draw_FX_List;
Var I,J:Integer;
S:String;
Const CK:byte=$FF;
R:TRect=(Left:0;Top:0;Right:0;Bottom:0 );
begin
If DI_List = Nil then exit;
If DI_List.count >0 then
For I:=0 to DI_List.count-1 do
if PDI_Rec(DI_List[i])^.DType= DT_Divider then
begin
S:=PDI_Rec(DI_List[i])^.Name;
Case ListBox1.Items.IndexOf(S) of
// 'Яркость'
0:begin
If ( C2P_Get(I+2)='1') and ( C2P_Get(I+1)<>'' )
then Lightness(b,StrToInt(C2P_Get(i+1)));
end;
//'Контраст'
1:begin
If ( C2P_Get(I+2)='1') and ( C2P_Get(I+1)<>'' )
then Contrast(b,StrToInt(C2P_Get(I+1)));
end;
// ' Emboss '
2:begin
If C2P_Get(I+1)='1' then Ucanny.Emboss(B);
end;
// ...... и т.д.
// ' Бинаризация '
7: begin
If (C2P_Get(I+3)='1') and
( C2P_Get(i+1)<>'') and (C2P_Get(i+2)<>'')
then Ucanny.bBinarization(b,b,StrToInt(C2P_Get(i+1))
,StrToInt(C2P_Get(i+2)));
end;
// ...... и т.п.
//-----------------
end // Case
end // EndFor
end; // End Draw_FX_List;