Fórum Componente em tempo de execução #290864

05/08/2005

0

Amigos da lista estou criando um listview em tempo de execuação

var v_FileList: TListview;
begin
     v_FileList := TListview.CreateParented(Self.Handle); 
     v_FileList.Name:= ´List1´;
    // aqui adiciono alguns registros 
end


Tem como eu me referir a esse TListview em outro local do programa?
Por exemplo uma variável receber um registro que foi adicionado na hora que criei o mesmo?

Abraços
pleonardomv


Pleonardomv

Pleonardomv

Responder

Posts

05/08/2005

Massuda

Não use CreateParented... esse construtor é reservado para o caso do componente estar sendo criado dentro de uma janela que não foi criada pelo Delphi. Use Create:
v_FileList := TListview.Create(Self);
v_FileList.Parent := Self; 
// use Self ou o objeto sobre o qual o ListView vai aparecer
v_FileList.Top := ...
v_FileList.Left := ...
...
Tem como eu me referir a esse TListview em outro local do programa?
Sim, basta você retornar/armazenar o valor de v_FileList em uma variável que seja acessível no outro lugar onde você deseja utilizar esse ListView.


Responder

Gostei + 0

05/08/2005

Pleonardomv

Massuda, quando crio assim
 
v_FileList := TListview.Create(Self); 

me retorna o erro
´Control´ has no parent window

Porque? Outra pergunta posso fazer uma busca dentro desse listview depois? como?
Desculpe e obrigado

T


Responder

Gostei + 0

05/08/2005

Bruno Belchior

vc está criando apartir de um formulário?? pq o [b:b9435be721]Self[/b:b9435be721] me parece não ser um controle...


Responder

Gostei + 0

05/08/2005

Adriano Santos

Massuda, quando crio assim
 
v_FileList := TListview.Create(Self); 
me retorna o erro ´Control´ has no parent window Porque? Outra pergunta posso fazer uma busca dentro desse listview depois? como? Desculpe e obrigado T


Você precisar ´dizer´ onde o componente será criado veja:

 
v_FileList := TListview.Create(Form1); 
v_FileList.Parent := Form1;



Isso já resolve o problema.


Responder

Gostei + 0

05/08/2005

Pleonardomv

Estou fazendo um teste em um formulario veja o codigo completo

procedure TForm1.Button1Click(Sender: TObject);
var v_FileList: TListview;
    v_Item  : TListItem;
    v_Ret, vNomePasta, _B: String;
    vProvisorio: String;
    vIndice, i , h: integer;
    f_Arq: TStrings;
    N: Dword;
begin
        v_Ret := ´´;
        v_FileList           := TListview.CreateParented(Self.Handle);

//        v_FileList           :=TListview.Create(self);
        v_FileList.ViewStyle:= vsReport;
        v_FileList.Name:= ´ListTeste´;
        v_FileList.Columns.Add();
        v_FileList.Columns.Add();
        v_FileList.Columns.Add();

        for N := 0 to 10 do
        begin
           v_Item         := v_FileList.Items.Insert(N);
           v_Item.Caption:= ´Teste ´+inttostr(N);
           v_Item.SubItems.Add( ´Teste numero 2 ´+inttostr(N)); //codigo
        end;

        v_FileList.Visible   := False;
        Label1.Caption:=  inttostr(v_FileList.Items.Item[RandomRange(0, v_FileList.Items.Count -1 +1)].Index);
        H:= strtoint(Label1.Caption);
        Label2.Caption:= v_FileList.Items.Item[strtoint(Label1.Caption)].Caption;
        v_FileList.Items.Item[h].SubItems.Add(´S´);
//          v_FileList.Refresh;
        v_FileList.Visible:= true;
end;


Meu objetivo é randomizar e pegar um registro que está dentro do listview

Obrigado pela ajuda
T+


Responder

Gostei + 0

05/08/2005

Massuda

Isto funciona sem problemas...
var
  LV: TListView;
  LI: TListItem;
  I: Integer;
...
  LV := TListView.Create(Self);
  LV.Parent := Self;
  LV.Top := ...;
  LV.Left := ...;

  LV.ViewStyle := vsReport;
  LV.Columns.Add;
  LV.Columns.Add;
  LV.Columns.Add;

  for I := 1 to 10 do begin
    LI := LV.Items.Add;
    LI.Caption := ´Item ´ + IntToStr(I);
    LI.SubItems.Add(´Item ´ + IntToStr(I) + ´.1´);
  end;
....

Só reforçando... não use o construtor CreateParented; ele não é equivalente a criar um componente com Create e então ajustar o Parent.

Sempre que criar um componente visual em runtime, siga este modelo:
Xyz := TXyz.Create(Self);
Xyz.Parent := Self;
ou seja, crie o componente e defina o Parent. Num componente visual, o Parent deve estar sempre com um valor não nulo.


Responder

Gostei + 0

05/08/2005

Pleonardomv

Obrigado aos colegas que me ajudaram. Rwsolví o problema...

Valeu

pleonardomv


Responder

Gostei + 0

05/08/2005

Adriano Santos

Isto funciona sem problemas...
var

...
  LV := TListView.Create(Self);
...


[b:b1830eab5f]Massuda[/b:b1830eab5f], qual a diferença entre criar como Self e criar passando o form (que é o meu caso) ?
Normalmente eu uso assim:


  MeuObjeto := TClasseMeuObjeto.Create(FormXXXX);  
  MeuObjeto.Parent := FormXXXX;



O Self não é o próprio FormXXXX? :oops:


Responder

Gostei + 0

06/08/2005

Massuda

O Self não é o próprio FormXXXX?
Isso é verdade se houver apenas uma instância da classe do FormXXXX e essa instância estiver referenciada pelo FormXXXX.

Por outro lado, se você tiver duas ou mais instâncias da classe do FormXXXX, Self será uma referência à cada instância, enquanto FormXXXX se refere a uma única instância. Usando o exemplo que você postou, se tiver dois forms da mesma classe de FormXXXX podem ocorrer coisas estranhas, por exemplo:[list:7c64272006][*:7c64272006]o segundo form a ser criado não funciona como esperado[*:7c64272006]você perde a referência ao primeiro form criado[/list:u:7c64272006]
Evite usar o nome (referência) de uma instância de uma classe dentro do código que implementa a classe; dessa maneira, você evita que a classe tenha uma dependencia com uma variável externa (possivelmente global), o que aumenta a possibilidade de reaproveitar essa classe em outros projetos.


Responder

Gostei + 0

08/08/2005

Adriano Santos

[quote:55cff8fcbb=´asrsantos´]O Self não é o próprio FormXXXX?
Isso é verdade se houver apenas uma instância da classe do FormXXXX e essa instância estiver referenciada pelo FormXXXX.

Por outro lado, se você tiver duas ou mais instâncias da classe do FormXXXX, Self será uma referência à cada instância, enquanto FormXXXX se refere a uma única instância. Usando o exemplo que você postou, se tiver dois forms da mesma classe de FormXXXX podem ocorrer coisas estranhas, por exemplo:[list:55cff8fcbb][*:55cff8fcbb]o segundo form a ser criado não funciona como esperado[*:55cff8fcbb]você perde a referência ao primeiro form criado[/list:u:55cff8fcbb]
Evite usar o nome (referência) de uma instância de uma classe dentro do código que implementa a classe; dessa maneira, você evita que a classe tenha uma dependencia com uma variável externa (possivelmente global), o que aumenta a possibilidade de reaproveitar essa classe em outros projetos.[/quote:55cff8fcbb]


Ahhhh, legal isso ai hein [b:55cff8fcbb]Massuda[/b:55cff8fcbb] programo a tanto tempo e nunca parei pra tirar essa dúvida.

Valeu mano, abraço


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar