powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить доступ к процедуре из другого класса
16 сообщений из 16, страница 1 из 1
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39817486
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У коллекции есть процедура, которая вызывается при действия с итемсами:
http://docwiki.embarcadero.com/Libraries/Rio/fr/System.Classes.TCollection.Notify
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39817890
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только это плохая практика. Правильнее сделать событие, на которое грид уже вешал бы свой обработчик
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #39819612
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Только это плохая практика. Правильнее сделать событие, на которое грид уже вешал бы свой обработчик
Это какое событие например? Не пойму как реализовать...
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39826279
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrТолько это плохая практика
Ничего подобного нет. Сплошь и рядом дёрганье методов родителя из элементов коллекции.

Ну ты все-таки не путай обращение элемента к контейнеру и обращение элемента к привязанному к контейнеру контролу. Хорошая практика - это чтобы невизуальные классы вообще никак не были связаны с контролами. Еще более хорошая практика - максимально самостоятельные классы, если они имеют хоть какой-нибудь смысл сами по себе. Например, коллекция м.б. привязана к гриду, а может и просто висеть в памяти.
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39826466
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох какой ты трудный... распишу по пунктам.

* Столбец - визуальный класс.
* Вне грида существовать не может.
* Является компонентом в контейнере-гриде.
* Доступ из него к гриду - сойдет.
* Коллекция - невизуальный класс.
* Вне грида существовать может.
* Доступ из нее (а уж тем паче из элемента коллекции) к гриду - фу бяка.
* На уровне рекомендаций! Конкретно ты можешь чесать гланды перанально, но в целом это практика нехорошая, нарушение абстракций и логических слоев и вообще говнокод.
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39826632
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что это кривая реализация
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
Получить доступ к процедуре из другого класса
    #39826690
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, утомил.
Если у ТС коллекция представляет столбцы (уж не знаю, зачем) - пусть пробрасывает доступ к гриду. Дозволяю.
...
Рейтинг: 0 / 0
Получить доступ к процедуре из другого класса
    #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
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить доступ к процедуре из другого класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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