Autor Téma: Jak zpřístupnit třídu uvnitř třídy?  (Přečteno 255 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Jak zpřístupnit třídu uvnitř třídy?
« kdy: 10-06-2019, 16:32:56 »
V Delphi 7 mám vytvořenou třídu (TTracker). Chtěl bych ale vytvořit novou třídu do samostatného souboru, ta se bude jmenovat TRegex_charClass. Ve třídě TTracker bych chtěl třídu TRegex_charClass zpřístupnit, abych mohl pracovat se všema jejíma vlastnostma.

Když v programu vytvořím nové instance TTracker a TRegex_charClass, např.
Kód: Delphi [Vybrat]
  1. MyTracker := TTracker.create();
  2. Regex := TRegex_charClass.create();
  3. Regex.addAssertion('A','\w{3,5}\s');

tak jediné co odtud mohu zpřístupnit má být Regex.addAssertion. Ale MyTracker má být schopno pracovat se vším co je v Regex. Protože pak zavolám MyTracker.search(Regex, mystring);
tak MyTracker musí pracovat přímo s Regex.

Jak se to dá nastavit?

Program --> sem si napíšu co chci co bude používat TTracker
Program --> TTracker --> TRegex_charClass

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #1 kdy: 10-06-2019, 16:45:27 »
Kód: Delphi [Vybrat]
  1. type
  2. TTracker = class
  3. private
  4.   FRegex_charClass: TRegex_charClass;
  5. public
  6.   constructor Create; override;
  7.   destructor Destroy; override;
  8.   property Regex_charClass: TRegex_charClass read FRegex_charClass;
  9. end;
  10.  
  11. implementation
  12.  
  13. constructor TTracker.Create;
  14. begin
  15.   inherited;
  16.   FRegex_charClass := TRegex_charClass.Create;
  17. end;
  18.  
  19. destructor TTracker.Destroy;
  20. begin
  21.   FRegex_charClass.Free;
  22.   inherited;
  23. end;
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #2 kdy: 10-06-2019, 16:51:08 »
Blbě jsem si to přečetl. Tak jestli správně rozumím tomu, o co se snažíš, tak řešení je dát si obě třídy do jedné unity a v TRegex_charClass si všechny metody kromě addAssertion() umístit do sekce protected. Tím, že to bude v jedné unitě, tak se TTracker dostane i na protected členy a metody té druhé třídy.
nil

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #3 kdy: 10-06-2019, 16:59:54 »
Díky za odpověď. Toho jsem se obával, že když to bude v jednom souboru tak to pro mě bude nepřehledné. Třída TTracker je už docela obsáhlá a když začnu dělat na regulárních výrazech tak to bude už jenom horší.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #4 kdy: 10-06-2019, 17:15:16 »
Unita se nedá rozdělit do více souborů?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #5 kdy: 10-06-2019, 19:38:13 »
Ja to robím tak, ako to navrhol Morrison. Akurát, že namiesto
Kód: Delphi [Vybrat]
  1. Regex.addAssertion('A','\w{3,5}\s');
budeš mať
Kód: Delphi [Vybrat]
  1. MyTracker.Regex.addAssertion('A','\w{3,5}\s');
To by snáď nemalo vadiť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 784
  • Karma: 43
    • Verze Delphi: 10.3
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #6 kdy: 10-06-2019, 21:16:54 »
Excellent
Rated 1 time
Unita se nedá rozdělit do více souborů?

Určitě by šlo část uložit do samostatného souboru s příponu .inc a ten pak do toho druhého (.pas) začlenit pomocí direktivy $I.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #7 kdy: 10-06-2019, 22:51:01 »
JJ, direktiva {$I} by šla použít. Přípona souboru může být libovolná, klidně i .pas. Jen to budou muset být asi dva soubory, protože bude potřeba oddělit to, co patří do sekce interface a to, co patří do implementation.
nil

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #8 kdy: 10-06-2019, 23:19:41 »
Tak to bylo právě to co jsem nevěděl, jak to naincludovat. Tak to dám teda do jednoho. Nejdříve to ale odladím samostatně.

Jinak mě ještě napadlo, že se zeptám, máte zkušenosti s tím jestli je nějaký výkonnostní rozdíl když napíšu dll ovladač třeba právě pro regulární výrazy v delphi a v c/c++? Stejný algoritmus, ale jen překompilováno jiným kompilátorem.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #9 kdy: 11-06-2019, 07:06:42 »
Excellent
Rated 1 time
Include je jednoduchý, všude, kde použiješ direktivu $I, je to jako bys vložil obsah includovaného souboru. Čili v tvém případě nějak takhle:

Uloženo jako soubor "RegexCharClass_interface.pas":
Kód: Delphi [Vybrat]
  1. TRegex_charClass = class
  2. private
  3.   ...
  4. protected
  5.   procedure SomeProtectedMethod(Arg: string);
  6.   ...
  7. public
  8.   procedure addAssertion(s1, s2: string);
  9.   ...
  10. end;
  11.  

Uloženo jako soubor "RegexCharClass_implementation.pas":
Kód: Delphi [Vybrat]
  1. procedure TRegex_charClass.addAssertion(s1, s2: string);
  2. begin
  3.   ...
  4. end;
  5.  
  6. procedure TRegex_charClass.SomeProtectedMethod(Arg: string);
  7. begin
  8.   ...
  9. end;
  10.  

A pak bude soubor, kde máš TTracker, třeba "Tracker.pas":
Kód: Delphi [Vybrat]
  1. unit Tracker;
  2.  
  3. interface
  4.  
  5. uses Classes,...;
  6.  
  7. type
  8.   {$I 'RegexCharClass_interface.pas'}
  9.  
  10.   TTracker = class
  11.   private
  12.     FRegex_charClass: TRegex_charClass;
  13.     ...
  14.   protected
  15.     ...
  16.   public
  17.     procedure SomeMethod(Arg: Integer);
  18.     ...
  19.   end;
  20.  
  21. implementation
  22.  
  23. {$I 'RegexCharClass_implementation.pas'}
  24.  
  25. procedure TTracker.SomeMethod(Arg: Integer);
  26. begin
  27.   // treba tady muzes pouzit FRegex_charClass.SomeProtectedMethod();
  28.   // TTracker na ni vidi, ale z vnejsku bude nedostupna
  29.   ...
  30. end;
  31.  
  32. end.
  33.  
« Poslední změna: 11-06-2019, 07:14:55 od Morrison »
nil

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak zpřístupnit třídu uvnitř třídy?
« Odpověď #10 kdy: 11-06-2019, 08:09:43 »
Chtěl jsem napsat, že to dám vše do jedné unity a do dvou souborů.