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 Untereigenschaften leider grün (https://www.delphipraxis.net/79726-untereigenschaften-leider-gruen.html)

stahli 27. Okt 2006 01:17


Untereigenschaften leider grün
 
Hallo alle,

ich bastle gerade (mit D7 Prof) an DB-Komponenten
{
Das Konzept: Die Kompos sollen Daten aus einer IB-Datenbank anzeigen und bearbeiten, und zwar unabhängig vom aktuellen Datensatz der DataSets.
Dazu werden ein paar Eigenschaften eingestellt und dann automatisch interne dynamische SQL-Statements zum Abrufen oder Ändern erzeugt ausgeführt. Bei Änderungen wird das angebundene Dataset geschlossen, neu geöffnet und der vorherige Datansatz wieder lokalisiert. Man kann in den Eigenschaften immer auch einen "ID-Wert" definieren (sofern die betreffende Tabelle über ein ID-Feld verfügt), woraufhin dann immer DER entsprechende Datensatz verwendet wird. Im Ergebnis hat man Komponenten, die sich aus einer Datenbank immer automatisch auf "Ihre Daten" beziehen, ohne dass dies Auswirkungen auf andere Komponenten hat, es wird durch sie keine Datensatzposition verändert, und wenn doch (z.B. durch ein externes DBGrid), zeigen die Kompos immer weiter "Ihre" Daten an (bis es mal Änderungen an "Ihrem" Datensatz gibt). Änderungen werden sofort gespeichert und aktualisiert, einen dsEdit-Modus gibt es hier praktisch nicht mehr.
Es gibt auch eine Kompo, die mehrere Datensätze anzeigt (ähnlich einen BDGrid) und z.B. automatisch Verschiebungen der Positionen durch Drag&Drop ermöglicht.
Grundsätzlich hat das schon funktioniert, ich bin aber nun am Aufräumen und Optimieren.
Wer das verstanden und Interesse hat... gerne.
}
, so z.B.
Delphi-Quellcode:
  TDBEditSql = class(TCustomEdit)
  private
    FOldText:String;
    FDBSql:TDBSql;
  ...
  published
    property DBSQL:TDBSQL read FDBSQL write FDBSQL;
  end;
Die gesamte (zumindest wesentliche) Datenbanklogik will ich nun möglichst in TDBSql kapseln, damit ich sie auch in anderen Komponenten weiterverwerten kann und die Kompos übersichtlich bleiben.
Delphi-Quellcode:
  TDBSql=class(TComponent)
  private
    FFieldName:String;
    FField:TField;
    FValue:String;
  ...
  published
    property EnabledControl:Boolean read FEnabledControl write SetEnabledControl;
    property FieldName:string read FFieldName write SetFieldName;
    property DataSource:TDataSource read GetDataSource write SetDataSource;
    ...
  end;
TDBEditSql ist registriert, im Objektinspektor wird DBSql zum Aufklappen angeboten und die veröffentlichten (Unter-)Eigenschaften können auch eingegeben werden (ohne extra einen Editor geschrieben zu haben!).
Das funktioniert soweit super, nur werden die Eigenschaften grün dargestellt und weder von der IDE gespeichert noch in die Exe übergeben.

Testweise habe ich TDBSql registriert, ins Formular eingesetzt und ein paar Eigenschaften definiert. Dann ist alles "normal" (schwarze Schrift und werden gespeichert).

Wie kann ich die Untereigenschaften "schwarz machen" ;-)) ?

Danke schon mal
von Stahli

@MaBuSe: Ich bin beeindruckt, was Du hier leistest!!! Konnte aber trotzdem noch keine Lösung für mich finden...

[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]

mkinzler 27. Okt 2006 06:48

Re: Untereigenschaften leider grün
 
Wie sieht der Konstruktor aus? Wird FDBSql instantiiert?

stahli 27. Okt 2006 10:35

Re: Untereigenschaften leider grün
 
Hallo mkinzler,

hier die beiden Konstruktoren, wie gesagt, ich bin beim auffäumen ;-)
Wenn ich DBSql in das Formular setze, ist alles wie immer, nur als Unterobjekt in DBEditSql werden die Eigenschaften nicht mit dem Projekt gespeichert...

Delphi-Quellcode:
constructor TDBEditSql.Create(AOwner: TComponent);
begin
  inherited;
  FDBSql:=TDBSql.Create(Self);
end;

constructor TDBSql.Create(AOwner: TComponent);
begin
  inherited;
  FFieldDataLink:=TFieldDataLink.Create;
  FieldDataLink.Control:=Self;
  FieldDataLink.OnDataChange:=DataChange;
  FFieldName:='';
  FField:=nil;
  FValue:='';
  FEnabledControl:=True;
  FDataChangingFlag:=False;
  FDataInactiveFlag:=False;
  FNewDataFlag:=False;
  FShowingFlag:=False;
  FChangingFlag:=False;
  FDefineFieldsFlag:=False;
  FBlockedFlag:=False;
  IdData:=True;
  FIdFieldName:='';
  FIdValue:='';
  FIdSQL:='';
  FIdField:=nil;
  FIdIBQuery:=nil;
end;
Gruß Stahli

stahli 20. Jan 2007 20:24

Re: Untereigenschaften leider grün
 
Hallo nochmal,

ich konnte das Problem leider noch nicht klären...
Im Grunde will ich meine "Unterkomponente" so ähnlich wie TFont im Datenformular speichern.

In der DFM-Datei steht zu Font:
Delphi-Quellcode:
            object Edit1: TEdit
              Left = 40
              Top = 88
              Width = 121
              Height = 20
              Font.Charset = OEM_CHARSET
              Font.Color = clWindowText
              Font.Height = -12
              Font.Name = 'Terminal'
              Font.Style = [fsBold, fsItalic]
              ParentFont = False
              TabOrder = 0
              Text = 'Edit1'
            end
Meine Komponente wird im Formular so gespeichert:
Delphi-Quellcode:
  object DBSqlId1: TDBSqlId
    DataSource = DataModule1.DataSource1
    FieldName = 'Titel'
    Text = 'hjghjhgjghjghj'
    DisplayText = 'hjghjhgjghjghj'
    EnabledControl = True
    IdMode = True
    SortValue = 0
    SortIdValue = 0
    Left = 216
    Top = 16
  end
Wenn aber meine Komponente einer Unterkomponente einer anderen ist, sieht es nur so aus:
Delphi-Quellcode:
            object DBEditSql1: TDBEditSql
              Left = 11
              Top = 24
              Width = 305
              Height = 21
              MaxLength = 60
              TabOrder = 0
              DBSqlId = DBEditSql1.DBEditSql1_DBSqlId
            end
Das möchte ich gern:
Delphi-Quellcode:
            object DBEditSql1: TDBEditSql
              Left = 11
              Top = 24
              Width = 305
              Height = 21
              MaxLength = 60
              TabOrder = 0
              ...!!!
              DBSqlId.DataSource = DataModule1.DataSource1
              DBSqlId.FieldName = 'Titel'
              DBSqlId.Text = 'hjghjhgjghjghj'
              DBSqlId.DisplayText = 'hjghjhgjghjghj'
              DBSqlId.EnabledControl = True
              DBSqlId.IdMode = True
              DBSqlId.SortValue = 0
              DBSqlId.SortIdValue = 0
              ...!!!
            end
Hat jemand einen Tipp? Im Objektinspektor ist alles bereits wunderbar, nur das Speichern funktioniert noch nicht.

Ich denke, ich müsste die Speicher- und Load-Procedure erweitern, aber wie?

Danke von Stahli

Hawkeye219 20. Jan 2007 21:10

Re: Untereigenschaften leider grün
 
Hallo Stahli,

vielleicht fehlt nur eine Zeile in deinem Quelltext:

Delphi-Quellcode:
constructor TDBEditSql.Create(AOwner: TComponent);
begin
  inherited;
  FDBSql:=TDBSql.Create(Self);
  FDBSql.SetSubComponent (True); // neu
end;
Gruß Hawkeye

stahli 20. Jan 2007 21:49

Re: Untereigenschaften leider grün
 
@Hawkey219

DANKE!!! Das habe ich gesucht und nicht gefunden, obwohl es in der Hilfe steht... :wall:

Stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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