Fórum Pesquisa texto em um listbox #317994
31/03/2006
0
tenho uma listbox onde tem o nome das estações conectadas ao meu servidor
Lista Estações:
[list:c19b2573b2]
Micro01
Micro02
Micro03
Micro04
Micro05
Micro06
[/list:u:c19b2573b2]
e tenho outro listbox com um contador que é mostrado +/- assim:
[list:c19b2573b2]
00:04:00 - Micro02
00:47:00 - Micro01
00:54:00 - Micro05
01:11:00 - Micro04
01:28:00 - Micro06
02:11:00 - Micro03
[/list:u:c19b2573b2]
eu gostaria que: Quando o Atendente selecionasse o nome da estação na lista de estações a mesma fosse selecionada na lista de tempos...
sei que pra pesquisar em um listbox usamos [b:c19b2573b2]Listbox.items.indexof(´Micro02´)[/b:c19b2573b2], mais não estou conseguindo fazer para achar o valor [b:c19b2573b2]Micro02[/b:c19b2573b2] nessa lista... :cry:
Paullsoftware
Curtir tópico
+ 0Posts
31/03/2006
Marco Salles
// Armazena
var StrArray:Array of String; begin SetLength (strArray, ListBox2.Items.Count); for I := 0 to ListBox2.Items.Count - 1 do strArray [I] := copy(ListBox2.Items [I],length(ListBox2.Items [I])-7,7); end;
para pesquisar
procedure TForm1.ListBoxMatchClick(Sender: TObject); var nMatch: Integer; begin nMatch := AnsiIndexText(ListBox1.Item.String[listBox1.ItemIndex], strArray); listBox2.ItemIndex:=nMatch; end;
[b:80592fc48a]Unit: StrUtils; Do delphi 7.0[/b:80592fc48a]
obs)não testei .. mas 99¬ que funciona.. Pode depender de alguns ajustes , principalmemte na ~instrução copy para carregar para o Array
strArray [I] := copy(ListBox2.Items [I],length(ListBox2.Items [I])-7,7);
Gostei + 0
31/03/2006
Paullsoftware
vou testar em casa e na segunda post o resultado :wink:
Gostei + 0
01/04/2006
Marco Salles
procedure TForm1.ListBox1Click(Sender: TObject); var npos,fixo,Max,Min,qunt,i:integer; begin fixo:=length(listbox1.Items.Strings[listbox1.ItemIndex]); qunt:=listbox1.Count; npos:=pos(listBox1.Items.Strings[listbox1.ItemIndex], listbox2.Items.Text); i:=0; while i <= qunt-1 do begin Min:=pos(listbox2.Items.Strings[i],ListBox2.Items.Text); Max:=Min+length(listbox2.Items.Strings[i])-Fixo; if InRange(npos,Min,Max) then break else i:=i+1; end; listbox2.ItemIndex:=(i); end;
[b:ea51ea923a]Unith Match[/b:ea51ea923a]
Gostei + 0
01/04/2006
Marco Salles
´pesquisar uma SubString num ListBox´.. Ou fazer uma pesquisa parcial
bem enfim , o método anterior pode ser facilmente estendido para esse caso.. Genreralizando podemos ter a funçao abaixo:
function PesquisarTextoListBox(
var Lb:TListBox;Texto:String):integer;
var npos,fixo,Max,Min,qunt,i:integer; begin fixo:=length(texto); qunt:=Lb.Count; npos:=pos(texto,Lb.Items.Text); i:=0; while i <= qunt-1 do begin Min:=pos(LB.Items.Strings[i],LB.Items.Text); Max:=Min+length(LB.Items.Strings[i])-Fixo; if InRange(npos,Min,Max) then break else i:=i+1; end; result:=ifthen(i<=qunt-1,i,-1); end;
Outra opçãp poderosa e usar a função posEx que foi inserida a partir do delphi 7.0.. Com ela podemos dar critérios a nossa busca.
A função abaixo permite efetuar uma pesquisa dentro do listbox com um busca por toda a extensão do listBox
function PesquisarTextoListBoxEx( var Lb:TListBox;Texto:String):integer; var npos,fixo,Max,Min,qunt,i,Limite:integer; begin fixo:=length(texto); qunt:=Lb.Count; npos:=pos(texto,Lb.Items.Text); i:=0; Limite:=0; while i <= qunt-1 do begin if (npos>0) then begin Min:=posEx(LB.Items.Strings[i],LB.Items.Text,limite); Max:=Min+length(LB.Items.Strings[i])-Fixo; if InRange(npos,Min,Max) then begin Lb.ItemIndex:=i; if MessageDlg(´Continuar pesquisando?´, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin limite:=npos+1; npos:=posEx(texto,LB.Items.Strings[i],Limite); end else break end else i:=i+1; end else begin i:=i+1; if i <= qunt-1 then npos:=poseX(texto,Lb.Items.Text,max+1); end; end; result:=ifthen(i<=qunt-1,i,-1); end;
Propositalmente , quando se tem uma String com caracteres repetidos em um mesmo indice Por exemplo: MAMSTMAFM
e ao fizer uma busca por ´M´ dentro do listBox ele ira ficar quatro vezes no mesmo indice... Isto foi feito propositalmente e esta opção é facil de tirar.. O dificil foi coloca-la..
O maior defeito desta função é não ser sensitive .... mas as funçoes pos e posEx tb não são.. Em outras palavras se voce digitar maisculo e so tiver minusculo, o resultado sera não encontrado..
Se alguem tiver a curioisdade e testar esta função e encontrar bugs , por favor se manifeste , pois eu não tive condiçoes de testar todas as variantes.
Para executar as funçoes é claro :
//Busca parcial.. O Para quando algo for encontrado
procedure TForm1.Button1Click(Sender: TObject); begin listBox2.ItemIndex:=PesquisarTextoListBox(ListBox2,edit1.Text); end;
//Varre todo o ListBox procurando
procedure TForm1.Button2Click(Sender: TObject); begin listBox2.ItemIndex:=PesquisarTextoListBoxEX(ListBox2,edit1.Text); end;
Aonde edit1.text é o texto ou String ou caracter que se quer procurar dentro dos Items do listBox
Unit uses Math;
Gostei + 0
02/04/2006
Marco Salles
por favor um Delete no meu ultimo post , pois cometi reduntãncias na metodologia aplicada..
Acho que os métodos a seguir fazem a mesma coisa com uma codificação muito mais clara
Peço desculpas e venho aqui ha tempo e a hora para corrigir este desastre que fora passado na postagem anterior
:oops: :oops: :oops: :oops:
[b:4a312d9613]Pesquisa simples .. Tal como , encontre o primeiro[/b:4a312d9613]
procedure TForm1.Button1Click(Sender: TObject); var i,quant:integer; begin quant:=listBox1.Count; i:=0; while i<=(quant-1) do begin if pos(edit1.Text,listbox1.Items.Strings[i]) > 0 Then break else i:=i+1; end; listBox1.ItemIndex:=IfThen(i<=(quant-1),i,-1) end;
[b:4a312d9613]Pesquisa composta .. Encontre todos[/b:4a312d9613]
procedure TForm1.Button2Click(Sender: TObject); var npos,i,quant,Limite:integer; begin quant:=listBox1.Count; i:=0; Limite:=0; while i<=(quant-1) do begin npos:=posEx(edit1.Text,listbox1.Items.Strings[i],Limite); if npos > 0 Then begin ListBox1.ItemIndex:=i; if MessageDlg(´Nova pesquisa´,mtconfirmation,[mbOk,mbcancel],0) = mrok then Limite:=npos+1 else break; end else begin i:=i+1; limite:=0; end; end; listBox1.ItemIndex:=IfThen(i<=(quant-1),i,-1) end;
[b:4a312d9613]Unit Math, StrUtils;[/b:4a312d9613]
Gostei + 0
03/04/2006
Paullsoftware
não esquenta, o importante é ajudar! :wink:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)