Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 06/04/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
Buscar en una estructura record

Hola, como puedo armar una función para que me sirva para buscar en distintas estructuras Record ?
(por lo menos no ví ninguna que lo haga)

por ejemplo tengo
Código Delphi [-]
  TProvincias = record
    Provin : string;
    Importe : currency;
    Descri   : string;
   end;

  TIvas = record
    Codigo : string;
    Descri : string;
    Porcentaje : currency;
   end;

  TaProvincias = array of TProvincias;
  TaIvas       = array of TIvas;

  // luego defino las variables
    aProvincias :  TaProvincias;
    aIvas       :  TIvas;

y acá el problema de como buscar, este es un simple ejemplo que no funciona, cualquier ayuda es bien venida
Código Delphi [-]
function BuscarEnRecord(aRecord:array of TObject; Campo:variant; Buscar:Variant):integer;
///////////////////////////////////////////////////
// aRecord = array donde buscar
// Campo  = campo del record donde buscar
// Buscar  = string o número a buscar
///////////////////////////////////////////////////
var i:integer;
begin
  for i:=0 to Length(aRecord) do begin
    if aRecord[i].Campo = Buscar then begin
      Result := i;
      Exit;
    end;
  end;
  Result := -1; // no lo encontró
end;

Muchas Gracias
Reply With Quote
  #2  
Old 06/04/2018
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
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.

¿ En cuál versión de Delphi estas trabajando ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Reply With Quote
  #3  
Old 06/04/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
usando delphi 7
Reply With Quote
  #4  
Old 06/04/2018
Caminante's Avatar
Caminante Caminante is offline
Miembro
 
Join Date: Oct 2010
Location: Lima - Peru
Posts: 338
Poder: 17
Caminante Va camino a la fama
Quote:
Originally Posted by fcios View Post
Código Delphi [-] if aRecord[i].Campo = Buscar then begin


Hola

Veo que en el parametro campo envias el nombre del campo que quieres buscar. La verdad eso no lo veo viable y no creo que alguna version de delphi la acepte.

Tal vez usando RTTI podrias acceder a cualquier campo del record pero de esa forma no lo creo.

Se que no es de ayuda pero creo que tendrias que buscar otra manera. Haber si alguien mas nos saca de la duda.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Reply With Quote
  #5  
Old 06/04/2018
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
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.
Quote:
Originally Posted by fcios View Post
usando delphi 7
Por eso era mi pregunta, desde Delphi 7 no veo posible que accedas a los campos de un record.

Si fuese Delphi 2010 o una versión superior, podrías hacerlo usando RTTI como se muestra en este enlace: List the Record's element\fields

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Reply With Quote
  #6  
Old 06/04/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
y hay alguna forma de buscar siempre en el primer campo ?
Reply With Quote
  #7  
Old 09/04/2018
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Quote:
Originally Posted by fcios View Post
y hay alguna forma de buscar siempre en el primer campo ?
Si sabes el tipo, si.

Mira este ejemplo:
Código Delphi [-]
type
TR = record
  UNO: integer;
  DOS: CHAR;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  V: TR;
begin
  V.UNO:= 1;
  Edit1.Text:= IntToStr(PInteger(@V)^);
end;


Saludos.
Reply With Quote
  #8  
Old 12/04/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
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;
Reply With Quote
  #9  
Old 12/04/2018
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
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
Reply With Quote
  #10  
Old 17/04/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
gracias escafandra !!
Reply With Quote
  #11  
Old 04/08/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
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;
Reply With Quote
  #12  
Old 04/08/2018
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
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 ....
Reply With Quote
  #13  
Old 06/08/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
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
Reply With Quote
  #14  
Old 06/08/2018
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
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.

Quote:
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)

Quote:
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 ....
Reply With Quote
  #15  
Old 06/08/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
ok, en lo de Escafandra busca en el primer campo de CADA array si mando varios arrays, eso está ok

Yo quiero buscar en el primer campo dentro del único array que le mando, por eso definí
BitBtn4Click que llama a
function BuscarEnRecord4(aRecord: TRecord2; Buscar:string):integer;

y lo que me cuesta, entra varias cosas..., es poder definir aRecord de un tipo puntero que pueda apuntar a cualquier tipo de TRecord
por eso arme el ejemplo de
BitBtn4Click que llama a
function BuscarEnRecord4(aRecord: TRecord2; Buscar:string):integer;

GRACIAS otra vez
Reply With Quote
  #16  
Old 07/08/2018
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
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
Quote:
Originally Posted by fcios View Post
ok, en lo de Escafandra busca en el primer campo de CADA array si mando varios arrays, eso está ok

Yo quiero buscar en el primer campo dentro del único array que le mando, por eso definí
BitBtn4Click que llama a
function BuscarEnRecord4(aRecord: TRecord2; Buscar:string):integer;

y lo que me cuesta, entra varias cosas..., es poder definir aRecord de un tipo puntero que pueda apuntar a cualquier tipo de TRecord
...
Pero es que ya está... aRecord esta definida de tipo TRecord2 que es un Pointer, es decir que este código de ejemplo,
Código Delphi [-]
...
type
  TRecord2 = Pointer;

function foo(aRecord: Pointer; cad: string): Boolean; // (TRecord2 ó Pointer a gusto)
begin
  ShowMessage(PAnsiString(aRecord)^);
  //...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r1 : record
    a: string;
    b: Integer;
  end;

  r2 : record
    c: string;
    d: Double;
  end;
begin
  r1.a := 'Hola';
  r1.b := 1;

  r2.c := 'mundo';
  r2.d := 3.1416;

  foo(@r1, 'Hola');
  foo(@r2, 'mundo');
end;
funciona sin problemas siempre y cuando el primer campo de los Records sea del mismo tipo...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Reply With Quote
  #17  
Old 07/08/2018
fcios fcios is offline
Miembro
 
Join Date: Jul 2003
Posts: 108
Poder: 24
fcios Va por buen camino
ok, eso funciona bárbaro... pero r1 no es un array

serias tan amablede hacerlo funcionar definiendo un array como por ejemplo
Código Delphi [-]
  SetLength(a1,3); // seteo a 3 items
  a1[0].UNO := 'Hola';
  a1[1].UNO := 'Carola';
  a1[2].UNO := 'Adios';
que está en el ejemplo BuscarEnRecord4 y BitBtn4Click que es donde me dan los errores,
yo quiero poder recorrer el array que le mande

Gracias

Last edited by ecfisa : 08/08/2018 at 00:41. Reason: Agregar etiquetas [DELPHI] [/DELPHI]
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Estructura .pak JORGE13 Tablas planas 3 17/12/2010 14:13
Estructura BD mjjj SQL 12 14/12/2009 13:12
Puntero a Estructura (Record) jlrbotella OOP 2 05/03/2007 12:39
object pascal - buscar en un record por contenido de un edit. runnerfrog OOP 5 19/12/2006 12:31
Estructura de un CD david duarte Varios 4 27/10/2005 17:48


All times are GMT +2. The time now is 15:12.


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