GARANTIR DESCONTO

Fórum Pesquisa texto em um listbox #317994

31/03/2006

0

Estou enfrentando o seguinte problema:
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

Paullsoftware

Responder

Posts

31/03/2006

Marco Salles

acho que vai ter que usar um auxiliar

// 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);



Responder

Gostei + 0

31/03/2006

Paullsoftware

certo, Marcos...
vou testar em casa e na segunda post o resultado :wink:


Responder

Gostei + 0

01/04/2006

Marco Salles

melhor ainda...

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]


Responder

Gostei + 0

01/04/2006

Marco Salles

tive olhando no forum e vi muitas dúvidas sobre :

´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;


Responder

Gostei + 0

02/04/2006

Marco Salles

:oops: :oops: :oops: :oops: :oops: :oops:

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]


Responder

Gostei + 0

03/04/2006

Paullsoftware

[quote:5cafea4972=´Marcos 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
[/quote:5cafea4972]

não esquenta, o importante é ajudar! :wink:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar