Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparar un String con el contenido de un Arreglo (https://www.clubdelphi.com/foros/showthread.php?t=84667)

Alejandro73 19-11-2013 20:32:29

Comparar un String con el contenido de un Arreglo
 
Estimados

Buenas tardes, tengo un arreglo definido de la siguiente manera

Código Delphi [-]
_arreglo  : array [1..2] of string = ('Opcion1','Opcion2');

En un combobox tengo opciones y obtengo en una variable de tipo string el valor del combobox.text

Posteriormente mediante un for debo comparar lo que tiene el combobox.text con los datos del arreglo _arreglo, pero al intentar comparar los valores no lo encuentra

dejo el codigo a ver si alguien me puede indicar donde esta el problema

Código Delphi [-]
for i:=0 to length(_arreglo)-1 do  if combobox.text = _arreglo[i] then Showmmesage('Posicion encontrada '+IntTostr(i));

Desde ya mucha gracias por su ayuda

nlsgarcia 19-11-2013 21:08:10

Alejandro73,

Cita:

Empezado por Alejandro73
...Comparar un String con el contenido de un Arreglo...al intentar comparar los valores no lo encuentra...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ArrOpc  : Array [1..5] of String = ('Opcion1','Opcion2','Opcion3','Opcion4','Opcion5');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;
begin
   for i := 0 to 9 do
      ComboBox1.Items.Add('Opcion' + IntToStr(i+1));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
   B : Boolean;

begin

   if ComboBox1.Text <> EmptyStr then
   begin

      for i := Low(ArrOpc) to High(ArrOpc) do
         if ComboBox1.text = ArrOpc[i] then
         begin
            MessageDlg('Item Encontrado en el Arreglo en la Posicion = ' + IntTostr(i),mtInformation,[mbOK],0);
            B := True;
         end;

      if not B then
         MessageDlg('Item No Encontrado en el Arreglo',mtError,[mbOK],0)

   end
   else
     MessageDlg('No se Ha seleccionado Ningún Item',mtError,[mbOK],0);

end;

end.
El código anterior compara los elementos de un arreglo con los elementos de un TComboBox.

Espero sea útil :)

Nelson.

Alejandro73 19-11-2013 21:28:51

Estimado

Gracias por responder, ya lo habia intentado de esa manera pero al momento de comparar no encuentra la igualdad, sera que el objeto que utilizo como combobox es un TbsSkinComboBox?

Saludos

orodriguezca 19-11-2013 22:01:48

El for debería iniciar en 1
 
Hola Alejandro73,


Creo que el problema es que el arreglo _arreglo inicia en 1 y el ciclo for lo estás iniciando en cero, es decir, el ciclo for esta revisando las posiciones 0 y 1 del arreglo y no las posiciones 1 y 2. De todas formas es extraño, aunque no encuentre coincidencias, que el código se pueda ejecutar sin que salte un error de indice fuera de rango.

nlsgarcia 19-11-2013 22:09:56

Alejandro73,

Cita:

Empezado por Alejandro73
...ya lo habia intentado de esa manera pero al momento de comparar no encuentra la igualdad, ¿Sera que el objeto que utilizo como combobox es un TbsSkinComboBox?...

Te comento:

1- El código sugerido en el Msg #2 funciona correctamente en Delphi 7 bajo Windows 7 Professional x32.

2- Al parecer el componente TbsSkinComboBox tiene las propiedades Text y ItemIndex, por lo cual es probable que funcione de forma similar al componente TComboBox de Delphi en lo que respecta a dichas propiedades.

3- Te sugiero hacer un debug del código y verificar el valor de todas las variables relacionadas al problema.

Revisa estos links y verifica las propiedades utilizadas del componente:
Cita:

Design beautiful Delphi version control address book : http://www.bvbcode.com/code/u53nm8to-1612827

main.pas : http://en.verysource.com/code/2102925_1/main.pas.html
Espero sea útil :)

Nelson.

nlsgarcia 19-11-2013 22:27:50

orodriguezca,

Cita:

Empezado por orodriguezca
...es extraño...que el código se pueda ejecutar sin que salte un error de indice fuera de rango...

Si la propiedad Project -> Options -> Compiler -> Runtime errors -> Range checking esta seleccionada, el compilador verificara errores de rango en caso contrario no.

Espero sea útil :)

Nelson.

ecfisa 19-11-2013 22:55:25

Hola.

El código de nlsgarcia funciona correctamente. Y como utiliza las funciones Low y High lo haría del mismo modo fuera cual fuere el rango del índice declarado.

Otro ejemplo similar:
Código Delphi [-]
...
var
  Vector: array [1512..1515] of string =('Opcion1', 'Opcion2', 'Opcion3', 'Opcion4');

function IsInArray(const Value: string): Integer;
var
  i: Integer;
begin
  Result := -1;
  for i := Low(Vector) to High(Vector) do
    if Vector[i] = Value then
    begin
      Result := i;
      Exit;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  inx: Integer;
begin
  inx := IsInArray(ComboBox1.Text);
  if inx <> -1 then
    ShowMessage(Format('Encontrado en posición: %d',[inx]))
  else
    ShowMessage('No encontrado');
end;
Si no encuentra un item, me inclino a pensar que los valores del arreglo difieren en algo de los del Combo, como por ejemplo un acento...

Saludos :)

Neftali [Germán.Estévez] 20-11-2013 11:50:43

Además de lo comentado ya...

(1) Ejecuta paso a paso para ver qué valen ambos valores en el momento de la comparación. Tal vez alguno incluya espacios o algo similar.
(2) Para las comparaciones de texto, también puedes utilizar AnsiCompareText (evitar mayúsculas y minúsculas diferentes).


La franja horaria es GMT +2. Ahora son las 15:44:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi