Блокнот Графомана

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 10:58:24

Комиты должны быть минимальными и только то что относится к описанию комита (в идеале ессно)
Вот ты мне пишешь - посмотри исправленый вариант. Я не будь дураком чтоб не тратить время смотрю различия последнего состояния от предпоследнего - а там один "мусор" к тому что написано в описании комита отношения не имеющий - формочки пошевелились, ресурсики изменились, в иде файлики открылись-закрылись, бинарники перекомпилились...
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 13:06:14

Не спорю, что я могу немного не так пользоваться сервисом. Все приходит со временем. А то. что неправильно идут описания... я пишу что сделал...

zub писал(а):Комиты должны быть минимальными и только то что относится к описанию комита


Параллельно с курением анхордокинга я исправляю остальные глюки...
Собственно, весь код по теме здесь. Что я теперь делаю не так?
Код: Выделить всё
uses ... AnchorDocking, AnchorDockStorage;

procedure TFMain.FormCreate(Sender: TObject); // надо что-то делать с этой процедурой!!!
begin
  //лучше создавать окна здесь... возможно, что и при необходимости
  Application.CreateForm(TFTune, FTune);
  Application.CreateForm(TFLicence, FLicence);
  Application.CreateForm(TFAboute, FAboute);
  Application.CreateForm(TTreeNote, TreeNote);
  Application.CreateForm(TFTools, FTools);
  Application.CreateForm(TFVirtKey, FVirtKey);
  Application.CreateForm(TFEditors, FEditors);

// OptionsPath:=ExtractFilePath(Application.ExeName);
  //FMain.INIPropStorage1.IniFileName:=OptionsPath + 'options.ini';
  DockMaster.MakeDockSite (Self, [akBottom], admrpChild);

  // запуск  прилипающего окна
  DockMaster.MakeDockable (TreeNote, true, true);
  //DockMaster.ShowControl('TreeNote', true);
DockMaster.MakeDockable (FTools, true, true);
  DockMaster.MakeDockable (FEditors, true, true);

.....
end; 





Попытался я вкурить в пример, но не понял его идеологии.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 13:41:05

на нримере http://svn.freepascal.org/cgi-bin/viewv ... ot=lazarus
глядим procedure TMainIDE.FormCreate(Sender: TObject);
там видим
Код: Выделить всё
DockMaster.MakeDockSite(Self,[akBottom],admrpChild);//делаем главную форму докабельной
DockMaster.OnCreateControl:=@DockMasterCreateControl;//сообщаем докмастеру какая процедура будет создавать окна
DockMaster.OnShowOptions:=@ShowAnchorDockOptions;//не обязательно, указываем процедуру создания окна опций докинга

>>DockMaster.OnCreateControl:=@DockMasterCreateControl
процедура создания окон выделена отдельно, и будет вызываться DockMaster`ом по необходимости, а не тобой.
далее идет показ нескольких окошек
Код: Выделить всё
ViewSrcEditor1ToolButtonClick(Self);//открываем окно редактора
ViewMessagesToolButtonClick(Self);//открываем окно сообщений
ViewOIToolButtonClick(Self);//открываем окно инспектора
ViewFPDocEditorToolButtonClick(Self);//открываем окно еще какойто хрени

код показа вынесен в отдельные методы, т.к. используется еще гдето, например в меню. он везде одинаковый, рассмотрим на примере показа SrcEditor.
Код: Выделить всё
procedure TMainIDE.ViewSrcEditor1ToolButtonClick(Sender: TObject);
begin
  DockMaster.ShowControl('SourceEditor1',true);
end;

т.е. тупо говорим докмастеру - покожи чтото с названием 'SourceEditor1' и true - на переднем плане.

И вот тут в потрохах докмастера происходит вызов переданой ранее ему процедуры DockMasterCreateControl. а там:
Код: Выделить всё
procedure TMainIDE.DockMasterCreateControl(Sender: TObject; aName: string; var
     AControl: TControl; DoDisableAutoSizing: boolean);
   
     procedure CreateForm(Caption: string; NewBounds: TRect);
     begin
       AControl:=CreateSimpleForm(aName,Caption,NewBounds,DoDisableAutoSizing);
     end;
   
   begin
     if aName='CodeExplorer' then
       CreateForm('Code Explorer',Bounds(700,230,100,250))
     else if aName='FPDocEditor' then
       CreateForm('FPDoc Editor',Bounds(200,720,300,100))
     else if aName='Messages' then
       CreateForm('Messages',Bounds(230,650,350,100))
     else if aName='ObjectInspector' then
       CreateForm('Object Inspector',Bounds(10,200,100,350))
     else if aName='SourceEditor1' then
       CreateForm('Source Editor 1',Bounds(230,200,400,400))
     else if aName='SourceEditor2' then
       CreateForm('Source Editor 2',Bounds(260,230,350,350))
     else if aName='ProjectInspector' then
       CreateForm('Project Inspector',Bounds(10,230,150,250))
     else if aName='DebugOutput' then
       CreateForm('Debug Output',Bounds(400,400,350,150));
   end;

Т.е. в зависимости от переданого имени определенным образом создаются нужные формы, и им присваивается инициальное положение (это положение работает только в "несклееном" состоянии)
"определенный образ" заключается в "хитром" создании, связано с уменьшением мельканий и дерганий при создании в склееном состоянии:
Код: Выделить всё
function CreateSimpleForm(Name, Title: string; NewBounds: TRect;
     DisableAutoSizing: boolean): TSimpleForm;
   begin
     // first check if the form already exists
     // the LCL Screen has a list of all existing forms.
     // Note: Remember that the LCL allows as form names only standard
     // pascal identifiers and compares them case insensitive
     Result:=TSimpleForm(Screen.FindForm(Name));
     if Result is TSimpleForm then begin
       if DisableAutoSizing then
         Result.DisableAutoSizing;
       exit;
     end;
   
     // create it
     Result:=TSimpleForm(TSimpleForm.NewInstance);
     Result.DisableAutoSizing;
     Result.Create(Application);
     Result.Caption:=Title;
     Result.Name:=Name;
     Result.Memo1.Lines.Text:=Name;
     Result.BoundsRect:=NewBounds;
     if not DisableAutoSizing then
       Result.EnableAutoSizing;
   end;


Добавлено спустя 2 минуты 48 секунд:
Все эти "мучения" чтобы иметь возможность загрузить и сразу показать сохраненную раскладку окон
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 14:02:54

Вроде, так понятнее.
а
Код: Выделить всё
Bounds(10,200,100,350)

как я понял, придется вычислять при написании процедуры DockMasterCreateControl или брать с дизайнера форм?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 14:11:12

это можно вообще убрать, тогда цыфры будут браться из дизайнера. тут сделано чтобы фиксировать первоначальное положение окон
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 14:38:58

Т. е. просто опустить всю процедуру?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 15:59:15

Можно опустить (вернее не выделить отдельно)
Код: Выделить всё
procedure CreateForm(Caption: string; NewBounds: TRect);
function CreateSimpleForm(Name, Title: string; NewBounds: TRect;DisableAutoSizing: boolean): TSimpleForm;

но нельзя опустить выделенную процедуру создания требуемых форм
Код: Выделить всё
procedure TMainIDE.DockMasterCreateControl(Sender: TObject; aName: string; var AControl: TControl; DoDisableAutoSizing: boolean);

и "особый" порядок создания формы - через NewInstance, DisableAutoSizing и т.д.

Также хорошим тоном будет вместо развесистого ифа или кэйса внутри DockMasterCreateControl сделать динамическую регистрацию форм и получение инфы о них по имени. но для начала можно и без этого
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 16:15:27

Т. е, условно, если я перепишу CreateSimpleForm, допустим, так

Код: Выделить всё
function CreateSimpleForm(Name, Title: string;
  DisableAutoSizing: boolean): TSimpleForm;
begin
  // first check if the form already exists
  // the LCL Screen has a list of all existing forms.
  // Note: Remember that the LCL allows as form names only standard
  // pascal identifiers and compares them case insensitive
  Result:=TSimpleForm(Screen.FindForm(Name));
  if Result is TSimpleForm then begin
    if DisableAutoSizing then
      Result.DisableAutoSizing;
    exit;
  end;

  // create it
  Result:=TSimpleForm(TSimpleForm.NewInstance);
  Result.DisableAutoSizing;
  Result.Create(Application);
  Result.Caption:=Title;
  Result.Name:=Name;
                                                                          // Result.BoundsRect:=NewBounds;
  if not DisableAutoSizing then
   Result.EnableAutoSizing;
end;

То это будет нормально?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 16:18:17

В части отказа от Bounds - имхо норм (хотя я не пробовал, но проблем не вижу)
В части создания нет - в примере все окна одинаковые TSimpleForm, у тебя разные
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 16:48:33

Получается, что мне все равно придется создавать каждую форму отдельно? Причем, динамически?
Т. е. убрать
Код: Выделить всё
Application.CreateForm(TFTune, FTune);       

и заменить ее на, условно,
Код: Выделить всё
FTune:=TFTune(TFTune.NewInstance);
...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 16:54:37

да, но создавать не всё скопом, а поотдельности - по запросу
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 17:02:22

уже понятнее...
А если в той же CreateForm анализировать состояние флагов и на основе их состояния создавать стыкуемые формы?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение zub » 14.04.2017 17:25:59

не надо никаких флагов, есть загрузка-выгрузка layout`а. см тамже в miniide.
если ты в своем TFMain.FormCreate загрузишь layout то все формы будут созданы DockMaster`ом самостоятельно (путем вызова твоей TFMain.DockMasterCreateControl)
zub
долгожитель
 
Сообщения: 2261
Зарегистрирован: 14.11.2005 23:51:26

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.04.2017 17:45:29

Кажется, догнал... буду потихонечку ковырять... Я то надеялся создать поэтапно, но тут явно не прокатит.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Блокнот Графомана

Сообщение Лекс Айрин » 17.04.2017 18:09:04

Код: Выделить всё
...
procedure TFMain.DockMasterCreateControl(Sender: TObject; aName: string;
  var AControl: TControl; DoDisableAutoSizing: boolean);
  // Procedure SettingWin ();
begin
    case aName of
        'TTreeNote':Begin
                         // проверка окна на существование
                          ShowMessage('1');
                          AControl:=TTreeNote(Screen.FindForm('TreeNote'));
                          if AControl is TFMain then
                          begin
                               if DoDisableAutoSizing then
                               AControl.DisableAutoSizing;
                          exit;
                          End;
                          // create it
                          // посмотреть остальные опции
                          AControl:=TTreeNote(TTreeNote.NewInstance);procedure TFMain.FormCreate(Sender: TObject); // надо что-то делать с этой процедурой!!!
//var
//  Settings: TAnchorDockSettings;
begin
  //лучше создавать окна здесь... возможно, что и при необходимости
    Application.CreateForm(TFTune, FTune);

  Application.CreateForm(TFLicence, FLicence);
  Application.CreateForm(TFAboute, FAboute);
  //Application.CreateForm(TTreeNote, TreeNote);
  //DockMaster.ShowControl('TreeNote',true);
  Application.CreateForm(TFTools, FTools);
  //Application.CreateForm(TFVirtKey, FVirtKey);
  Application.CreateForm(TFEditors, FEditors);

  OptionsPath:=ExtractFilePath(Application.ExeName);
  FMain.INIPropStorage1.IniFileName:=OptionsPath + 'options.ini';
  DockMaster.MakeDockSite (Self, [akBottom], admrpChild);
  DockMaster.OnCreateControl:=@DockMasterCreateControl;
  FMain.LoadLayout;
  // запуск  прилипающего окна

.......
  //DockMaster.MakeDockable (TreeNote, true, true);
  DockMaster.ShowControl('TreeNote', true);
  DockMaster.MakeDockable (FTools, true, true);
  DockMaster.MakeDockable (FEditors, true, true);   
                          AControl.DisableAutoSizing;
                          AControl.Create(Application);
                          //Result.Caption:=Title;
                          AControl.Name:=Name;
                          if not DoDisableAutoSizing then
                          AControl.EnableAutoSizing;
                    end;
        'TFVirtKey':Begin
                         AControl:=TTreeNote(Screen.FindForm('FVirtKey'));
                          if AControl is TFVirtKey then
                          begin
                               if DoDisableAutoSizing then
                               AControl.DisableAutoSizing;
                          exit;
                          End;
                          // create it
                          // посмотреть остальные опции
                          AControl:=TFVirtKey(TFVirtKey.NewInstance);
                          AControl.DisableAutoSizing;
                          AControl.Create(Application);
                          //Result.Caption:=Title;
                          AControl.Name:=Name;
                          if not DoDisableAutoSizing then
                          AControl.EnableAutoSizing;
                    end;
  {
         'TFTools':Begin

                   end;
         'TFEditors':Begin

                     end ;
        }
    end;
end;         
... 

не пойму где я ошибся(((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru