Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DBEdit Farbe ändern bei ReadOnly - Welches Event (https://www.delphipraxis.net/161038-dbedit-farbe-aendern-bei-readonly-welches-event.html)

mschaefer 13. Jun 2011 19:51

Datenbank: egal • Version: egal • Zugriff über: egal

DBEdit Farbe ändern bei ReadOnly - Welches Event
 
In einer abgeleiteten DBEdit-Komponente möchte ich die Hintergrundfarbe ändern, wenn der DataSet nur im ReadOnly-Modus ist. Welches Event bekommt die Änderung des DataSet-Status mit ?

Stevie 13. Jun 2011 21:11

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Das wird so einfach nicht gehen, das ReadOnly wird über den TFieldDataLink gesteuert und der ist leider private.

mschaefer 13. Jun 2011 21:49

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Ja und OnDataChange ist auch private. Sich an die zugehörge Datasource zu hängen ist auch schon gescheitert. Bei Memos bekomme ich es im Moment nur bei Blobfeldern hin, da LoadMemo nur protected ist. Das bringt mich noch in den Wahn...

Stevie 13. Jun 2011 22:46

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Einfach mal so runtergeschrieben und ein wenig mit nem simplen Programm getestet:

Delphi-Quellcode:
type
  TDataSourceHack = class(DB.TDataSource)
  end;

  TControlHack = class(Controls.TControl)
  end;

// kommt ins OnDataChanged der DataSource - könnte man auch über das abgeleitete DBEdit dranhängen
var
  Link: Pointer;
begin
  for Link in TDataSourceHack(Sender).DataLinks do
  begin
    if (TObject(Link) is TFieldDataLink)
      and (TFieldDataLink(Link).Control is TControl) then
    begin
      if TDataSourceHack(Sender).DataSet.CanModify
        and (not Assigned(TFieldDataLink(Link).Field)
        or not TFieldDataLink(Link).Field.ReadOnly) then
        TControlHack(TFieldDataLink(Link).Control).Color := clWindow
      else
        TControlHack(TFieldDataLink(Link).Control).Color := clBtnFace;
    end;
  end;
end;

mschaefer 14. Jun 2011 15:04

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Hallo Stefan,

zunächst mal Danke. Du hast das doch mit Raffinesse garniert, denn so kann man mehrere Komponenten im DataSource.OnChange-Event aus umfärben.

Für meine Komponente hätte dies zur Folge gehabt, dass ich die Property-Zuweisungen für Datafield und Datasource hätte neu schreiben müsssen um mit der Zuweisung den Zeiger auf das DataSource.OnChange zu bekommen. Habe mich nun für einen anderen Weg entschieden:

Delphi-Quellcode:
constructor TC_DBMemo.Create(AOwner: TComponent);
begin
   inherited;
   { ...                   }
   FDataLink := TFieldDataLink(self.Perform(CM_GETDATALINK, 0, 0));
   PtrDataChange            := FDataLink.OnDataChange;
   FDataLink.OnDataChange   := OnNowDataChange;
end;

procedure TCR_DB_Memo.OnNowDataChange(Sender: TObject);
begin
   if DataSource <> nil then
      if DataSource.DataSet <> nil then
      begin
        if   FDataLink.ReadOnly = true
        then color:=clwindows
        else color := clblue;
      end;
   ;
   PtrDataChange( Sender );
end;
Da Private OnDataChange dem DataLink nach dem inherited im Create zugewiesen ist, habe ich einen Pointer auf die Private-Procedure und kann den zwischenspeichern. Hätte wohl noch einen Weg über Interfaces gegeben, aber die Webseite kennst Du ja bestens.

Grüße aus Hannover

Stevie 17. Jun 2011 09:07

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Mason hat vor einigen Monaten das gleiche Problem gehabt, und er hat's mit der Keule gelöst ;)

Das mit der CM_CM_GETDATALINK Message ist eigentlich die "perfekte" Lösung in meinen Augen. Hab ich komplett übersehen.

mschaefer 17. Jun 2011 09:21

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
 
Keulen gehören auf den Grill :), aber die ist ziemlich allgemein, Danke für den Link !


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