Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2018
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
Muchas gracias a todos, lo de escafandra anda ok

pero quiero poder recibir cualquier tipo record, por ejemplo
Código Delphi [-]
type
TR = record
  UNO: string; // integer;
  DOS: CHAR;
end;

TR3 = record
  campo1: string;
  DOS: CHAR;
end;

aTR   = array of TR;
aTR3 = array of TR3;

// como debo definir aRecord para poder recibir cualquier tipo de array record ?, (mi mira a los punteros está muy desviada) Muchas gracias
Código Delphi [-]

function BuscarEnRecord2(aRecord: record^; Buscar:string):integer;
///////////////////////////////////////////////////
// aRecord = array donde buscar
// Buscar  = string
///////////////////////////////////////////////////
var i:integer;
//  s:string;
begin
  for i:=0 to Length(aRecord) -1 do begin
//  s := PString(@aRecord[i])^;
//  if s = Buscar then begin
    if PString(@aRecord[i])^ = Buscar then begin
      Result := i;
      Exit;
    end;
  end;
  Result := -1; // no lo encontró
end;
Responder Con Cita
  #2  
Antiguo 12-04-2018
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Lo que pretendes tiene solución con punteros, pero el primer campo de cada estructure (record) debe ser del mismo tipo, en este caso String. No nos importa como se llame, lo podemos localizar.

Basado en tu código, podemos definir el parámetro aRecord como un array de punteros. Cada puntero apuntará a un elemento de una estructura.

Código Delphi [-]
type
TR = record
  UNO: string; // integer;
  DOS: CHAR;
end;
PTR = ^TR;

TR3 = record
  campo1: string;
  DOS: CHAR;
end;

aTR   = array of TR;
aTR3 = array of TR3;
PaTR = ^aTR;

TRecods = array of pointer;
PPString = ^PString;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function BuscarEnRecord2(aRecord: TRecods; Buscar:string):integer;
var i:integer;
begin
  for i:=0 to Length(aRecord) -1 do begin
    if (PPString(@aRecord[i])^)^ = Buscar then begin
      Result := i;
      Exit;
    end;
  end;
  Result := -1; // no lo encontró
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  R0,R1,R2: TR;
  PR: TRecods;
  Index: integer;
begin
  // Preparamos el array de punteros... como quieras...
  SetLength(PR, 3);
  R0.UNO:= 'Hola';
  R1.UNO:= 'Caracola';
  R2.UNO:= 'Adios';
  PR[0]:= @R0;
  PR[1]:= @R1;
  PR[2]:= @R2;

  // Buscamos
  Index:= BuscarEnRecord2(PR, 'Adios');
  if Index >= 0 then
    ShowMessage('Eureca  ' + IntToStr(Index));
end;


Saludos
Responder Con Cita
  #3  
Antiguo 17-04-2018
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
gracias escafandra !!
Responder Con Cita
  #4  
Antiguo 04-08-2018
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
Question

Una ayuda más por favor
como busco en el primer campo recorriendo un array,
muestro con ERROR donde recibo error al compilar, gracias de antemano

Código Delphi [-]

type
TR = record
  UNO: string; // integer;
  DOS: CHAR;
end;
PTR = ^TR;

TR3 = record
  campo1: string;
  DOS: CHAR;
end;

aTR  = array of TR;
aTR3 = array of TR3;
PaTR = ^aTR;

//TRecods = array of pointer;
PPString = ^PString;

TRecord2 = pointer; //array of pointer;


function BuscarEnRecord4(aRecord: TRecord2; Buscar:string):integer;
var i:integer;
    s:string;
begin
  i := Length(aRecord); //  ERROR Incompatible Types
  for i:=0 to Length(aRecord) -1 do begin     //  ERROR Incompatible Types
    s := (PPString(@aRecord[i])^)^;  //  ERROR Array typed required
    if (PPString(@aRecord[i])^)^ = Buscar then begin    //  ERROR Array typed required
      Result := i;
      Exit;
    end;
  end;
  Result := -1; // no lo encontró
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
var
  a1: aTR;
  a2: aTR3;
  Index: integer;

  PR2 :TRecord2;
begin
  SetLength(a1,3); // seteo a 3 items
  a1[0].UNO := 'Hola';
  a1[1].UNO := 'Carola';
  a1[2].UNO := 'Adios';

  SetLength(a2,3); // seteo a 3 items
  a2[0].campo1 := 'Hola2';
  a2[1].campo1 := 'Carola2';
  a2[2].campo1 := 'Adios2';

  // Buscamos
  PR2 := @a1;
  Index:= BuscarEnRecord4(PR2{@a1}, 'Adios');
  if Index >= 0 then
    ShowMessage('Eureca  ' + IntToStr(Index));

  Index:= BuscarEnRecord4(@a2, 'Adios2');
  if Index >= 0 then
    ShowMessage('Eureca  ' + IntToStr(Index));

end;
Responder Con Cita
  #5  
Antiguo 04-08-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

El error se produce por que estas enviando a la la función Length() un valor de tipo TRecord2 y esta sólo admite los tipos string o array.

Si deseas obtener el tamaño en bytes del argumento "aRecord" deberías usar la función SizeOf().

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 06-08-2018
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
ok, si yo defino
Código Delphi [-]
  SetLength(a1,3); // seteo a 3 items
  a1[0].UNO := 'Hola';
  a1[1].UNO := 'Carola';
  a1[2].UNO := 'Adios';

como hago para saber que tengo que recorrer 3 items dentro de la funcion ?
y como puedo obtener el primer campo, que también me da error al compilar
s := (PPString(@aRecord[i])^)^; // ERROR Array typed required

muchas Gracias
Responder Con Cita
  #7  
Antiguo 06-08-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
como hago para saber que tengo que recorrer 3 items dentro de la funcion ?
Sea "a1" un arreglo estático o dinámico de elementos de cualquier tipo, podes conocer su capacidad mediante la función Length() y las cotas inferior y superior con las funciones Low() y High() respectivamente.

vg.r.:
Código Delphi [-]
...
var
  v1: array[1..10] of Pointer;
  v2: array of PChar;
begin
  ShowMessageFmt('%d - %d - %d',[Length(v1), Low(v1), High(v1)]);
  // mostrará: 10 - 1 - 10

  SetLength(v2, 10);  
  ShowMessageFmt('%d - %d - %d',[Length(v2), Low(v2), High(v2)]);
  // mostrará: 10 - 0 - 9 (indexación base-cero)

Cita:
y como puedo obtener el primer campo, que también me da error al compilar
Revisa el tipo de "aRecord". Fijate que escafandra en su código lo declara como TRecods (TRecods = array of pointer)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Estructura .pak JORGE13 Tablas planas 3 17-12-2010 14:13:15
Estructura BD mjjj SQL 12 14-12-2009 13:12:34
Puntero a Estructura (Record) jlrbotella OOP 2 05-03-2007 12:39:51
object pascal - buscar en un record por contenido de un edit. runnerfrog OOP 5 19-12-2006 12:31:06
Estructura de un CD david duarte Varios 4 27-10-2005 17:48:50


La franja horaria es GMT +2. Ahora son las 23:55:03.


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
Copyright 1996-2007 Club Delphi