Il y a quelque chose que je n'ai pas compris avec TListBox et TListBoxItem dans Delphi 10.2 Tokyo.ListBoxItem Visible Error
Certaines valeurs (TListBoxItem) sont chargées dans ma ListBox, lorsque la première lettre change, j'ajoute un TListBoxGroupHeader.
procedure TForm1.Button1Click(Sender: TObject);
var
lbItem: TListBoxItem;
Letter: string;
ListBoxGroupHeader: TListBoxGroupHeader;
i: integer;
ListValue: TStringList;
begin
Letter := '';
ListValue := TStringList.Create;
try
ListValue.Add('Germany');
ListValue.Add('Georgie');
ListValue.Add('France');
ListValue.Add('Venezuela');
ListValue.Add('Poland');
ListValue.Add('Russia');
ListValue.Add('Sweden');
ListValue.Add('Denmark');
ListBox1.BeginUpdate;
for i := 0 to ListValue.Count - 1 do
begin
if Letter <> Copy(ListValue[i], 0, 1).ToUpper then
begin
ListBoxGroupHeader := TListBoxGroupHeader.Create(ListBox1);
ListBoxGroupHeader.Text := Copy(ListValue[i], 0, 1).ToUpper;
ListBox1.AddObject(ListBoxGroupHeader);
end;
lbItem := TListBoxItem.Create(ListBox1);
lbItem.Text := ListValue[i];
lbItem.Tag := i;
ListBox1.AddObject(lbItem);
Letter := Copy(ListValue[i], 0, 1).ToUpper;
end;
finally
ListBox1.EndUpdate;
FreeAndNil(ListValue);
end;
end;
J'utilise un TEdit pour effectuer une recherche dans ce ListBox. C'est ici que j'ai un problème. Si ListBoxItem contient le contenu de l'Edit, je mets Visible à True, sinon je le mets à False.
procedure TForm1.Edit1ChangeTracking(Sender: TObject);
var
i : integer;
ListBoxItem: TListBoxItem;
begin
ListBox1.BeginUpdate;
try
for i := 0 to ListBox1.Items.Count - 1 do
begin
if ListBox1.ListItems[i] is TListBoxItem then
begin
ListBoxItem := TListBoxItem(ListBox1.ListItems[i]);
if Edit1.Text.Trim = '' then
begin
ListBoxItem.Visible := True
end
else
begin
if ListBox1.ListItems[i] is TListBoxGroupHeader then
ListBoxItem.Visible := False
else
ListBoxItem.Visible := ListBoxItem.Text.ToLower.Contains(Edit1.Text.Trim.ToLower);
end;
end;
end;
finally
ListBox1.EndUpdate;
end;
end;
Le premier GroupHeader (lettre G) est toujours visible! et il semble qu'il y ait un ListBoxItem derrière le GroupHeader .. Quand j'utilise un point de contrôle Visible est défini sur false .. donc je n'ai pas compris ..
Si j'écris la lettre "V", je ne vois que le GroupHeader avec la lettre "G".
J'ai même essayé de changer la valeur du texte si c'est un GroupHeader.
if ListBox1.ListItems[i] is TListBoxGroupHeader then
ListBoxItem.Text := '>>' + ListBoxItem.Text + '<<'
Cest texte de changement, mais pas pour la première GroupHeader (lettre G) ...
Je ne sais pas si je l'utilise mal, ou si elle est un bug ??
Oui. Il y a un bug (lors de la définition de la visibilité de l'élément). De toute façon, je ne pense pas que ce soit ce que tu veux faire. Je pense que vous voulez rechercher des pays et afficher uniquement ceux qui correspondent à un texte avec un en-tête correspondant, ce qui nécessite une recherche dans les éléments non en-tête et masquer les en-têtes qui n'ont aucun élément. Est-ce ce que vous voulez accomplir? – Victoria
@Victoria merci pour la réponse, tout ce que j'essaye échoué. J'ai décidé de créer mon propre menu avec un TVertScrollBox et TLayout où je crée mon TRecangle .. c'est faire le travail, je vais créer une tâche sur le bug tracker d'Embarcadero. – Bosshoss