Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tedit disabled (https://www.delphipraxis.net/7437-tedit-disabled.html)

ketraun 12. Aug 2003 11:44


Tedit disabled
 
hi,
wieder ein Problem mit Tedit.
wie ändert man die Farbe des Textes, wenn das Ding disabled ist?
Kann mir jemand helfen?
ketraun

neolithos 12. Aug 2003 12:17

Re: Tedit disabled
 
Das ist ein Weg:

Delphi-Quellcode:
  TNewEdit = class (TEdit)
  protected
    procedure SetEnabled(Value: Boolean); override;
  end;


procedure TNewEdit.SetEnabled(Value: Boolean);
begin
  inherited;
  if Value then
     Font.Color := clWindowText
  else
     Font.Color := clBtnFace;
end;

ketraun 12. Aug 2003 12:56

Re: Tedit disabled
 
hi,
tut mir leid aber das funktioniert nicht!
ketraun

neolithos 12. Aug 2003 13:05

Re: Tedit disabled
 
Genaures bitte :chat: ! Warum nicht?

sakura 12. Aug 2003 13:40

Re: Tedit disabled
 
@Ketraun: Hast Du dem Beitrag entnehmen können, daß Du dazu einen neue Komponente erstellen musst und diese auch in Delphi installieren mußt? Wenn nicht, dann wunder Dich nicht, neolithos hätte das wenigstens noch dazu schreiben können ;-)

...:cat:...

neolithos 12. Aug 2003 14:14

Re: Tedit disabled
 
Erstmal Entschuldigung!

Noch eine Variante ohne das man gleich ein neues Control erzeugen muss! Hab ich selbst aber leider noch nicht getestet!


Es gibt eine VCL-Nachricht namens CM_ENABLEDCHANGED, welche intern in SetEnabled abgeschickt wird.

Man muss sich nur an den Message-Handler des Edit-Controls anhängen.

