AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken DBEdit Farbe ändern bei ReadOnly - Welches Event

DBEdit Farbe ändern bei ReadOnly - Welches Event

Ein Thema von mschaefer · begonnen am 13. Jun 2011 · letzter Beitrag vom 17. Jun 2011
Antwort Antwort
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#1

DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 13. Jun 2011, 20:51
Datenbank: egal • Version: egal • Zugriff über: egal
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 ?
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 13. Jun 2011, 22:11
Das wird so einfach nicht gehen, das ReadOnly wird über den TFieldDataLink gesteuert und der ist leider private.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 13. Jun 2011, 22:49
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...
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 13. Jun 2011, 23:46
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 14. Jun 2011, 16:04
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
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 17. Jun 2011, 10:07
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: DBEdit Farbe ändern bei ReadOnly - Welches Event

  Alt 17. Jun 2011, 10:21
Keulen gehören auf den Grill , aber die ist ziemlich allgemein, Danke für den Link !
Martin Schaefer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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