🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
3 messages
3 total messages Started by J-23 Sat, 10 Feb 2018 17:51
Element Kolekcji i plik
#346322
Author: J-23
Date: Sat, 10 Feb 2018 17:51
105 lines
3836 bytes
Witam,
Piszę komponent oparty na TCollection i TCollectionItem i generalnie 
wszystko fajnie działa.

A to fragment kodu

type
   TCustomPrinterRBM = class;
   TRaportItem = class;

type
   TRaportFile = string;

type

   { TRaportOpenDialogEditor }

   TRaportOpenDialogEditor = class(TClassPropertyEditor)
   private
   public
     procedure Edit; override;
     function GetAttributes: TPropertyAttributes; override;
     function GetValue: string; override;
   end;


type

   { TRaportItem }

   TRaportItem = class(TCollectionItem)
   private
     FCaption: string;
     FRaportFile: TRaportFile;
     procedure SetCaption(AValue: string);
   published
     property Caption: string read FCaption write SetCaption;
     property RaportFile: TRaportFile read FRaportFile;
   end;

type

   { TRaportList }

   TRaportList = class(TCollection)
   private
     FPrinter: TCustomPrinterRBM;
     function GetItem(Index: integer): TRaportItem;
     procedure SetItem(Index: integer; AValue: TRaportItem);
   protected
     function GetOwner: TPersistent; override;
   public
     constructor Create(Printer: TCustomPrinterRBM);
     destructor Destroy; override;
     function Add: TRaportItem;
     property Items[Index: integer]: TRaportItem read GetItem write 
SetItem; default;
   end;


type

   { TCustomPrinterRBM }

   TCustomPrinterRBM = class(TBaseComponentRBM)
   private
     FItems: TRaportList;
     FPrinterAction: TPrinterAction;
     FProjectRBM: TProjectRBM;
     FRaportPrinter: TRaportPrinter;
     procedure SetItems(AValue: TRaportList);
     procedure SetPrinterAction(AValue: TPrinterAction);
     procedure SetProjectRBM(AValue: TProjectRBM);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     procedure Execute; override;
     property ProjectRBM: TProjectRBM read FProjectRBM write SetProjectRBM;
     property PrinterAction: TPrinterAction read FPrinterAction write 
SetPrinterAction;
     property Items: TRaportList read FItems write SetItems;
   end;

implementation

{ TRaportOpenDialogEditor }

procedure TRaportOpenDialogEditor.Edit;
var
   OpenDlg: TOpenDialog;
begin
//Jak tu zapisać do stream zawartość pliku po wybraniu go z OpenDialog
end;

Generalnie wiem że muszę skorzystać z DrfineProperty bo chcę zapisać 
zawartość pliku do DFM i ją odczytać

Gdyby to była bezpośrednia własność komponentu to nie ma problemu 
wystarczy nadpisać metode DefineProperty i po kłopocie, problem w tym że 
plik (A właściwie jego zawartość) jest elementem kolekcji i tutaj nie 
mam pomysłu jak to obsłużyć.

Przeszukałem internet ale bez skutku.

Pozdrawiam
Re: Element Kolekcji i plik
#346323
Author: Krzysztof Szyszka
Date: Sun, 11 Feb 2018 09:21
60 lines
3611 bytes
[...]
>    { TRaportOpenDialogEditor }
>
>    TRaportOpenDialogEditor = class(TClassPropertyEditor)
>    private
>    public
>      procedure Edit; override;
>      function GetAttributes: TPropertyAttributes; override;
>      function GetValue: string; override;
>    end;
[...]
>
> implementation
>
> { TRaportOpenDialogEditor }
>
> procedure TRaportOpenDialogEditor.Edit;
> var
>    OpenDlg: TOpenDialog;
> begin
> //Jak tu zapisać do stream zawartość pliku po wybraniu go z OpenDialog
> end;
>
> Generalnie wiem że muszę skorzystać z DrfineProperty bo chcę zapisać zawartość pliku do DFM i ją
> odczytać
>
> Gdyby to była bezpośrednia własność komponentu to nie ma problemu wystarczy nadpisać metode
> DefineProperty i po kłopocie, problem w tym że plik (A właściwie jego zawartość) jest elementem
> kolekcji i tutaj nie mam pomysłu jak to obsłużyć.
>
> Przeszukałem internet ale bez skutku.

Podałeś deklaracje dla całej kolekcji, której używasz w klasie TCustomPrinterRBM, ale nie podałeś
żadnego jej związku z klasą TRaportOpenDialogEditor, która sądząc tylko po nazwie jest edytorem
(używanym tylko w design-time) do komponentu TReportOpenDialog.

