Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene TImage Komponente mit Dataset (https://www.delphipraxis.net/169855-eigene-timage-komponente-mit-dataset.html)

Heiko54 16. Aug 2012 12:57

Eigene TImage Komponente mit Dataset
 
Hallo Zusammen,

ich habe eine Komponente von TImage abgeleitet. Diese hat einige Daten intern gespeichert, diese
möchte ich in einem Grid visualisieren. Dazu veröffentliche ich das DataSet in der Komponente.

Mein Problem ist jetzt, dass ich im Designer in einer auf der Form liegenden
DataSource Komponente im Property Editor unter DataSet
mein OwnComponent.DataSet nicht angeboten bekommen.

Habt ihr dazu eine Idee?

himitsu 16. Aug 2012 13:26

AW: Eigene TImage Komponente mit Dataset
 
Ist dein DataSet-Property als Published deklariert?

Kannst du in der DataSource das "OwnComponent.DataSet" manuell eintragen und nimmt Delphi es auch an?

Heiko54 16. Aug 2012 14:05

AW: Eigene TImage Komponente mit Dataset
 
ist als published deklariert.

in FormCreate kann ich dies zuweisen.
im Designer bekomm ich eine Exception "Ungültiger Eigenschaftswert".

Mit welchen Werten / Objekten füllt der Designer die Auswahllisten?
Verwendet er Infos aus der Klasse oder aus dem DFM, dieses hab ich ja nicht?

himitsu 16. Aug 2012 14:31

AW: Eigene TImage Komponente mit Dataset
 
Um welche Delphiversion handelt es sich denn?

So, ich hab grade kurz nachgesehn und getestet.

Ich kann hier nicht direkt auf das "DataSet"-Property zugreifen, aber auf die DataSet-Komonente in dem "DataSet" geht es, wenn da als Owner deren Elternkomponente angegeben ist.

Dort im Property-Editor geht es also nur auf die DFMs und nicht auf die Klassen.

Bei uns sieht es in etwa so aus
Delphi-Quellcode:
type
  TMyImage = class(TImage)
  private
    FDataSet: TDataSet;
  published
    constructor Create(Owner: TComponent); override;
    property DataSet: TDataSet read FDataSet stored False;
  end;

constructor TMyImage.Create(Owner: TComponent);
begin
  inherited;
  FDataSet := TDataSet.Create(Self);
  FDataSet.Name := 'ImageDataSet';
end;
und auf der form liegt ein "MyImage1" rum.

Mit "MyImage1.DataSet" geht es nicht, aber "MyImage1.ImageDataSet" funktioniert.



(Wir haben sogar schon Form/Frame übergreifenden Zugriff und der Propertyeditor bietet uns das auch zur Auswahl an, also wenn die Unit/DFM im selben Package oder zumindestens im Delphi geöffnet ist und natürlich in den Uses drinsteht)

Bummi 16. Aug 2012 15:12

AW: Eigene TImage Komponente mit Dataset
 
Delphi-Quellcode:
  TCTFlowDatalink = class(TDataLink)
  private
    FFieldCount: Integer;
    FModified: Boolean;
    FInUpdateData: Boolean;

  protected
    procedure ActiveChanged; override;
    procedure DataSetChanged; override;
    procedure DataSetScrolled(Distance: Integer); override;
    procedure LayoutChanged; override;
    procedure RecordChanged(Field: TField); override;
    procedure UpdateData; override;
  public
    constructor Create(aCTFlow: TCTFlow);
    destructor Destroy; override;
    procedure Modified;
    procedure Reset;
    property FieldCount: Integer read FFieldCount;
  end;



TCTFlow...
Private
    FDataLink: TCTFlowDatalink;
    function GetDataSource: TDataSource;
    procedure SetDataSource(const Value: TDataSource);
Public
    constructor Create(AOwner: Tcomponent);
    destructor Destroy;overload;
Published

    property DataSource: TDataSource read GetDataSource write SetDataSource;
...

implementation
constructor TCTFlow.Create(AOwner: Tcomponent);
begin
  inherited;
....
  FDataLink := CreateDataLink;
end;
destructor TCTFlow.Destroy;
begin
  ......
  FreeAndNil(FDataLink);
  inherited;
end;

function TCTFlow.GetDataSource: TDataSource;
begin
  Result := FDataLink.DataSource;
end;

procedure TCTFlow.SetDataSource(const Value: TDataSource);
begin
  if Value = FDataLink.DataSource then
    Exit;
  if Assigned(Value) then
    if Assigned(Value.DataSet) then
      if Value.DataSet.IsUnidirectional then
        DatabaseError(SDataSetUnidirectional);
  FDataLink.DataSource := Value;
  if Value <> nil then
    Value.FreeNotification(self);
end;

function TCTFlow.CreateDataLink: TCTFlowDatalink;
begin
  Result := TCTFlowDatalink.Create(self);
end;
.....

Heiko54 17. Aug 2012 08:44

AW: Eigene TImage Komponente mit Dataset
 
Danke ihr beiden für die Antworten.

hab himitsus Ansatz verfolgt. Jetzt sieht es im Form Designer schon logischer aus.

himitsu 17. Aug 2012 09:07

AW: Eigene TImage Komponente mit Dataset
 
Wenn du die interne Komponente so nennst, wie das Property, dann sieht es bestimmt noch logischer aus. (das sollten wir hier wohl auch mal machen :stupid: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz