Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Klasse für data aware components (Data Controls) (https://www.delphipraxis.net/101328-klasse-fuer-data-aware-components-data-controls.html)

dfabian 11. Okt 2007 14:10


Klasse für data aware components (Data Controls)
 
Jo hallo, :)

ich suche eine Klasse für data aware components (TDBEdit, TDBComboBox, etc.).

Ich möchte eine Message ausgeben, sobald ein Control die DataSource ds_test besitzt.
Jemand ne Idee?

Gruß
Daniel

s-off 11. Okt 2007 14:13

Re: Klasse für data aware components (Data Controls)
 
Hallo,

Deine Anforderung verstehe ich nicht:

Gehe ich recht in der Annahme, dass sich zur Laufzeit die DataSource-Eigenschaft Deiner datensensitiven Komponenten ändert, und Du benachrichtigt werden möchtest, sobald bei einem der Controls die Datasource auf xxx gewechselt wird?

dfabian 11. Okt 2007 14:16

Re: Klasse für data aware components (Data Controls)
 
Nein, ganz einfach. Auf einer Form hab ich mehere DB Controls und per klick auf einem Button möchte ich von jedem einzelnen DBControl auf der Form den Namen seiner DataSource per showMessage ausgeben. :-D

s-off 11. Okt 2007 14:42

Re: Klasse für data aware components (Data Controls)
 
Ohje, das konnte ich aus Deinem Eröffnungsthread nun wirklich gar nicht herauslesen :?

Also in dem Fall müsstest Du über sämtliche Komponenten Deiner Form iterieren und dann mittels der RTTI deren Eigenschaften abfragen.

Stichworte hier:
ComponentCount
PPropInfo
GetPropValue

Edit: Die RTTI-Methoden findet Du in der Unit 'TypInfo'.

webcss 11. Okt 2007 14:50

Re: Klasse für data aware components (Data Controls)
 
oder, ohne RTTI, die Controls iterieren und dann
Delphi-Quellcode:
ShowMessage('Ich bin ' + Control.Datasource.Name + '! ;) ');

dataspider 11. Okt 2007 14:54

Re: Klasse für data aware components (Data Controls)
 
Hi,

Ich denke, per RTTI ist der bessere Weg.
Hier ein Codeschnipsel zum Probieren:

Delphi-Quellcode:
uses
  TypInfo, DB...
...
procedure TForm1.Button1Click(Sender: TObject);
Var
  i: Integer;
  AObject: TObject;
Const
  PropName = 'DataSource';

begin
  for i := 0 to ControlCount - 1 do
  begin
    if IsPublishedProp(Controls[i], PropName) then
    begin
      AObject := GetObjectProp(Controls[i], PropName);
      if Assigned(AObject) then
        Memo1.Lines.Add(Controls[i].Name + ' = ' + (AObject as TDataSource).Name)
      else
        Memo1.Lines.Add(Controls[i].Name + ' = nil');
    end;
  end;
end;
Frank

dfabian 11. Okt 2007 15:02

Re: Klasse für data aware components (Data Controls)
 
Schön, so ein Schnipsel... :???:
Achso, danke nochmals. Wie soll ich sagen... it works! :thumb:

s-off 11. Okt 2007 15:06

Re: Klasse für data aware components (Data Controls)
 
Zitat:

Zitat von dfabian
Schön, so ein Schnipsel... :???:

Wenn man sie auch versteht schon. Ansonsten ist es effektiver, wenn man sich das Ganze anhand von Stichworten, die ja genannt worden sind, selber zusammensucht - so bleibt es besser im Gedächtnis :zwinker:

dfabian 11. Okt 2007 15:10

Re: Klasse für data aware components (Data Controls)
 
Zitat:

Zitat von s-off
Zitat:

Zitat von dfabian
Schön, so ein Schnipsel... :???:

Wenn man sie auch versteht schon. Ansonsten ist es effektiver, wenn man sich das Ganze anhand von Stichworten, die ja genannt worden sind, selber zusammensucht - so bleibt es besser im Gedächtnis :zwinker:

So siehts aus. Danke für den Denkanstoß. :-D

shmia 11. Okt 2007 17:44

Re: Klasse für data aware components (Data Controls)
 
Man kann auch ausgehend von der DataSource rückschliesen auf alle verbundenen DB aware Controls.
Diese Controls könnten ja auch auf einem anderen Formular oder Frame liegen.
Für jedes Control gibt es einen internen TDataLink.
Und das geht so:
Delphi-Quellcode:
type
   TDataSourceCracker=class(TDataSource);

procedure TForm1.Button1Click(Sender: TObject);
var
   dlist : TList;
   i : Integer;
   dlink : TDataLink;
   control : TComponent;
begin
   dlist := TDataSourceCracker(DataSource1).DataLinks;
   for i := 0 to dlist.Count-1 do
   begin
      dlink := TDataLink(dlist[i]);

      if dlink is TFieldDataLink then
      begin
         control := TFieldDataLink(dlink).Control;
         memo1.lines.add('Control: ' +control.GetNamePath+ ' Fieldname:'+TFieldDataLink(dlink).FieldName);
      end;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Seite 1 von 2  1 2      

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