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 ComboBox nach TabStop True/False Text markiert (https://www.delphipraxis.net/211222-combobox-nach-tabstop-true-false-text-markiert.html)

Eppos 17. Aug 2022 09:06

ComboBox nach TabStop True/False Text markiert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich stehe aktuell etwas vor einem Rätsel.
In meiner Anwendung werden ComboBoxen zur Laufzeit mit TabStopp True/False gesetzt.

Jetzt ist es aber so, dass die ComboBoxen dannach den SelText blau hinterlegen.
Dieses verhalten ist ziemlich nervig und unschön, hat dieses Problem schon einmal jemand gehabt?

Gruß
Eppos

himitsu 17. Aug 2022 09:27

AW: ComboBox nach TabStop True/False Text markiert
 
Delphi XE und 11 ... keine Änderung, nur weil man TabStop ändert,
und kann mich auch nicht erinnern, dass es irgendwann mal anders war. :gruebel:

* Fokus bleibt dort wo er war (das was den Fokus hat, ist blau)
* wenn aller Text selektiert war, was er standardmäßig ist (nachdem der Fokus rein ging), bleibt er es auch
* also ja, alles blau, so wie es sein soll (wenn ich es über einen Timer oder einen SpeedButton ändere)
* wenn ich auf den normalen Button drücke, dann bekommt er den Fokus und ComboBoxen sind weiß

* sowas wie DoubleBuffered=True hat auch keine Wirkung
* VCL-Styles wirst'e wohl nicht verwenden
* hmmmm...



Das ist ein Text-"Edit", also
Delphi-Quellcode:
ComboBox.SelLength := 0;
(nach dem Fokusieren, bzw. beim Umschalten)

oder SetFocus wo anders hin und eben keinen Fokus im Edit/ComboBox und schon ist auch nichts blau.

Eppos 17. Aug 2022 10:10

AW: ComboBox nach TabStop True/False Text markiert
 
Liste der Anhänge anzeigen (Anzahl: 1)
* Fokus bleibt dort wo er war (das was den Fokus hat, ist blau)
--> Das ist ja der Witz, Fokus hat das Edit-Feld und wenn ich auf den Button drücke, ist der Fokus auf dem Button. Die ComboBoxen haben nie den Fokus erhalten.

* wenn aller Text selektiert war, was er standardmäßig ist (nachdem der Fokus rein ging), bleibt er es auch
--> Der Fokus war nicht auf der CB

* wenn ich auf den normalen Button drücke, dann bekommt er den Fokus und ComboBoxen sind weiß
--> Nein ist nicht der Fall

habe das Projekt mal hochgeladen

himitsu 17. Aug 2022 13:06

AW: ComboBox nach TabStop True/False Text markiert
 
Ohh, das ist komischt.

Mit Items in den ComboBoxen, passiert das wirklich
ohne Items nicht.

Der DropDown geht ja garnicht auf
und ich wäre davon ausgegangen "Text ist Text", da im Edit,
vor allem da ItemIndex ja -1 und somit garnkein Item aktiv ist.

:shock:




Ein Darstellungsfehler, beim Ändern, scheint es auxch nicht zu sein.
Self.Repaint, sowie ComboBox2.Repaint ändern nichts,
aber, wie gesagt:

Delphi-Quellcode:
procedure TForm21.Button1Click(Sender: TObject);
begin
  ComboBox1.TabStop := False;
  ComboBox1.TabStop := True;

  ComboBox2.TabStop := False;
  ComboBox2.TabStop := True;
  ComboBox2.SelLength := 0;
end;

himitsu 17. Aug 2022 13:47

AW: ComboBox nach TabStop True/False Text markiert
 
Am TabStop selber liegt es garnicht.

Irgendwas im SetWindowLong(GWL_STYLE) bringt das Control durcheinander.


Ob es jetzt an Windows oder irgendwas in der VCL liegt, konnte ich nicht entdecken.
(mit Debug-DCUs bissl durch die VCL und auf die Schnelle nichts bemerkt)


Man könnte jetzt noch mit anderen Sprachen (C++ oder so) das testen,
bzw. mal eine NonVCL-ComboBox erstellen und auch dort schauen.



Aus TComboBox.SetTabStop den relevanten Code rausgeholt und Zeilen einzeln getestet und unwichtiges auskommentiert:
Delphi-Quellcode:
{ ComboBox2.TabStop := Value; }
//PBoolean(@ComboBox2.TabStop)^ := Value;
Style := GetWindowLong(ComboBox2.Handle, GWL_STYLE) {and not WS_TABSTOP};
//if Value then Style := Style or WS_TABSTOP;
SetWindowLong(ComboBox2.Handle, GWL_STYLE, Style);
//ComboBox2.Perform(CM_TABSTOPCHANGED, 0, 0);
Delphi-Quellcode:
Style := GetWindowLong(ComboBox2.Handle, GWL_STYLE);
SetWindowLong(ComboBox2.Handle, GWL_STYLE, Style); // das hier ist Schuld

siehe
Delphi-Quellcode:
procedure TWinControl.SetTabStop(Value: Boolean);
var
  Style: NativeInt;
begin
  if FTabStop <> Value then begin
    FTabStop := Value;
    if HandleAllocated then begin
      Style := GetWindowLong(WindowHandle, GWL_STYLE) and not WS_TABSTOP;
      if Value then Style := Style or WS_TABSTOP;
      SetWindowLong(WindowHandle, GWL_STYLE, Style);
    end;
    Perform(CM_TABSTOPCHANGED, 0, 0);
  end;
end;

himitsu 17. Aug 2022 14:00

AW: ComboBox nach TabStop True/False Text markiert
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    ...
  private
    ComboBox3: HWND;
  end;


implementation

uses
  Winapi.CommCtrl;

procedure TForm1.Button1Click(Sender: TObject);
var
  Style: Integer;
begin
   ...

  Style := GetWindowLong(ComboBox3, GWL_STYLE);
  SetWindowLong(ComboBox3, GWL_STYLE, Style);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox3 := CreateWindowEx(0, WC_COMBOBOX, '', WS_VSCROLL or CBS_HASSTRINGS or CBS_AUTOHSCROLL
    or CBS_DROPDOWN or WS_CHILD or WS_OVERLAPPED or WS_VISIBLE,
    ComboBox2.Left, ComboBox2.Top+30, ComboBox2.Width, ComboBox2.Height,
    Self.Handle, 0, HInstance, 0);
  SendTextMessage(ComboBox3, CB_ADDSTRING, 0, 'ComboBox3');
  SetWindowText(ComboBox3, 'ComboBox3');
end;
Liegt dann wohl nicht an der Delphi-VCL.


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