Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Länge der ComboListBox items festlegen (https://www.delphipraxis.net/200865-laenge-der-combolistbox-items-festlegen.html)

EWeiss 3. Jun 2019 05:29


Länge der ComboListBox items festlegen
 
Ich verwende einen alten FileDialog (Ownerdrawn)
Wenn der Ordner den ich öffnen möchte mehr wie 67 Zeichen hat dann ist die Combo Liste an der Position leer.

Gibt es einen Trick so das ich die Combo trotzdem mit mehr als 67 Zeichen füllen kann?
Theoretisch wären ja MAX_PATH möglich.

Das Handle habe ich..
Delphi-Quellcode:
hComboPath := GetDlgItem(hMain, ID_COMBOPATH);
Delphi-Quellcode:
function TSkinOpenSaveDialog.CBListGetText(hList: HWND; Item: UINT): WideString;
var
  Len: Integer;
begin

  Len := SendMessage(hList, CB_GETLBTEXTLEN, Item, 0);
  if Len > 0 then
  begin
    SetLength(Result, Len);
    SendMessage(hList, CB_GETLBTEXT, Item, LPARAM(PWideChar(Result)));
  end
  else
  SetLength(Result, 0);
end;
Len ist in dem Fall 0 wenn mehr wie 67 Zeichen.

gruss

peterbelow 3. Jun 2019 10:11

AW: Länge der ComboListBox items festlegen
 
Zitat:

Zitat von EWeiss (Beitrag 1433695)
Ich verwende einen alten FileDialog (Ownerdrawn)
Wenn der Ordner den ich öffnen möchte mehr wie 67 Zeichen hat dann ist die Combo Liste an der Position leer.

Gibt es einen Trick so das ich die Combo trotzdem mit mehr als 67 Zeichen füllen kann?
Theoretisch wären ja MAX_PATH möglich.

Das Handle habe ich..
Delphi-Quellcode:
hComboPath := GetDlgItem(hMain, ID_COMBOPATH);
Delphi-Quellcode:
function TSkinOpenSaveDialog.CBListGetText(hList: HWND; Item: UINT): WideString;
var
  Len: Integer;
begin

  Len := SendMessage(hList, CB_GETLBTEXTLEN, Item, 0);
  if Len > 0 then
  begin
    SetLength(Result, Len);
    SendMessage(hList, CB_GETLBTEXT, Item, LPARAM(PWideChar(Result)));
  end
  else
  SetLength(Result, 0);
end;
Len ist in dem Fall 0 wenn mehr wie 67 Zeichen.

gruss

Prüf mal die window styles der combobox (GetWindowLong(hComboPath,GWL_STYLE). Hat sie den CBS_HASSTRINGS style? Wenn nicht (vermute ich mal) ist der Code, der das owner drawing der Combobox macht auch dafür verantwortlich, die anzuzeigenden Strings irgendwo abzulegen, und vermutlich ist da die Limitierung auf 67 Zeichen zu finden.

EWeiss 3. Jun 2019 13:21

AW: Länge der ComboListBox items festlegen
 
Zitat:

Prüf mal die window styles der combobox (GetWindowLong(hComboPath,GWL_STYLE). Hat sie den CBS_HASSTRINGS style? Wenn nicht (vermute ich mal) ist der Code, der das owner drawing der Combobox macht auch dafür verantwortlich, die anzuzeigenden Strings irgendwo abzulegen, und vermutlich ist da die Limitierung auf 67 Zeichen zu finden.
Danke dir..
Ich habe an den Window Styles nichts verändert was die Combobox angeht.
Somit sollte der Style CBS_HASSTRINGS auch vorhanden sein(was er auch ist).

gruss

peterbelow 4. Jun 2019 12:40

AW: Länge der ComboListBox items festlegen
 
Zitat:

Zitat von EWeiss (Beitrag 1433724)
Zitat:

Prüf mal die window styles der combobox (GetWindowLong(hComboPath,GWL_STYLE). Hat sie den CBS_HASSTRINGS style? Wenn nicht (vermute ich mal) ist der Code, der das owner drawing der Combobox macht auch dafür verantwortlich, die anzuzeigenden Strings irgendwo abzulegen, und vermutlich ist da die Limitierung auf 67 Zeichen zu finden.
Danke dir..
Ich habe an den Window Styles nichts verändert was die Combobox angeht.
Somit sollte der Style CBS_HASSTRINGS auch vorhanden sein(was er auch ist).

gruss

Keine weitere Idee, sorry.

EWeiss 4. Jun 2019 16:15

AW: Länge der ComboListBox items festlegen
 
Zitat:

Keine weitere Idee, sorry.
Denke es ist eine Limitierung des alten Open File Dialog.. Aber kein Problem solange wie es nicht abstürzt. :stupid:
Danke.

gruss

Luckie 4. Jun 2019 18:29

AW: Länge der ComboListBox items festlegen
 
Ich meine, man kann irgendwie die Breite der Liste vorgeben bzw. ändern. Kann es eventuell daran liegen?

EWeiss 4. Jun 2019 18:33

AW: Länge der ComboListBox items festlegen
 
Zitat:

Zitat von Luckie (Beitrag 1433889)
Ich meine, man kann irgendwie die Breite der Liste vorgeben bzw. ändern. Kann es eventuell daran liegen?

Leider nein diese setze ich ja.. Und ja man kann sie ändern aber nur wenn sie weiter ist als die Combo selbst. Weniger funktioniert nicht.
Delphi-Quellcode:
              // Edit update
              if (length(SkinEngine.SkinConfigFile) <> 0) and OpenDialog.UseSkin then
              begin
                Txt := PWideChar(OpenDialog.GetDlgPath(CDM_GETFILEPATH, WinHandle));
                if (not PathIsDirectoryW(Txt)) and (PathFileExistsW(Txt)) then
                begin
                  Txt := PWideChar(ExtractFileName(Txt));
                  SkinEngine.SetCTLText(edEdit.Handle, Txt);
                  SetToolTipText(edEdit.Handle, Txt, True);
                  SkinEngine.SetZorder(SKDialogHandle, HWND_TOPMOST);
                end
                else
                begin
                  // clear edit if selected item not a path
                  SkinEngine.SetCTLText(edEdit.Handle, '');
                  // change width of Combo DropList
                  Txt := PWideChar(ExtractFileName(Txt));
                  GetTextBound(Txt, SkinEngine.SK_TEXTFONT, SkinEngine.SK_PUSHBUTFONTSIZE + 1,
                    bW, bH, nil, 0);

                  GetClientRect(hComboPath, rc);
                  if bW > rc.Right then
                    SendMessage(hComboPath, CB_SETDROPPEDWIDTH, bW, 0); // new DropList width
                  Result := 1;
                  Exit;
                end;
              end;
Aber wie man sehen kann ist der Eintrag leer.
Genauso wie der, der Combo selbst.

gruss

EWeiss 5. Jun 2019 12:10

AW: Länge der ComboListBox items festlegen
 
Hmmm.. wie ich es mir dachte.
Es scheint eine Limitierung zu sein.
67 und 70 Zeichen Dialog ohne Ownerdraw.

Bei 70 Zeichen ist der Eintrag in der Combo leer.
Und Windows setzt nicht mal die Weite der DropDownList auf die länge des längsten string.. Wirklich schwach.

gruss

Klaus01 5. Jun 2019 12:56

AW: Länge der ComboListBox items festlegen
 
.. wäre es eine Möglichkeit den Ausgabetext zu kürzen?
Aber so das man noch erkennen kann um was es bei dem Eintrag geht.

Grüße
Klaus

EWeiss 5. Jun 2019 13:04

AW: Länge der ComboListBox items festlegen
 
Zitat:

Zitat von Klaus01 (Beitrag 1433983)
.. wäre es eine Möglichkeit den Ausgabetext zu kürzen?
Aber so das man noch erkennen kann um was es bei dem Eintrag geht.

Grüße
Klaus

Theoretisch aber praktisch leider nicht.
Wenn ich den Txt wie oben im Code erfrage dann habe ich den richtigen inklusive der länge sonst könnte ich die DropListe nicht entsprechend setzen.

Im Event der Combobox jedoch schlägt die abfrage auf den Text fehl. Siehe Kommentar.
Delphi-Quellcode:
              case PDis^.CtlID of
                ID_COMBOPATH:
                  begin
                    case PDis^.itemAction of

                      ODA_DRAWENTIRE:
                        begin
                          if (PDis.itemAction and ODA_DRAWENTIRE) = ODA_DRAWENTIRE then
                          begin
                            CbTxt := OpenDialog.CBListGetText(PDis.hwndItem, PDis.itemID); // Hier ist der Text leer wenn mehr wie 67 Zeichen da ist nichts zu kürzen.
                            GdipCheck(DrawTextToDC(PDis.HDC, CbTxt, PDis.rcItem,
                              SkinEngine.SK_INACTIVECAPTION, SkinEngine.SK_TEXTFONT,
                              SkinEngine.SK_PUSHBUTFONTSIZE, FontStyleBoldItalic, -1, 0, nil));
                          end;
                        end;
Trotzdem Danke..

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.
Seite 1 von 2  1 2   

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