Como criar um vetor/matriz dinamicamente. É possivel?

Delphi

06/07/2004

oi galera, eu queria saber se tem jeito de eu criar um vetor ou uma matriz dinamicamante,como eu faço isso ? isso e possivel?




:arrow: [color=red:e398f98f9a]Título alterado pelo Moderador oTTo. Removido ´vetor´.[/color:e398f98f9a]


Anicetojunior

Anicetojunior

Curtidas 0

Respostas

Flyskin

Flyskin

06/07/2004

Tem sim, só que vc precisará controlar os endereços de memória através de ponteiros. O comando é o new(var) onde a var é do tipo TPoiter. Este comando vem desde a época do turbopascal só que faz tempo que não utilizo. Dá uma olhada no help que provavelmente tem algo lá.

Espero que te ajude.


GOSTEI 0
Rômulo Barros

Rômulo Barros

06/07/2004

É possível sim. Para isto, utilize o método SetLength(String or Array;NewLength)

procedure TForm1.StringGrid1Click(Sender: TObject);
Var
  MeuVetor : array of string;
begin
  SetLength(MeuVetor,1000);
end



GOSTEI 0
Cabelo

Cabelo

06/07/2004

Caro Colega..

para utilizar um vetor deste tipo, declare em TYPES um vetor do Tipo Record..

type
r_teste = record
s_teste : char
end;

type
r_teste_1 = record
s_teste_1 : string;
s_teste_2 : array of r_teste;
end;

depois disso vc deve declarar uma variável em PUBLIC ou PRIVATE

s_v_teste : array ofr_teste_1;

depois no evento onCreate do Form que está declarado estas variáveis, vc deve utlizar assim :

por exemplo em dados :

for v_i := 0 to Query.recordcount - 1 do
begin
setlength(s_v_teste, length(s_v_teste) + 1);
with s_v_teste[v_i] do
begin
s_teste_1 := Query.fieldbyname(CAMPO).asstring;
for v_j := 0 to Query2.recordcount - 1 do
begin
setlength(s_v_teste[v_i].s_teste2, length(s_v_teste[v_i].s_teste2) + 1);
with s_v_teste[v_i].s_teste_2 do
begin
s_teste := Char(Query2.fieldbyname(CAMPO).asstring);
end;
end;

isto por exemplo seria um master detail de duas query´s distintas dentro de uma matriz..

espero ter ajudado..

sem mais

Cabelo


GOSTEI 0
Dopi

Dopi

06/07/2004

No Clipper eu adorava os Vetores (ou arrays) dinámicos... No Delphi achei complicado usa-los... Mas os Objetos de Lista são muito melhores.... procure por TStringList, TObjectList, TList (ou semelhantes) no help do Delphi... são fantásticos...


GOSTEI 0
Anicetojunior

Anicetojunior

06/07/2004

Caro Colega.. para utilizar um vetor deste tipo, declare em TYPES um vetor do Tipo Record.. type r_teste = record s_teste : char end; type r_teste_1 = record s_teste_1 : string; s_teste_2 : array of r_teste; end; depois disso vc deve declarar uma variável em PUBLIC ou PRIVATE s_v_teste : array ofr_teste_1; depois no evento onCreate do Form que está declarado estas variáveis, vc deve utlizar assim : por exemplo em dados : for v_i := 0 to Query.recordcount - 1 do begin setlength(s_v_teste, length(s_v_teste) + 1); with s_v_teste[v_i] do begin s_teste_1 := Query.fieldbyname(CAMPO).asstring; for v_j := 0 to Query2.recordcount - 1 do begin setlength(s_v_teste[v_i].s_teste2, length(s_v_teste[v_i].s_teste2) + 1); with s_v_teste[v_i].s_teste_2 do begin s_teste := Char(Query2.fieldbyname(CAMPO).asstring); end; end; isto por exemplo seria um master detail de duas query´s distintas dentro de uma matriz.. espero ter ajudado.. sem mais Cabelo


como seria isso com uma tabela ?


GOSTEI 0
Cabelo

Cabelo

06/07/2004

Como assim :

Se vc estiver dizendo uma tabela no banco de dados seria exatamente como eu disse :

vc dá um select para filtrar os dados que vc deseja trazer do banco de dados.

aí vc declara as variávei assim :

type
r_dados = record
s_dados : string;
end;

depois disso vc deve declarar uma variável em PUBLIC ou PRIVATE

s_v_tabela : array of r_dados;

no form create

Query.SQL.ADD(´select CAMPO_QUERY from TABELA order by CAMPO_QUERY);
Query.Open;
for v_i := 0 to Query.recordcount - 1 do
begin
setlength(s_v_tabela, length(s_v_tabela) + 1);
s_v_tabela[v_i].s_dados := Query.fieldbyname(´CAMPO_QUERY´).asstring;
end;
end;

espero ter ajudado..

só lembre-se que vc deve ter o mesmo número de variáveis declaradas no vetor quento os campos do select..

se precisar poste suas dúvidas..

sem mais

Cabelo


GOSTEI 0
Gollum

Gollum

06/07/2004

é possivel sim.
a sintaxe da criação de vetor Dinamico é .

var
Variavel : array of string;
begin
setlength(variavel,5);
variavel[0]:=´Dark´;
variavel[1]:=´Dada´;
variavel[2]:=´...´;
variavel[5]:=´Dom´;
showmessage(variavel[5]);
end;


GOSTEI 0
Anicetojunior

Anicetojunior

06/07/2004

o que seria esse numero ´5´ no setlength(variavel,5) ? e o tamanho maximo desse vetor ?


GOSTEI 0
Cabelo

Cabelo

06/07/2004

Caro Colega..

O número cinco, é o tamanho máximo do seu vetor, portanto, seria necessário, vc utilizar exatamente como o colega Gollun passou, o problema é o seguinte, se vc quiser criar uma tabela de dados, em RUN Time, não tem como vc saber qual é o número máximo de registros que esta tabela irá conter, por isso é necessário vc criar um vetor do tipo record, assim como eu passei, pq com ele, não interessa quantos registros vc tiver na tabela, ele não irá parar de crescer..

além do que com ele vc cria matrizes, bem simples de utilizar..

sem muita mão de obra, vc deixa o processamento todo para o computador e não para suas mãos..

espero ter ajudado..

sem mais

Cabelo


GOSTEI 0
POSTAR