powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IDE Expert - лента невизуальных компонентов
25 сообщений из 99, страница 3 из 4
IDE Expert - лента невизуальных компонентов
    #38252327
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще не работает
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38252353
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TicNonVisualComponentEditorDlg.FormShow(Sender: TObject);
var
  LComponent: TComponent;
  LComponentIndex: Integer;
  Idx: Integer;
begin
  Color := clWhite;
  pnConfigComponents.Align := alClient;
  pnGroupComponents.Align := alClient;

  for Idx := 0 to Collection.Count - 1 do
    Collection.Items[Idx].OnGroupNameChange := GroupNameChane;

  tvConfig.Items.GetFirstNode.Selected := True; // а если элементов нет ?
  tvConfigClick(nil);

  GroupNameChane(nil);
end;

я этот момент тоже увидел и проверил на пустой форме - странно, но работает )
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38252366
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TicNonVisualComponentEditorDlg.FormShow(Sender: TObject);
var
  LComponent: TComponent;
  LComponentIndex: Integer;
  Idx: Integer;
begin
  Color := clWhite;
  pnConfigComponents.Align := alClient;
  pnGroupComponents.Align := alClient;

  for Idx := 0 to Collection.Count - 1 do
    Collection.Items[Idx].OnGroupNameChange := GroupNameChane;

  tvConfig.Items.GetFirstNode.Selected := True; // а если элементов нет ?
  tvConfigClick(nil);

  GroupNameChane(nil);
end;



Он всегда есть, это пункт "Настроить". По умолчанию делаю его активным
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38252367
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrЗачем запоминать настоящие позиции ? Проще просто прибавлять/отнимать 10000. Получится X:334 или X:10334
Код: pascal
1.
2.
3.
4.
5.
6.
      item
        Component = ActionList1
        GroupName = 'Без группы'
        OriginalPosition.X = 344
        OriginalPosition.Y = 80
      end



Хорошая идея, возьму во внимание
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253401
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получайте обновленную версию компонента
Проблемы
1. Иногда глючит DragAndDrop
2. Не отображать невизуальные объекты других компонентов, например колонка cxGrid и тому подобное

С наследованием проблем не было, разрабатывал и тестировал компонент на Delphi 2007
Помогите кто может доработать оставшиеся проблем. По желанию можете добавить новый функционал.
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253404
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новые возможности
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253405
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новые возможности
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253478
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю ещё раз, валится ошибка
Код: pascal
1.
2.
3.
  //Делаем активной по умолчанию пункт "Настроить"
  N := tvConfig.Items.GetFirstNode;
  if Assigned(N) then N.Selected := True;
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253480
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже не знаю что сказать
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38253484
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте ноды в Run-Time, а то не читаются с потока
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254472
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrДобавьте ноды в Run-Time, а то не читаются с потока

Проверь рантайм и еще на твоем скрине некорректно отображаются иконки объектов. Возможно это баг из за проблемы с обращением к первому пункту меню.
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254476
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя зря я окно сделал модальным, не удобно в работе. Буду переделывать
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254510
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте ноды в Run-Time, ещё в 2 не читается
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254523
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

Не ну тут все правильно
1. Гружу массив всех пакетов с компонентами и их хендлами CompImageIndex на этом этапе остается равным 0, так как нет смысла грузить все картинки всех компонентов,

Вызывается в событии Show
Код: 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.
25.
  //Инициализация списка установленных компонентов

  SetLength(FInstComp, 0);
  LPackSvcs := (BorlandIDEServices as IOTAPackageServices);
  for LPackIdx := 0 to LPackSvcs.PackageCount - 1 do
  begin
    LCompInfo.PackageName := LPackSvcs.PackageNames[LPackIdx];
    LCompInfo.PackageHandle := GetModuleHandle(PAnsiChar(LCompInfo.PackageName));

    for LCompIdx := 0 to LPackSvcs.ComponentCount[LPackIdx] - 1 do
    begin
      LCompInfo.CompClassName := LPackSvcs.ComponentNames[LPackIdx, LCompIdx];
      LCompInfo.CompImageHandle := FindResource(LCompInfo.PackageHandle, PAnsiChar(LCompInfo.CompClassName), RT_BITMAP);

      SetLength(FInstComp, Length(FInstComp) + 1);

      with FInstComp[Length(FInstComp) - 1] do
      begin
        PackageName := LCompInfo.PackageName;
        PackageHandle := LCompInfo.PackageHandle;
        CompClassName := LCompInfo.CompClassName;
        CompImageHandle := LCompInfo.CompImageHandle;
      end;
    end;
  end;



2. Загружаю список не визуальных компонентов которые имеются на форме и ищу к ним картинку выполняя процедуру ConfigComLoad

3. В ней прописана логика поиска картинки и дополнения данных массива инсталлированных компонентов индексов imCompImage для дальнейшего использования

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
  function InitComonentImage(AComponent: TComponent): Integer;
  var
    LClassRef: TClass;
    LClassInherited: TStringList;
    LBmp: TBitmap;
    LFirstClassIdx: Integer;
    i, j: Integer;
  begin
     Result := -1;

     LClassInherited := TStringList.Create;
     try
       //Инициализация списка наследования класса
       LClassRef := AComponent.ClassType;
       while LClassRef <> nil do
       begin
         LClassInherited.Add(LClassRef.ClassName) ;
         LClassRef := LClassRef.ClassParent;
       end;

       LFirstClassIdx := -1;

       //Поиск иконки компонента
       LBmp := TBitmap.Create;
       try
         for i := 0 to LClassInherited.Count - 1 do
           for j := 0 to Length(FInstComp) - 1 do
             with FInstComp[j] do
             begin
               if UpperCase(CompClassName) = UpperCase(LClassInherited[i]) then
               begin
                 if LFirstClassIdx = -1 then
                   LFirstClassIdx := j;

                 if CompImageHandle <> 0 then
                 begin
                   try
                     LBmp.LoadFromResourceName(PackageHandle, UpperCase(CompClassName));
                     imCompImage.AddMasked(LBmp, clFuchsia);

                     CompImageIndex := imCompImage.Count - 1;
                     FInstComp[LFirstClassIdx].CompImageIndex := CompImageIndex;

                     Result := CompImageIndex;

                     Break;
                   except
                   end;
                 end;
               end;
             end;

       finally
         LBmp.Free;
       end;

     finally
       LClassInherited.Free;
     end;
  end;



4. Инициализация списка наследования классов необходимо для того чтоб если нет картинки на данный компонент, то ищет иконку предка

Код: pascal
1.
2.
3.
4.
5.
6.
7.
       //Инициализация списка наследования класса
       LClassRef := AComponent.ClassType;
       while LClassRef <> nil do
       begin
         LClassInherited.Add(LClassRef.ClassName) ;
         LClassRef := LClassRef.ClassParent;
       end;



Создание списка наследования взял тут Получить название класса предка
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254532
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложенном скрине видно что CompImageHandle = 0
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254682
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

На этом этапе он и будет равен нулю, проверь в событии Show после выполнения процедуры ConfigComLoad
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254715
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не видите куда я вставил код ?
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
LFirstClassIdx := -1;

// S := TStringList.Create;
// for j := 0 to Length(FInstComp) - 1 do
//      S.Add(IntToStr(FInstComp[j].CompImageHandle));
// S.SaveToFile('D:\1.txt');
// Если здесь  CompImageHandle = 0, то
       //Поиск иконки компонента
       LBmp := TBitmap.Create;
       try
         for i := 0 to LClassInherited.Count - 1 do
           for j := 0 to Length(FInstComp) - 1 do
             with FInstComp[j] do
             begin
               if UpperCase(CompClassName) = UpperCase(LClassInherited[i]) then
               begin
                 if LFirstClassIdx = -1 then
                   LFirstClassIdx := j;

                 if CompImageHandle <> 0 then // то здесь никакой иконки нет
                 begin
                   try
                     LBmp.LoadFromResourceName(PackageHandle, UpperCase(CompClassName));
                     imCompImage.AddMasked(LBmp, clFuchsia);

                     CompImageIndex := imCompImage.Count - 1;
                     FInstComp[LFirstClassIdx].CompImageIndex := CompImageIndex;

                     Result := CompImageIndex;

                     Break;
                   except
                   end;
                 end;
               end;
             end;

       finally
         LBmp.Free;
       end;

     finally
       LClassInherited.Free;
     end;
  end;



И вообще, зачем такая сложность ? Зачем хранить 100 одинаковых иконок, для 100 одинаковых компонентов. Не проще ли каждую иконку хранить в одном экземпляре ?
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254793
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

Согласен, добавлю проверку была ли инициализирована картинка для класса ранее
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254914
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую завести TStringList, в котором хранить названия картинок(тип компонента), хранящихся в TImageList, а получать картинки в OnGetImageIndex, по такому типу
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.TreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);
begin
  Node.ImageIndex := IconStringList.IndexOf(TComponent(Node.Data).ClassName);
  if Node.ImageIndex := -1 then Node.ImageIndex := GetIconFromResource(TComponent(Node.Data).ClassName)
end;
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254935
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrВы не видите куда я вставил код ?
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
LFirstClassIdx := -1;

// S := TStringList.Create;
// for j := 0 to Length(FInstComp) - 1 do
//      S.Add(IntToStr(FInstComp[j].CompImageHandle));
// S.SaveToFile('D:\1.txt');
// Если здесь  CompImageHandle = 0, то
       //Поиск иконки компонента
       LBmp := TBitmap.Create;
       try
         for i := 0 to LClassInherited.Count - 1 do
           for j := 0 to Length(FInstComp) - 1 do
             with FInstComp[j] do
             begin
               if UpperCase(CompClassName) = UpperCase(LClassInherited[i]) then
               begin
                 if LFirstClassIdx = -1 then
                   LFirstClassIdx := j;

                 if CompImageHandle <> 0 then // то здесь никакой иконки нет
                 begin
                   try
                     LBmp.LoadFromResourceName(PackageHandle, UpperCase(CompClassName));
                     imCompImage.AddMasked(LBmp, clFuchsia);

                     CompImageIndex := imCompImage.Count - 1;
                     FInstComp[LFirstClassIdx].CompImageIndex := CompImageIndex;

                     Result := CompImageIndex;

                     Break;
                   except
                   end;
                 end;
               end;
             end;

       finally
         LBmp.Free;
       end;

     finally
       LClassInherited.Free;
     end;
  end;



И вообще, зачем такая сложность ? Зачем хранить 100 одинаковых иконок, для 100 одинаковых компонентов. Не проще ли каждую иконку хранить в одном экземпляре ?

Точно, извените. Тогда не отрабатывает код

Код: 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.
25.
  //Инициализация списка установленных компонентов

  SetLength(FInstComp, 0);
  LPackSvcs := (BorlandIDEServices as IOTAPackageServices);
  for LPackIdx := 0 to LPackSvcs.PackageCount - 1 do
  begin
    LCompInfo.PackageName := LPackSvcs.PackageNames[LPackIdx];
    LCompInfo.PackageHandle := GetModuleHandle(PAnsiChar(LCompInfo.PackageName));

    for LCompIdx := 0 to LPackSvcs.ComponentCount[LPackIdx] - 1 do
    begin
      LCompInfo.CompClassName := LPackSvcs.ComponentNames[LPackIdx, LCompIdx];
      LCompInfo.CompImageHandle := FindResource(LCompInfo.PackageHandle, PAnsiChar(LCompInfo.CompClassName), RT_BITMAP);

      SetLength(FInstComp, Length(FInstComp) + 1);

      with FInstComp[Length(FInstComp) - 1] do
      begin
        PackageName := LCompInfo.PackageName;
        PackageHandle := LCompInfo.PackageHandle;
        CompClassName := LCompInfo.CompClassName;
        CompImageHandle := LCompInfo.CompImageHandle;
      end;
    end;
  end;
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38254980
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отрабатывает, иначе список бы был пустым
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38255120
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrDblClik - это вызов метода TComponentEditor.Edit

Сможешь поподробнее рассказать, как использовать. Хочу на DblClick реализовать выполнение метода TComponentEditor.Edit
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38255130
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrОтрабатывает, иначе список бы был пустым

Я иммел ввиду строчку кода

Код: pascal
1.
LCompInfo.CompImageHandle := FindResource(LCompInfo.PackageHandle, PAnsiChar(LCompInfo.CompClassName), RT_BITMAP);



Почему то FindResource возвращает 0, может PackageHandle не нашел
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38255133
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlDeveloperDimaBrDblClik - это вызов метода TComponentEditor.Edit

Сможешь поподробнее рассказать, как использовать. Хочу на DblClick реализовать выполнение метода TComponentEditor.Edit

Разобрался, необходимо выполнить

Код: pascal
1.
Designer.Edit(LComponent);
...
Рейтинг: 0 / 0
IDE Expert - лента невизуальных компонентов
    #38256123
AlDeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тестировал на Delphi 2007 полет нормальный только иногда глючит DragAndDrop
Начал тестировать на Delphi 7, работает так себе не весь функционал корректно отрабатывает, но основной функционал работал на мой взгляд нормально
...
Рейтинг: 0 / 0
25 сообщений из 99, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IDE Expert - лента невизуальных компонентов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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