Delphi-Quellcode:
TMyForm = class(...
  ...
  private
    pOldEdProc : TWndMethod;
    procedure EdProc(var Message: TMessage);
 
procedure TMyForm.FormCreate(...);
begin
  ...
  pOldEdProc := txtEd.WindowProc;
  txtEd.WindowProc := EdProc;
  ...
end;

procedure TMyForm.EdProc(var Message: TMessage);
begin
  pOldEdProc(Message); // andere Hacken unterstützen
  with Message do
    case Msg of
         CM_ENABLEDCHANGED:
           if txtEd.Enabled then
              ...
           else
              ...;
    end;
end;
Frage an den Moderator: Kann man nicht so was (ganz allgemein gehalten)als FAQ oder Source-Code ablegen?

ketraun 12. Aug 2003 14:44

Re: Tedit disabled
 
hi,
ich bin ja nicht doof, natürlich hab ich eine neue Komponente erstellt.
In der Entwicklungsumgebung gejts, nur zur Laufzeit nicht!
Der Alignmentkram muss nicht interressieren, ist zum Ausrichten gedacht!
Mach ich was falsch? Oder steht ich auf der Leitung?

ketraun
Delphi-Quellcode:
type
  TmaskeditL = class(Tmaskedit)
  private
    { Private-Deklarationen }
    fAlignment : TAlignment;
    fcolor:tcolor;
  protected
    { Protected-Deklarationen }
    procedure SetEnabled(Value: Boolean); override;
  public
    { Public-Deklarationen }
    procedure SetAlignment(const Value: TAlignment);
    procedure Setfcolor (const Value: Tcolor);
    procedure CreateParams(var Params: TCreateParams);override;
  published
    { Published-Deklarationen }
    property Alignment : TAlignment read fAlignment write SetAlignment;
    property dis_color:Tcolor      read fcolor    write Setfcolor;
  end;

procedure Register;

implementation

procedure TmaskEditL.SetAlignment(const Value: TAlignment);
begin
  if Value <> fAlignment then
     begin
       fAlignment := Value;
       RecreateWnd; // erzeuge Fenster neu -> CreateParams
     end;
end;

procedure TmaskEditL.Setfcolor (const Value: Tcolor);
begin
   fcolor:=value;
end;

procedure TmaskEditL.CreateParams(var Params: TCreateParams);
const
  cAlignStyles: array [TAlignment] of Cardinal = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited;
  with Params do
    Style := Style or cAlignStyles[fAlignment];//taRightJustify];
end;

procedure TmaskEditL.SetEnabled(Value: Boolean);
begin
  inherited;
  if Value then
     Font.Color := clWindowText
  else
     Font.Color := fcolor;
end;

procedure Register;
begin
  RegisterComponents('Zusätzlich', [TmaskeditL]);
end;
[edit=Luckie]Delphi-Tags hinzugefügt. Mfg, Luckie[/edit]

ketraun 12. Aug 2003 15:06

Re: Tedit disabled
 
hi,

so gehts offensichtlich nicht:
Code:
procedure TmaskEditL.SetEnabled(Value: Boolean);
begin
  inherited;
  if Value then
     Font.Color := clWindowText
  else
     Font.Color := fcolor;
   invalidate;
end;
nach dem inherited ist offensichtlich alles vorbei. Es nützt also garnichts hier die Farbe zu ändern!
ketraun

ketraun 13. Aug 2003 08:50

Re: Tedit disabled
 
hi,
Kann mir jemand erklären warum dieses Verfahren in der IDE funktioniert, aber nicht zur Laufzeit! Die Compilereistellung ist es nicht, ist für beides eingestellt.
Wo ist der Unterschied zwischen IDE und laufendem Programm?
ketraun

neolithos 13. Aug 2003 11:01

Re: Tedit disabled
 
Bei mir sieht es fast genauso aus, nur das ich den Brush ändere. Es Funktioniert!

Schon mal mit dem Debugger die Werte kontrolliert!
Was steht in fColor, Value, Font.Color zu welcher Zeit?

Nimm mal das Invalidate heraus. Ich hab nämlich gerade das selbe für den Font gemacht und es Functioniert einwandfrei.

ketraun 13. Aug 2003 11:19

Re: Tedit disabled
 
hi,
es funktioniert nur in der IDE, nicht zur Laufzeit. Keine Ahnung warum.
Das Invalidate war nur ein nutzloser Versuch das Ding nochmal zu zeichnen!
Ich werd das Ding nochmal Debuggen. Danke.
ketraun

ketraun 13. Aug 2003 11:31

Re: Tedit disabled
 
hi,
setfcolor wird bei mir zur Laufzeit nie mehr angeprungen. Nur einmal beim Start!
Wo liegt der Haken?
Delphi5 + Win2000
ketraun

Alexander 13. Aug 2003 13:08

Re: Tedit disabled
 
Zitat:

Frage an den Moderator: Kann man nicht so was (ganz allgemein gehalten)als FAQ oder Source-Code ablegen?
Bin zwar kein Moderator :mrgreen:, aber du kannst doch einen eigenen Code-Library-Eintrag selbst erstellen.
Solltest du vielleicht auch machen.

Wenn du in der Spartenübersicht bist, dann sollte weiter unten was mit "neuen beitrag in die Code-Library" oder so ähnlich ;-) stehen.

neolithos 13. Aug 2003 13:21

Re: Tedit disabled
 
Alle Eigenschaften werden in einer Resource gespeichert. Dadurch wird SetFColor nur einmal innerhalb Loaded aufgerufen, da in diesen Moment die Resource-Daten geladen und ausgewertet werden.

Trotzdem kann es daran so richtig nicht liegen!

ketraun 13. Aug 2003 14:15

Re: Tedit disabled
 
hi,
ich hab mittlerweile Zweifel ob das überhaupt geht!
3 Delphiversionen auf 3 verschiedenen Rechnern, überall das Gleiche.
Gibts hier denn niemand der mal drüberschauen kann.
Ich hab den Verdacht ich mach etwas prinzipiell falsch!
Bitte bitte
ketraun

neolithos 13. Aug 2003 15:12

Re: Tedit disabled
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei mein Edit-Object welches sich schon seit ca. 2 Jahren bewährt hat.

Die Unit und das object ist so nicht verwendbar. Da ich mehre Zeilen entfernt habe (normalerweise stehen in dieser Unit mehrer Objecte mit ca. 4000 Zeilen Code).

Aber ich hoffe es hilft.

ketraun 13. Aug 2003 16:49

Re: Tedit disabled
 
