Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить доступ к процедуре из другого класса / 16 сообщений из 16, страница 1 из 1
24.05.2019, 09:28
    #39817476
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Есть класс, DBGrid... в нем добавлен TCollection и TCollectionItem. Что мне нужно... при изменении параметра в TCollectionItem выполнить процедуру TmyDBGrid.TEMP. Однако я не пойму как к ней получить доступ? Мои потуги натыкаются либо на неизвестную процедуру, либо AV ... что видимо обращаюсь, к тому чего нет. Как правильно реализовать?

Код: 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.
TmyDBGrid = class;

   TmyCollectionItem = class(TCollectionItem)
  private
    FmCount: integer;
    procedure SetmCount(const Value: integer);
  public
    constructor Create(Collection: TCollection); override;
  published
    property mCount: integer read FmCount write SetmCount default -1;
  end;


 TmyCollection = class(TCollection)
  private
    FmyGrid: TmyDBGrid;
    function GetItem(Index: Integer): TmyCollectionItem;
    procedure SetItem(Index: Integer; const Value: TmyCollectionItem);
  protected
  public
    constructor Create(myDBGrid: TmyDBGrid);
    property Item[Index: Integer]: TmyCollectionItem read GetItem write SetItem; default;
  published
  end;

 TmyDBGrid = class(TmyDBGrids)
  private
 FmyCollection: TmyCollection;
  public
  constructor Create(AOwner: TComponent); override;
  procedure TEMP;
published
 property myCollection: TmyCollection read FmyCollection write SetmyCollection;
...
Рейтинг: 0 / 0
24.05.2019, 09:33
    #39817486
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
У коллекции есть процедура, которая вызывается при действия с итемсами:
http://docwiki.embarcadero.com/Libraries/Rio/fr/System.Classes.TCollection.Notify
...
Рейтинг: 0 / 0
24.05.2019, 09:50
    #39817502
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TmyCollectionItem.SetmCount(const Value: integer);
begin
 if FmCount = Value then Exit;
  FmCount := Value;
  TmyCollection(Collection).FmyGrid.TEMP;
end;
...
Рейтинг: 0 / 0
24.05.2019, 11:05
    #39817603
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
DimaBr
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TmyCollectionItem.SetmCount(const Value: integer);
begin
 if FmCount = Value then Exit;
  FmCount := Value;
  TmyCollection(Collection).FmyGrid.TEMP;
end;



Работает... Спасибо.
...
Рейтинг: 0 / 0
24.05.2019, 16:31
    #39817890
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Только это плохая практика. Правильнее сделать событие, на которое грид уже вешал бы свой обработчик
...
Рейтинг: 0 / 0
29.05.2019, 08:50
    #39819612
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Василий 2Только это плохая практика. Правильнее сделать событие, на которое грид уже вешал бы свой обработчик
Это какое событие например? Не пойму как реализовать...
...
Рейтинг: 0 / 0
29.05.2019, 08:58
    #39819614
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Только это плохая практика
Ничего подобного нет. Сплошь и рядом дёрганье методов родителя из элементов коллекции.
Вот THeaderControl
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure THeaderSection.SetAutoSize(Value: Boolean);
begin
  if Value <> FAutoSize then
  begin
    FAutoSize := Value;
    if THeaderSections(Collection).FHeaderControl <> nil then
      THeaderSections(Collection).FHeaderControl.AdjustSize;
  end;
end;



А вот TStatusBar
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TStatusPanel.ParentBiDiModeChanged;
begin
  if FParentBiDiMode then
  begin
    if GetOwner <> nil then
    begin
      BiDiMode := TStatusPanels(GetOwner).FStatusBar.BiDiMode;
      FParentBiDiMode := True;
    end;
  end;
end;
...
Рейтинг: 0 / 0
13.06.2019, 17:32
    #39826279
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
DimaBrТолько это плохая практика
Ничего подобного нет. Сплошь и рядом дёрганье методов родителя из элементов коллекции.

Ну ты все-таки не путай обращение элемента к контейнеру и обращение элемента к привязанному к контейнеру контролу. Хорошая практика - это чтобы невизуальные классы вообще никак не были связаны с контролами. Еще более хорошая практика - максимально самостоятельные классы, если они имеют хоть какой-нибудь смысл сами по себе. Например, коллекция м.б. привязана к гриду, а может и просто висеть в памяти.
...
Рейтинг: 0 / 0
13.06.2019, 17:38
    #39826284
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Prot_XTВасилий 2Только это плохая практика. Правильнее сделать событие, на которое грид уже вешал бы свой обработчик
Это какое событие например? Не пойму как реализовать...
Например,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
TMyCollection.OnItemChange(Collection: TCollection; Item: TmyCollectionItem; ChangeKind: ckAdd/ckRemove/ckModify)
TMyCollection.ItemChanged(Item: TmyCollectionItem; ChangeKind: add/remove/modify)
begin
  if Assigned(OnItemChange) then
    OnItemChange(Self, Item, ChangeKind);
