Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Focus von Felder besser hervorheben (global) (https://www.delphipraxis.net/25952-focus-von-felder-besser-hervorheben-global.html)

Sven Janssen 15. Jul 2004 14:39


Focus von Felder besser hervorheben (global)
 
Ich hoffe das was ich nun Frage auch verstanden wird :-)

Ich bekomme des öfteren von unseren Kunden zu hören und sehe es selber bei Präsentationen und Schulungen, das die Menschen sich damit schwer tun zu erkennen welches Eingabefeld gerade den Fokus besitzt. Ausser einen schmallen blinkenden Cursor ist da nicht viel zu erkennen unter Windows und die Leute sind meistens auch nicht mehr die Jüngsten.
Nun kenne ich es von Mac OS X, das um das Feld/Button/etc mit dem Fokus ein hellblauer Rand vorhanden ist und man sofort auf einen Blick erkennt wo sich gerade der Focus befindet.

So etwas in der Art zu schreiben ist kein Problem. Vielmehr frage ich mich wie ich das onEnter und onExit automatisiere das ich es nicht überall mühsam per Hand einprogrammieren muss und enventuell schon vorhanden onExit/onEnter abändern muss.

Die Idee wäre wohl die entsprechenden Komponenten zu ändern. Allerdings kenne ich mich mit diesem Thema gar nicht aus.
Vielleicht hat sich jemand schon mit dem Thema verfasst, oder hat ein paar nützliche Tipps zur Hand. Freue mich über jede Antwort.


Gruß Sven

himitsu 15. Jul 2004 18:02

Re: Focus von Felder besser hervorheben (global)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es sollten 2 Ereignisprizeduren reichen. Eine dafür, wenn das Eingabefeld den Focus erlangt (OnEnter) und dann nocheines, wenn es diesen wieder verliert (OnExit).

Dabei ist es möglich das jeweilige Editfeld über die Variable Sender zu erhalten...



Ich hab mal zwei Beispiele in der Demo gezeigt, aber es ist auch anderes möglich.

Sven Janssen 15. Jul 2004 18:18

Re: Focus von Felder besser hervorheben (global)
 
ich bin nun mal so frei Dir zu antworten ohne das Programm zu testen.
Aber genau das wollte ich nicht.
Unsere Projekt ist mehrere 100.000 Zeilen mit fast 100 Programmen und Gott-wer-weiß viele Forms.
Das sollte nicht zur Zeitbeschäftigung werden und vor allem sollte man beim entwickeln der Form nicht daran denken müssen.

Ich hab eben was geschrieben, werde ich morgen mal posten, vielleicht gibt es da noch ein paar Verbesserungs Vorschläge.
Momentan benutze ich das Ereignis
Code:
screen.OnActiveControlChange:=....
Farben, Name und Aktiveform des Feldes screen.ActiveControl merken.
dieses überschreiben, beim wechseln das alte feld suchen, zurück setzen und das neue Feld setzen.
Läuft schon ganz gut.
Das ganze in einer include Datei, die eh schon in jedem Programm eingebunden ist.

Sven

Luckie 15. Jul 2004 18:23

Re: Focus von Felder besser hervorheben (global)
 
Zitat:

Zitat von Sven Janssen
Das sollte nicht zur Zeitbeschäftigung werden und vor allem sollte man beim entwickeln der Form nicht daran denken müssen.

Dann hilft nur noch eine eigene Edit-Komponente zu entwickeln.

Sven Janssen 15. Jul 2004 18:31

Re: Focus von Felder besser hervorheben (global)
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Sven Janssen
Das sollte nicht zur Zeitbeschäftigung werden und vor allem sollte man beim entwickeln der Form nicht daran denken müssen.

Dann hilft nur noch eine eigene Edit-Komponente zu entwickeln.

Hatte ich mir schon überlegt. Aber dann müsste ich a) nicht nur eine TEdit Komponente entwicklen. Sondern auch TComboBox, TChecbox, TDBedit usw. usw. und diese dann in allen Programmen austauschen.
Das ist ne Arbeit für jemand der Mutter und Vater erschlagen hat.
Fällt damit wohl auch unter den Tisch, vor allem müsste ich meinem Chef erklären warum ich mehrere Tage daran Sitze ein paar Felder farbig zu machen. Weil der hat keine Ahnung von Delphi und glaub er sieht kein nutzen darin, weil es kein Geld (im direkten Sinne) bringt.
Daher versuche ich so etwas immer über Code zu lösen der individuell einsetzbar ist.

Würde ich am Anfang eines Projektes stehen, dann würde ich den Weg über die Komponente gehen aber nun...
indiskutabel.

Sven

himitsu 15. Jul 2004 18:48

Re: Focus von Felder besser hervorheben (global)
 
Da du ja in deiner Professional-Version die Sourcecodes der Komponenten hast, könntest du es ja auch gleich dort ändern, dann brauchst du nur noch deine genzen Programme neu kompilieren und fertig ^^

Und beim erstellen neuer Programme ist es dann auch gleich mit drin.

Luckie 15. Jul 2004 18:53

Re: Focus von Felder besser hervorheben (global)
 
Ich würde aber dringend davon abraten an den original Sourcen was zu ändern. Das dürfte zu ziemlichen Problemen führen, wenn mehrere an dem Projekt arbeiten.

Sven Janssen 15. Jul 2004 19:13

Re: Focus von Felder besser hervorheben (global)
 
Zitat:

Zitat von Luckie
Ich würde aber dringend davon abraten an den original Sourcen was zu ändern. Das dürfte zu ziemlichen Problemen führen, wenn mehrere an dem Projekt arbeiten.

Nö die system.pas und printers.pass haben wir schon abgeändert.
Aus den Standardsuchpfaden gelöscht (pas und dcu) und die veränderten pas in uns Netzlaufwerk gelegt.
Man sollte nur drauf achten, das wenn ein neues Delphi installiert wird, das dieses dann nicht mit den alten Dateien dir Programmen übersetzt.
Das könnte sonst zu Diskussionsgründen führen :-)

Sven

Sven Janssen 16. Jul 2004 08:21

Re: Focus von Felder besser hervorheben (global)
 
Nachstehende Procedure habe ich in eine include Datei geschrieben, die bei uns eh immer in der ersten Form1 mit eingebunden wird. Grundvoraussetzung natürlich, das diese immer den Namen Form1 behält.
Code:
procedure TForm1.controlCheck(sender:TObject);
var i,j:integer;
begin
    if getglobalpara('allgemein.ini','Allgemein','Highlighting',TRUE) = FALSE then exit;
    for i:=0 to screen.CustomFormCount-1 do begin
        for j:=0 to screen.CustomForms[i].ComponentCount-1 do begin
            if (screen.CustomForms[i].name = fieldFormNameBevorGetFocus) and
                (screen.CustomForms[i].Components[j].name = fieldNameBevorGetFocus) then begin
                if (screen.CustomForms[i].Components[j] is TEdit) then begin
                    (screen.CustomForms[i].Components[j] as TEdit).color:=fieldColorBackgroundBevorGetFocus;
                    (screen.CustomForms[i].Components[j] as TEdit).font.color:=fieldColorTextBevorGetFocus;
                end;
                if (screen.CustomForms[i].Components[j] is TDBedit) then begin
                    (screen.CustomForms[i].Components[j] as TDBedit).color:=fieldColorBackgroundBevorGetFocus;
                    (screen.CustomForms[i].Components[j] as TDBedit).font.color:=fieldColorTextBevorGetFocus;
                end;                        
            end;
        end;
    end;
    if (screen.ActiveControl is TDBEdit) then begin
        fieldColorBackgroundBevorGetFocus:=(screen.ActiveControl as TDBEdit).color;
        fieldColorTextBevorGetFocus:=(screen.ActiveControl as TDBEdit).font.color;
        fieldNameBevorGetFocus:=screen.ActiveControl.name;
        fieldFormNameBevorGetFocus:=screen.ActiveCustomForm.name;
        (screen.ActiveControl as TDBEdit).color:=clInfoBk;
        (screen.ActiveControl as TDBEdit).font.color:=clinfotext;
    end;
    if (screen.ActiveControl is TEdit) then begin
        fieldColorBackgroundBevorGetFocus:=(screen.ActiveControl as TEdit).color;
        fieldColorTextBevorGetFocus:=(screen.ActiveControl as TEdit).font.color;
        fieldNameBevorGetFocus:=screen.ActiveControl.name;
        fieldFormNameBevorGetFocus:=screen.ActiveCustomForm.name;
        (screen.ActiveControl as TEdit).color:=clInfoBk;
        (screen.ActiveControl as TEdit).font.color:=clinfotext;
    end;
   
end;
Ins Formcreate der ersten Form muss folgende Zeile hinzugefügt werden.
Code:
screen.OnActiveControlChange := form1.controlCheck;
Die nachfolgeden Variablen sind in einer Unit die ebenfalls immer mit eingebunden wird.
Code:
    fieldColorBackgroundBevorGetFocus,
    fieldColorTextBevorGetFocus:TColor;
    fieldNameBevorGetFocus,fieldFormNameBevorGetFocus:string;
Die Procedure kann man natürlich nun noch um weitere Komponenten erweitern.

Sven

hronny 4. Mai 2006 23:04

Re: Focus von Felder besser hervorheben (global)
 
Hallo!

Ich benutze Delphi 7 und suche schon lange nach genau dieser Lösung. Das Einfärben klappt wunderbar. Nur wenn das Feld den Fokus verlässt, dann bleibt die Farbe, in diesem Fall gelb. Wo ist da das Problem?

marabu 5. Mai 2006 08:52

Re: Focus von Felder besser hervorheben (global)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

den Fehler findest du bestimmt, wenn du mal einen Haltepunkt in die Routine setzt und sie schrittweise durchgehst.

Die Idee von Sven dieses Event zu nutzen finde ich nicht schlecht, die Umsetzung lässt sich noch verfeinern. Ich habe eine Unit ScrHelper angehängt, die einfach als letzte Unit in die Uses-Anweisung des Projekts aufgenommen werden sollte und dann geht alles automatisch. Wer will kann im OnCreate() der MainForm noch die globalen Variablen Highlighting und HighlightingColor setzen - mehr ist nicht nötig, keine Includes, keine externen Abhängigkeiten und event chaining ist auch an Bord. So richtig schön ist es trotzdem noch nicht, da Grids und eventuell auch noch andere komplexe Controls eine Sonderbehandlung benötigen, aber mehr Zeit habe ich gerade nicht.

For what it's worth

marabu

Sven Janssen 5. Mai 2006 09:38

Re: Focus von Felder besser hervorheben (global)
 
Du musst Dir natürlich die Farben merken bevor Du ein Feld selektierst und beim verlassen wieder auf die Ursprungsfarbe setzen.

Delphi-Quellcode:
if (screen.ActiveControl is TCheckbox) then begin
        fieldColorBackgroundBevorGetFocus:=(screen.ActiveControl as TCheckbox).color;
        fieldColorTextBevorGetFocus:=(screen.ActiveControl as TCheckbox).font.color;
        fieldNameBevorGetFocus:=screen.ActiveControl.name;
        fieldFormNameBevorGetFocus:=screen.ActiveCustomForm.name;
        (screen.ActiveControl as TCheckbox).color:=backColor;
        (screen.ActiveControl as TCheckbox).font.color:=fontcolor;
end;
Und dann ca so etwas in der Art :
Delphi-Quellcode:
 for i:=0 to screen.CustomFormCount-1 do begin
        for j:=0 to screen.CustomForms[i].ComponentCount-1 do begin
            if (screen.CustomForms[i].name = fieldFormNameBevorGetFocus) and
                (screen.CustomForms[i].Components[j].name = fieldNameBevorGetFocus) then begin
                if (screen.CustomForms[i].Components[j] is TEdit) then begin
                    (screen.CustomForms[i].Components[j] as TEdit).color:=fieldColorBackgroundBevorGetFocus;
                    (screen.CustomForms[i].Components[j] as TEdit).font.color:=fieldColorTextBevorGetFocus;
                end;
Gruß Sven

hronny 5. Mai 2006 10:39

Re: Focus von Felder besser hervorheben (global)
 
Zitat:

Zitat von marabu
So richtig schön ist es trotzdem noch nicht, da Grids und eventuell auch noch andere komplexe Controls eine Sonderbehandlung benötigen, aber mehr Zeit habe ich gerade nicht.

:thumb: Richtig Toll! Deine Funktion geht ja tadellos! Für meine Zwecke reicht das vollkommen aus. Vielen Dank! :spin2:

marabu 5. Mai 2006 10:54

Re: Focus von Felder besser hervorheben (global)
 
Freut mich wenn es dir hilft, aber nimm eine bessere Farbe als clYellow.

Und sei herzlich willkommen in der Delphi-PRAXiS

marabu *vergesslich-ist*

PS: Danke auch an Sven - für die tolle Idee.

Sven Janssen 5. Mai 2006 11:41

Re: Focus von Felder besser hervorheben (global)
 
Nimm am besten die Farben von Windows.
Wir haben Standardmäßig clInfoBK und clInfoText. Wahlweise kann man einfach eine .ini Datei erstellen mit 2 Parametern und diese haben dann Vorang. So kann jeder User sich das selber einstellen.

@marabu
Meine Kontodaten sind 1600.... ;-)
Ne Spaß bei Seite. Schade das Windows das nicht selber liefert. Immerhin ist das eine Imense Hilfe für Benutzer die nicht mehr so jung sind oder selten am PC arbeiten.

Sven

hronny 5. Mai 2006 11:53

Re: Focus von Felder besser hervorheben (global)
 
Ja natürlich die Farbe sieht bescheiden aus. Hab jetzt noch eine Variable für die Schriftfarbe hinzugefügt, eine Variable um die Highlightfunction wärend der Laufzeit an und auszuschalten, und natürlich bessere Farben genommen :wink: :
Delphi-Quellcode:
HighlightEnabled: Boolean = false;
HighlightingColor: TColor = clMaroon;
HighlightingFontColor: TColor = clHighlightText;
 
  //...

procedure TScreenHelper.ActiveControlChange(Sender: TObject);
begin
  if Highlighting and not Application.Terminated then
  begin
    if Assigned(ActiveControl) then
      with TControlCracker(ActiveControl) do begin
        // undo highlighting
        Color := NormalColor;
        font.Color := NormalFontColor;
      end;
    if Assigned(Screen.ActiveControl) then
    begin
      // do highlighting
      if (HighlightEnabled = true) then begin
        NormalColor := TControlCracker(Screen.ActiveControl).Color;
        NormalFontColor := TControlCracker(Screen.ActiveControl).Font.Color;
        ActiveControl := Screen.ActiveControl;
        TControlCracker(Screen.ActiveControl).Color := HighlightingColor;
        TControlCracker(Screen.ActiveControl).Font.Color := HighlightingFontColor;
      end;
    end;
  end;

  if Assigned(SavedActiveControlChange) then
    SavedActiveControlChange(Sender);
end;
Einen Vorschlag / Frage hätte ich noch dazu: Da ich das Highlight wärend der Laufzeit ändere, wäre es doch eigentlich sinnvoll, alle Felder auf ReadOnly zu setzen wenn (HighlightEnabled = false) ist, und dann alle aktivieren. Nur habe ich die funktion dafür noch nicht finden können bzw scheine ich den Syntax nicht zu kennen. Mit der Funktion aus den oberen Beiträgen hatte ich einen Erfolg heute Nacht mit:
Delphi-Quellcode:
if (screen.CustomForms[i].Components[j] is TDBEdit) then
begin
  (screen.CustomForms[i].Components[j] as TDBEdit).ReadOnly:=readonly; //true oder false
end;
Damit würde es ja gehen, aber dann brauche ich eine extra Schleife die es für jeden Typ dann machen muss. Wobei ich dann auch alle Typen separat einfügen muss.

Sven Janssen 5. Mai 2006 12:20

Re: Focus von Felder besser hervorheben (global)
 
Ich würde nie eine Feste und eine Variablesystemfarbe kombinieren. Das kann ganz böse enden ;-)

marabu 5. Mai 2006 13:51

Re: Focus von Felder besser hervorheben (global)
 
Ich habe eine verbesserte Fassung an den Beitrag #11 angehängt. Ich habe dabei Eure Vorschläge berücksichtigt, aber auch die Handhabung geändert. Das Highlighting wird jetzt zur Laufzeit ein- und ausgeschaltet, indem ScreenHelper.Connected auf True bzw. False gesetzt wird. Alle Details findet ihr im (wie immer unkommentierten) Quelltext.

marabu

hronny 6. Mai 2006 01:41

Re: Focus von Felder besser hervorheben (global)
 
Top! Script geht 1. Sahne! :thumb: :cheers:


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