hi,
es hat keinen Zweck. Es geht so nicht.
Ich hab Zeile für Zeile deinen Code übernommen. Kein Erfolg.
Ich gebs auf.
Mein Gesamtprogramm umfasst an die 230000 Zeilen, ich kann nicht so viel Zeit mit dieser Kleinigkeit verplempern. Wäre schön gewesen! Kann man nix machen.
Nochmal Danke für die Mühe.
ketraun

neolithos 13. Aug 2003 16:53

Re: Tedit disabled
 
Tschade solche Details machen immer den Programmierer glücklich!

Doch bei solch einem Program-Umfang kann das auch an etwas anderen liegen!

Meist läuft eins ins andere und Erfahrungsgemäß kann man nicht an jedes Detail denken!
:wink:

Schlaf mal drüber manchmal kommt es dann!

ketraun 13. Aug 2003 16:58

Re: Tedit disabled
 
hi,
bin Profi, hab das Ding natürlich extern getestet. ( Nicht im Code )
Was ist eigentlich mit dir, was steht in den vielen pw.... in der Uses Klausel?
Hast du vielleicht doch etwas in Petto was ich nicht kenne?
ketraun

neolithos 13. Aug 2003 17:24

Re: Tedit disabled
 
Liste der Anhänge anzeigen (Anzahl: 2)
PWCtrls ist mein eigenes selbstgeschriebes privates Package (einzig auf meinem Rechner vorhanden), welche derzeitig in der 3 Version ist (noch stark in arbeit). (das sind derzeitig ca. 2 Jahre arbeit, 20 Datei zu 500 kB Code gehackt)

Das Edit zum Beispiel kann:
- sich Ausrichtungen (Links, Rechts, Zentriert)
- Färbt sich bei Änderung des Enable-Status um
- einen Schalter in sich aufnehmen (Inplace-Controls)

Ursprünglich ist sie daraus entstanden, dass ich jedes Control bevor ich es nutze, einmal Ableite egal ob ich irgentwas an jedem ändern möchte.

Daher stehen manchmal solche Zeilen im Code:

Delphi-Quellcode:
  TPWCoolBar = class (TCoolBar);
  TPWToolBar = class (TToolBar);
Interessant sind die Resource-Function, OLE-Clipboard und Formular. Leider weiß ich bis heute noch nicht ob ich sie so einfach veröffentlichen möchte. Da wie gesagt sehr viel Zeit und Schweiß trinne steckt.


Nochmal kurz zur Abkürzung PW:

Perfect Working seit QBasic-Zeiten vor vielen Jahren mein Motto


Anbei nur ein einblick, nicht vollständig
damit du vielleicht mich verstehts

ketraun 13. Aug 2003 17:34

Re: Tedit disabled
 
hi,
ich versteh dich. Du sollst ja auch keinen Code rausrücken. Code ist pures Geld. Ich mach das seit 25 Jahren und weiss von was ich rede.

Ich komm bloss nicht dahinter was bei mir schief läuft. Das ärgert und wurmt mich so, dass ich doch weiter bohre.

Vielleicht kommt dir doch noch die grosse Erkenntnis! Ich kanns für Heute jedenfalls nicht mehr sehen.

ketraun

neolithos 13. Aug 2003 17:48

Re: Tedit disabled
 
Änders du den Font bei dem Edit-Control.

Noch ne andere Idee ich werde es mal versuchen über
CN_CTLCOLOREDIT (bzw. WN_CTLCOLOREDIT)

ketraun 14. Aug 2003 07:12

Re: Tedit disabled
 
hi,
nein hab den Font nicht geändert, alles schon probiert.
ketraun

ketraun 14. Aug 2003 09:07

Re: Tedit disabled
 
hi,
du hast, darauf könnte ich meinen Kopf verwetten, irgendwo die invalidate Methode von Tcontrol überschrieben!
Soweit konnte ich das zurückverfolgen.
Ich hab jetzt eine eigene Methode für invalidate eingeführt. Jetzt gehts, nur ist das editfeld nicht mehr zu disablen.
Die Farbe ändert sich. Ist doch schon was.
ketraun

neolithos 14. Aug 2003 09:09

Re: Tedit disabled
 
Ich mal ganz anderen Weg!

Das was du möchtest macht Windows schon als Standard!
Will man das beeinflussen muss man
(WM_)CN_CTLCOLOREDIT Wenn Normal
und
CN_CTLCOLORSTATIC wenn Disabled oder ReadOnly
abfangen.

So hab ich es bei mir abgeändert...

Delphi-Quellcode:
  private
    procedure CNCtlColorStatic(var Message : TWMCtlColor); message CN_CTLCOLORSTATIC;

procedure TPWEdit.CNCtlColorStatic(var Message: TWMCtlColor);
begin
  inherited; // mache Standard
  with Message do
    // für deinen Fall Enabled prüfen
    // und mittels SetTextColor den Farbwert ändern
    // wie gesagt das ist Windows-Standard
    if ReadOnly and (Parent <> nil) then
       begin
         Result := Parent.Brush.Handle;
         SetBkColor(ChildDC, ColorToRGB(Parent.Brush.Color));
       end;
end;

ketraun 14. Aug 2003 09:38

Re: Tedit disabled
 
hi,
komm lass gut sein. Ich dank dir für deine Mühe. ( der neueste Versuch klappt bei mir auch nicht )
Ich geh jetzt meinen Weg über Invalidate und ich bin überzeugt das geht.
Ich will dir nicht zu nahe treten, aber ich glaube, dass, das nur Zufall ist, dass das bei dir funktioniert.

Meine Kollegen sind jetzt an dem Problem dran:
Winnt, Win2000,
Delphi 2,5,6,7 überall funktionierts so nicht.

Und das liegt einfach nur daran, dass:
setenabled ( inherited ) sich selbst aufruft, dadurch wird invalidate aufgerufen und dann ist alles vorbei.
Invalidate setzt die Farbe auf grau. Es nützt nichts dann die Farben zu ändern. Alle die anderen Versuche gehen an dem Problem vorbei und beheben es nicht.
Es ist nötig Invalidate oder eine Routine, die durch diese aufgerufen wird zu überschreiben.
Ein Szenario wäre ( warum das bei dir geht ):
setenabled --> inherited --> Botschalt wird abgeschickt und damit vergeht soviel Zeit ( bei dir ) dass if enabled... abgearbeitet werden kann, bevor die message bearbeitet ist.

inherited;
if enabled then
Font.Color := clWindowText
else
Font.Color := clred;

Also, sei mir nicht böse für die Antwort, aber es lohnt sich nicht noch mehr Energie da reínzustecken.
Was mich noch interressieren würde, was für ein Betriebssystem benutzt du?

Nebenbei: das ist nicht das erste Mal dass ich solches Verhalten auf einem Rechner beobachte!
ketraun

neolithos 14. Aug 2003 09:48

Re: Tedit disabled
 
Delphi-Quellcode:
inherited;
if enabled then
Font.Color := clWindowText
else
Font.Color := clred;
Das hab ich schon längst entfernt, weil da hast du recht, es ist unsicher (del SetEnabled()). Die Letzte Variante klappt bei mir zu Hause (WinXP, D7 A) in der Firma (Win2k, D7 A) und sogar in anderen Programmiersprachen (Win2k, VO). Keine Ahnung warum es nicht geht WM_CTLCOLORSTATIC eigentlich vor dem Zeichnen gerufen wird.

Letzte Möglichkeit ist die Kontrolle der Windows-Farben!

Aber ich lass es jetzt auch gut sein.

Und noch mal danke das du mich auf das CN_CTLCOLORSTATIC gebracht hast (laut MSDN einzig ware weg). Gelichzeitig hab ich letzte Nacht ein wenig mehr ausgetauscht.

ketraun 14. Aug 2003 10:10

Re: Tedit disabled
 
hi,
genau da liegt das Problem:
WM_CTLCOLORSTATIC wird vor dem Zeichnen abgesetzt.
Bei Delphi (Tcontrol ) zeichnet aber invalidate ( oder löst es aus )
Das macht deine ganzen Einstellungen wieder futsch.
Und da kommt auch die Zeit ins Spiel. Wir haben unter VB Situationen in denen sich der Code selbst überholt.
Auf dieser Basis kann ich aber nicht programmieren. Unsere Tools müssen für alle MS Betriebssysteme geeignet sein und auch mit dem lahmsten Rechner laufen.
ketraun

PS: ich lass dich die Lösung wissen, wenn ich sie gefunden habe. Bin ganz nah dran.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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-2025 by Thomas Breitkreuz