AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ComboBox nach TabStop True/False Text markiert
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox nach TabStop True/False Text markiert

Ein Thema von Eppos · begonnen am 17. Aug 2022 · letzter Beitrag vom 17. Aug 2022
Antwort Antwort
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#1

ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 10:06
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
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 10:27
Delphi XE und 11 ... keine Änderung, nur weil man TabStop ändert,
und kann mich auch nicht erinnern, dass es irgendwann mal anders war.

* 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 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.
$2B or not $2B

Geändert von himitsu (17. Aug 2022 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 11:10
* 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
Angehängte Dateien
Dateityp: zip Unit1.zip (1.021 Bytes, 3x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 14:06
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.






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;
$2B or not $2B

Geändert von himitsu (17. Aug 2022 um 14:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 14:47
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;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: ComboBox nach TabStop True/False Text markiert

  Alt 17. Aug 2022, 15:00
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:26 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