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
Author: J-23
Date: Sat, 10 Feb 2018 17:51
Date: Sat, 10 Feb 2018 17:51
105 lines
3836 bytes
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
Author: Krzysztof Szyszka
Date: Sun, 11 Feb 2018 09:21
Date: Sun, 11 Feb 2018 09:21
60 lines
3611 bytes
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
Author: J-23
Date: Sun, 11 Feb 2018 22:17
Date: Sun, 11 Feb 2018 22:17
56 lines
3570 bytes
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