Componente em tempo de execução
Amigos da lista estou criando um listview em tempo de execuação
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
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
Curtidas 0
Respostas
Massuda
05/08/2005
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.GOSTEI 0
Pleonardomv
05/08/2005
Massuda, quando crio assim
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
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
GOSTEI 0
Bruno Belchior
05/08/2005
vc está criando apartir de um formulário?? pq o [b:b9435be721]Self[/b:b9435be721] me parece não ser um controle...
GOSTEI 0
Adriano Santos
05/08/2005
Massuda, quando crio assim
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
v_FileList := TListview.Create(Self);
Você precisar ´dizer´ onde o componente será criado veja:
v_FileList := TListview.Create(Form1); v_FileList.Parent := Form1;
Isso já resolve o problema.
GOSTEI 0
Pleonardomv
05/08/2005
Estou fazendo um teste em um formulario veja o codigo completo
Meu objetivo é randomizar e pegar um registro que está dentro do listview
Obrigado pela ajuda
T+
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+
GOSTEI 0
Massuda
05/08/2005
Isto funciona sem problemas...
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:ou seja, crie o componente e defina o Parent. Num componente visual, o Parent deve estar sempre com um valor não nulo.
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;
GOSTEI 0
Pleonardomv
05/08/2005
Obrigado aos colegas que me ajudaram. Rwsolví o problema...
Valeu
pleonardomv
Valeu
pleonardomv
GOSTEI 0
Adriano Santos
05/08/2005
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:
GOSTEI 0
Massuda
05/08/2005
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.
GOSTEI 0
Adriano Santos
05/08/2005
[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
GOSTEI 0