end;

...

procedure TmyCollectionItem.SetmCount(const Value: integer);
begin
 if FmCount = Value then Exit;
  FmCount := Value;
  TmyCollection(Collection).ItemChanged(Self, ckModify);
end;
...
Рейтинг: 0 / 0
13.06.2019, 21:58
    #39826346
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Василий 2Ну ты все-таки не путай обращение элемента к контейнеру и обращение элемента к привязанному к контейнеру контролу. Хорошая практика - это чтобы невизуальные классы вообще никак не были связаны с контролами. Еще более хорошая практика - максимально самостоятельные классы, если они имеют хоть какой-нибудь смысл сами по себе. Например, коллекция м.б. привязана к гриду, а может и просто висеть в памяти.
Причём тут извещение ItemChanged и доступ к методам класса из элементов коллекции
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function TColumn.GetGrid: TCustomDBGrid;
begin
  if Assigned(Collection) and (Collection is TDBGridColumns) then
    Result := TDBGridColumns(Collection).Grid
  else
    Result := nil;
end;

procedure TColumn.SetIndex(Value: Integer);
var
  Grid: TCustomDBGrid;
  Fld: TField;
  I, OldIndex: Integer;
  Col: TColumn;
begin
  OldIndex := Index;
  Grid := GetGrid;

  if IsStored then
  begin
    Grid.BeginLayout;
    try


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TColumn.SetWidth(Value: Integer);
var
  Grid: TCustomDBGrid;
  TM: TTextMetric;
  DoSetWidth: Boolean;
begin
  DoSetWidth := IsStored;
  if not DoSetWidth then
  begin
    Grid := GetGrid;
    if Assigned(Grid) then
    begin
      if Grid.HandleAllocated and Assigned(Field) and Grid.FUpdateFields then
      with Grid do
      begin
        Canvas.Font := Self.Font;
        GetTextMetrics(Canvas.Handle, TM);
        Field.DisplayWidth := (Value + (TM.tmAveCharWidth div 2) - TM.tmOverhang - 3)
          div TM.tmAveCharWidth;
      end;


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TColumn.SetFieldName(const Value: string);
var
  AField: TField;
  Grid: TCustomDBGrid;
begin
  AField := nil;
  Grid := GetGrid;
  if Assigned(Grid) and Assigned(Grid.DataLink.DataSet) and
    not (csLoading in Grid.ComponentState) and (Length(Value) > 0) then
      AField := Grid.DataLink.DataSet.FindField(Value);
...
Рейтинг: 0 / 0
14.06.2019, 10:51
    #39826466
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Ох какой ты трудный... распишу по пунктам.

* Столбец - визуальный класс.
* Вне грида существовать не может.
* Является компонентом в контейнере-гриде.
* Доступ из него к гриду - сойдет.
* Коллекция - невизуальный класс.
* Вне грида существовать может.
* Доступ из нее (а уж тем паче из элемента коллекции) к гриду - фу бяка.
* На уровне рекомендаций! Конкретно ты можешь чесать гланды перанально, но в целом это практика нехорошая, нарушение абстракций и логических слоев и вообще говнокод.
...
Рейтинг: 0 / 0
14.06.2019, 14:31
    #39826618
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Так и его коллекция вне грида существовать не может
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 TmyCollection = class(TCollection)
  private
    FmyGrid: TmyDBGrid;
    function GetItem(Index: Integer): TmyCollectionItem;
    procedure SetItem(Index: Integer; const Value: TmyCollectionItem);
  protected
  public
    constructor Create(myDBGrid: TmyDBGrid);
    property Item[Index: Integer]: TmyCollectionItem read GetItem write SetItem; default;
  published
  end;
...
Рейтинг: 0 / 0
14.06.2019, 15:03
    #39826632
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Потому что это кривая реализация
...
Рейтинг: 0 / 0
14.06.2019, 15:27
    #39826647
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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
  TDBGridColumns = class(TCollection)
  private
    FGrid: TCustomDBGrid;
    function GetColumn(Index: Integer): TColumn;
    function InternalAdd: TColumn;
    procedure SetColumn(Index: Integer; Value: TColumn);
    procedure SetState(NewState: TDBGridColumnsState);
    function GetState: TDBGridColumnsState;
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(Grid: TCustomDBGrid; ColumnClass: TColumnClass);
    function  Add: TColumn;
    procedure LoadFromFile(const Filename: string);
    procedure LoadFromStream(S: TStream);
    procedure RestoreDefaults;
    procedure RebuildColumns;
    procedure SaveToFile(const Filename: string);
    procedure SaveToStream(S: TStream);
    property State: TDBGridColumnsState read GetState write SetState;
    property Grid: TCustomDBGrid read FGrid;
    property Items[Index: Integer]: TColumn read GetColumn write SetColumn; default;
  end;

  THeaderSections = class(TCollection)
  private
    FHeaderControl: TCustomHeaderControl;
    function GetItem(Index: Integer): THeaderSection;
    procedure SetItem(Index: Integer; Value: THeaderSection);
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(HeaderControl: TCustomHeaderControl);
    function Add: THeaderSection;
    function AddItem(Item: THeaderSection; Index: Integer): THeaderSection;
    function Insert(Index: Integer): THeaderSection;
    property Items[Index: Integer]: THeaderSection read GetItem write SetItem; default;
  end;

  TStatusPanels = class(TCollection)
  private
    FStatusBar: TCustomStatusBar;
    function GetItem(Index: Integer): TStatusPanel;
    procedure SetItem(Index: Integer; Value: TStatusPanel);
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(StatusBar: TCustomStatusBar);
    function Add: TStatusPanel;
    function AddItem(Item: TStatusPanel; Index: Integer): TStatusPanel;
    function Insert(Index: Integer): TStatusPanel;
    property Items[Index: Integer]: TStatusPanel read GetItem write SetItem; default;
  end;
...
Рейтинг: 0 / 0
14.06.2019, 16:50
    #39826690
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Блин, утомил.
Если у ТС коллекция представляет столбцы (уж не знаю, зачем) - пусть пробрасывает доступ к гриду. Дозволяю.
...
Рейтинг: 0 / 0
14.06.2019, 22:33
    #39826779
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить доступ к процедуре из другого класса
Открываем DevExpress. Поиск по "class(TCollection)". Достаточно ?

Код: pascal
1.
2.
3.
  TdxBarPopupMenuLinks = class(TCollection)
  private
    FBarManager: TdxBarManager;


Код: pascal
1.
2.
3.
  TdxBarExtraPaneItems = class(TCollection)
  private
    FApplicationMenu: TdxBarCustomApplicationMenu;


Код: pascal
1.
2.
3.
  TdxRibbonTabGroups = class(TCollection)
  private
    FTab: TdxRibbonTab;


Код: pascal
1.
2.
3.
  TdxRibbonContexts = class(TCollection)
  private
    FRibbon: TdxCustomRibbon;


Код: pascal
1.
2.
3.
  TdxStatusBarPanels = class(TCollection)
  private
    FStatusBarControl: TdxCustomStatusBar;


Код: pascal
1.
2.
3.
  TcxHeaderSections = class(TCollection)
  private
    FHeaderControl: TcxCustomHeader;


Код: pascal
1.
2.
3.
  TcxLookupGridColumns = class(TCollection)
  private
    FGrid: TcxCustomLookupGrid;


Код: pascal
1.
2.
3.
[SRC delphi]  TdxSpinImageItems = class(TCollection)
  private
    Owner : TdxCustomSpinImage;


Код: pascal
1.
2.
3.
  TdxMemIndexes = class(TCollection)
  private
    fMemData: TdxCustomMemData;


Код: pascal
1.
2.
3.
  TdxSideGroups = class(TCollection)
  private
    SideBar: TdxSideBar;


Код: pascal
1.
2.
3.
  TdxSideBarItems = class(TCollection)
  private
    Group: TdxSideGroup;


Код: pascal
1.
2.
3.
  TcxPivotGridCustomTotalCollection = class(TCollection)
  private
    FOwner: TcxPivotGridField;


Код: pascal
1.
2.
3.
  TcxPivotGridFieldGroupCollection = class(TCollection)
  private
    FOwner: TcxCustomPivotGrid;


Код: pascal
1.
2.
3.
  TcxSchedulerNavigatorCustomButtons = class(TCollection)
  private
    FScheduler: TcxCustomScheduler;


Код: pascal
1.
2.
3.
  TcxSchedulerEventLinks = class(TCollection)
  private
    FEvent: TcxSchedulerEvent;


Код: pascal
1.
2.
3.
  TcxCustomSchedulerStorageFields = class(TCollection)
  private
    FOwner: TcxCustomSchedulerStorage;


Код: pascal
1.
2.
3.
  TdxSpellCheckerDictionaries = class(TCollection)
  private
    FSpellChecker: TdxCustomSpellChecker;


Код: pascal
1.
2.
3.
  TcxEditorPropertiesCollection = class(TCollection)
  private
    FRow: TcxCustomMultiEditorRow;



...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить доступ к процедуре из другого класса / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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