Metoda TRaportOpenDialogEditor.Edit służy do wywołania domyślnej akcji na komponencie, więc
powinna pokazać jakieś okienko, które tą akcje wykonuje (np. dla TOpenDialog jest to wywołanie
akcji "Test Dialog", która pozwala na wybranie nazwy pliku). Ale to musi być akcja, która dotyczy
tego komponentu, dla którego został podłączony ten edytor w design-time, czyli u Ciebie to będzie
domyślnie akcja na komponencie TRaportOpenDialog.

Jeśli chcesz wykonywać coś na komponencie TCustomPrinterRBM, to musisz mieć do niego jakieś
połączenie z klasy TRaportOpenDialogEditor, np. property PrinterRBM: TCustomPrinterRBM,
które musi być ustawione przed wykonaniem double click na komponencie TRaportOpenDialog.

Równie dobrze możesz utworzyć własny edytor dla komponentu TCustomPrinterRBM, dla którego
jedna z akcji (prawy klik na komponencie i wybór z listy) będzie wykonywać to samo bez dodatkowego
komponentu TRaportOpenDialog.

W obu przypadkach edytory uruchamiane w design-time dostarczą Ci jedynie jakieś dane dla
komponentu, ale ich zapamiętanie w pliku dfm (i potem ładowanie z dfm) należy już do zadań
tego komponentu. P.S. Sprawdź, czy nie wystarczy zadeklarować zawartości pliku jako TStream.

-- 
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/ 
Re: Element Kolekcji i plik
#346324
Author: J-23
Date: Sun, 11 Feb 2018 22:17
56 lines
3570 bytes
W dniu 11.02.2018 o 10:21, Krzysztof Szyszka pisze:
> [...]
> 
> Podałeś deklaracje dla całej kolekcji, której używasz w klasie 
> TCustomPrinterRBM, ale nie podałeś
> żadnego jej związku z klasą TRaportOpenDialogEditor, która sądząc tylko 
> po nazwie jest edytorem
> (używanym tylko w design-time) do komponentu TReportOpenDialog.
> 
> Metoda TRaportOpenDialogEditor.Edit służy do wywołania domyślnej akcji 
> na komponencie, więc
> powinna pokazać jakieś okienko, które tą akcje wykonuje (np. dla 
> TOpenDialog jest to wywołanie
> akcji "Test Dialog", która pozwala na wybranie nazwy pliku). Ale to musi 
> być akcja, która dotyczy
> tego komponentu, dla którego został podłączony ten edytor w design-time, 
> czyli u Ciebie to będzie
> domyślnie akcja na komponencie TRaportOpenDialog.
> 
> Jeśli chcesz wykonywać coś na komponencie TCustomPrinterRBM, to musisz 
> mieć do niego jakieś
> połączenie z klasy TRaportOpenDialogEditor, np. property PrinterRBM: 
> TCustomPrinterRBM,
> które musi być ustawione przed wykonaniem double click na komponencie 
> TRaportOpenDialog.
> 
> Równie dobrze możesz utworzyć własny edytor dla komponentu 
> TCustomPrinterRBM, dla którego
> jedna z akcji (prawy klik na komponencie i wybór z listy) będzie 
> wykonywać to samo bez dodatkowego
> komponentu TRaportOpenDialog.
> 
> W obu przypadkach edytory uruchamiane w design-time dostarczą Ci jedynie 
> jakieś dane dla
> komponentu, ale ich zapamiętanie w pliku dfm (i potem ładowanie z dfm) 
> należy już do zadań
> tego komponentu. P.S. Sprawdź, czy nie wystarczy zadeklarować zawartości 
> pliku jako TStream.
> 

Ogólnie podsumowując to co napisałeś to było mi wiadome. Nie potrafiłem 
sobie tylko uzmysłowić jak użyć DefineBinaryProperty a to dlatego że 
klasa edytora nie dziedziczy po TPersistent i przeczyłem fakt ze 
TCollectionItem dziedziczy właśnie po TPersistent gdy po raz n-ty 
przeglądałem klasę TCollectionItem wpadłem właśnie na to że jest ona 
potomkiem TPersistent i już sprawa była dla mnie jasna i klarowana jak 
to działa - teraz tylko muszę uporządkować kod i napisać to tak by 
osiągnąć to co chce.

Dzięki za zainteresowanie

PS. jak się uporam z tematem i będzie chwila wolna to umieszcze jakiś 
prosty przykład realizujący to co chciałem osiągnąć tak by było dla 
potomnych.

Pozdrawiam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads