![]() |
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 ?
|
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.
|
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...
|
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; |
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:
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.
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; Grüße aus Hannover |
AW: DBEdit Farbe ändern bei ReadOnly - Welches Event
Mason hat vor einigen Monaten das gleiche Problem gehabt, und er hat's mit der
![]() Das mit der CM_CM_GETDATALINK Message ist eigentlich die "perfekte" Lösung in meinen Augen. Hab ich komplett übersehen. |
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 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz