![]() |
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 |
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; |
Re: Tedit disabled
hi,
tut mir leid aber das funktioniert nicht! ketraun |
Re: Tedit disabled
Genaures bitte :chat: ! Warum nicht?
|
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:... |
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:
Frage an den Moderator: Kann man nicht so was (ganz allgemein gehalten)als FAQ oder Source-Code ablegen?
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; |
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:
[edit=Luckie]Delphi-Tags hinzugefügt. Mfg, Luckie[/edit]
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; |
Re: Tedit disabled
hi,
so gehts offensichtlich nicht:
Code:
nach dem inherited ist offensichtlich alles vorbei. Es nützt also garnichts hier die Farbe zu ändern!
procedure TmaskEditL.SetEnabled(Value: Boolean);
begin inherited; if Value then Font.Color := clWindowText else Font.Color := fcolor; invalidate; end; ketraun |
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 |
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. |
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 |
Re: Tedit disabled
hi,
setfcolor wird bei mir zur Laufzeit nie mehr angeprungen. Nur einmal beim Start! Wo liegt der Haken? Delphi5 + Win2000 ketraun |
Re: Tedit disabled
Zitat:
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. |
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! |
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 |
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. |
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 |
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! |
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 |
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:
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.
TPWCoolBar = class (TCoolBar);
TPWToolBar = class (TToolBar); 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 |
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 |
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) |
Re: Tedit disabled
hi,
nein hab den Font nicht geändert, alles schon probiert. ketraun |
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 |
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; |
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 |
Re: Tedit disabled
Delphi-Quellcode:
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.
inherited;
if enabled then Font.Color := clWindowText else Font.Color := clred; 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. |
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