Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tengo que corregir lo que dije en el mensaje anterior.

El método IndexOf no va a servir ya que según entiendo ahora tú tienes que buscar toda la cadena conociendo sólo el código, es decir, tal como sucede si escribiésemos directamente en el combo usando la propiedad AutoComplete.

El ComboBox tiene un método, SelectItem, que, éste sí, me parece que es lo qe buscas. El inconveniente es que es un método protegido pero puedes usar el conocido truco de desprotección declarando un descendiente 'de palo':

Código:
type
  THackComboBox = class(TComboBox);
Posteriormente lo usas para acceder al método protegido:

Código:
THackComboBox(ComboBox1).SelectItem('G.6');
Esto colocará al combo en el primer ítem que empiece con "G.6" mostrando el texto completo.

De cualquier forma insisto en lo que te dije antes respecto de la tabla catálogo.

// Saludos
Responder Con Cita
  #2  
Antiguo 23-03-2004
Tomás Tomás is offline
Miembro
 
Registrado: may 2003
Ubicación: Elche
Posts: 140
Poder: 24
Tomás Va por buen camino
Hola:

He estado probando lo que me indica "roman" y funciona bien:

THackComboBox = class(TComboBox);
THackComboBox(CBPartidas).SelectItem(DM.IBDSContaPARTIDA.AsString);

Buscando yo había encontrado una solucción aunque con más lineas de código, poniendo la propiedad DroppedDown a True y luego a False:

CBPartidas.Text := DM.IBDSContaPARTIDA.AsString;
CBPartidas.DroppedDown := True;
CBPartidas.DroppedDown := False;

De todas formas voy a intentar hacerlo con DbLookupComboBox, ya que la tabla PARTIDAS con los campos CODIGO y DESCRIPCIÓN ya la tengo.

¿Por qué no lo he hecho antes? Porque no sabía de la existencia de DbLookupComboBox, ni de como se utiliza. No hay que olvidar que soy un simple novato, aficionado a Delphi, que intenta hacerse alguna aplicación simple, entreteniéndose...

Seguramente la próxima consulta tendrá que ver con DbLookupComboBox.

Muchas gracias a todos. Tomás.
Responder Con Cita
  #3  
Antiguo 23-03-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 24
marto Va por buen camino
Con todos los respetos, pero creo que declarar una clase que hereda de TComboBox en la unit para poder acceder al método protected Selectitem, no es, precisamente demsiado "metódico "*. Máxime, cuando emularlo desde fuera es tan sencillo como:
Código:
var 
  i: Integer;
begin
  i := 0;
  while (i < Combo.Items.Count) and (Copy(Combo.Items[i], 1, 3) <> ValorABuscar) do
	Inc(i);
  if (i < Combo.Items.Count) then
	Combo.ItemIndex := i;
end;
Este código, no lo he probado porque no tengo aquí el Delphi, pero juraría que funciona "tal cual".


*Por supuesto que lo que es o no metódico es totalmente subjetivo
__________________
E pur si muove
Responder Con Cita
  #4  
Antiguo 23-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 27
__cadetill Va por buen camino
sólo quería poner el método que propone Román

Código:
function TCustomComboBox.SelectItem(const AnItem: String): Boolean;
var
  Idx: Integer;
  ValueChange: Boolean;
begin
  if Length(AnItem) = 0 then
  begin
    Result := False;
    ItemIndex := -1;
    Change;
    exit;
  end;
  Idx := SendMessage(Handle, CB_FINDSTRING, -1, LongInt(PChar(AnItem)));
  Result := (Idx <> CB_ERR);
  if not Result then exit;
  ValueChange := Idx <> ItemIndex;
  SendMessage(Handle, CB_SETCURSEL, Idx, 0);
  if (Style in [csDropDown, csSimple]) then
  begin
    Text := AnItem + Copy(Items[Idx], Length(AnItem) + 1, MaxInt);
    SendMessage(Handle, CB_SETEDITSEL, 0, MakeLParam(Length(AnItem), Length(Text)));
  end
  else
  begin
    ItemIndex := Idx;
    FFilter := AnItem;
  end;
  if ValueChange then
  begin
    Click;
    Select;
  end;
end;
Lo que no entiendo es por qué no hacen públicos este tipo de métodos!!

Última edición por __cadetill fecha: 23-03-2004 a las 00:40:59.
Responder Con Cita
  #5  
Antiguo 23-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Aquí podríamos abrir un debate.

Crear un ciclo para implementar algo que ya está implementado lo veo como reinventar la rueda, máxime que ni siquiera es menester un ciclo ya que, como nos muestra cadetill, el mensaje LB_FINDSTRING, implementado en los controles estandar de Windows hace todo el trabajo. Si somos muy estrictos lo más correcto quizá sería derivar una nueva componente de TComoboBox implementando la funcionalidad deseada usando el método protegido SelectItem, pero si se trata de un sólo caso no veo ningún problema pero sí más eficiente usar el truco de la desprotección que, por otra parte, va totalmente de acuerdo a las "reglas" de herencia de Delphi.

// Saludos
Responder Con Cita
  #6  
Antiguo 24-03-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 24
marto Va por buen camino
Pues sí, podríamos abrir un debate
Primero, reconocer que fui un poco provocador en el tono para que se explicasen las ventajas del tu método.
Repecto a lo del ciclo... al final se ejecuta igual, el tema es si lo haces tú o o si lo hace el control nativo de windows. No me gusta más mi método porque sea más eficiente, sinó porque creo que la otra técnica es un abuso del lenguaje. No obstante, he de reconocer que, en momentos de apuro, he echado mano de ella en más de una ocasión.
La solución ideal seria la de crear el nuevo componente, pero quizá sea un poco desproporcionada con el problema.
__________________
E pur si muove
Responder Con Cita
  #7  
Antiguo 24-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por marto
Repecto a lo del ciclo... al final se ejecuta igual, el tema es si lo haces tú o o si lo hace el control nativo de windows.
No necesariamente, muy probablemente el ciclo que utiliza internamente el control nativo de Windows está programado en C o incluso directamente en ensamblador.

Cita:
Empezado por marto
sinó porque creo que la otra técnica es un abuso del lenguaje.
Este es el punto, ¿por qué es un abuso del lenguaje? Los métodos protegidos están para ser usados por clases descendientes- como lo es THackComboBox - y el moldeo de datos a una clase descendiente es perfectamente válido.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:37:09.


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