Ir para conteúdo
Fórum Script Brasil
  • 0

Componente Stringgrid


Paulo Nobre

Pergunta

Estou com um projeto usando o StringGrid(paleta additional) e tenho

algumas dúvidas:

1)As strings que são usadas nas células não têm aparentemente

nenhuma propriedade para serem alinhadas dentro delas.

A pergunta: Existe como centralizar dentro das células?

Alguém sabe o código? Ou este é mais um componente que não centraliza, já que o simples edit não centraliza.

2) Entre as propriedades existe a options, que entre outras coisas permite que o usuário edit ou não uma célula. Em tempo de projeto, bsta escolher options goEditing igual a true. O problema é que quero dar esta opção ao usuário com um botão; tipo clicando no botão ele passará a poder editar.

Não sei como fazer isto, tentei

stringgrid1.Options(gdEditing):= true;

e não tem o menor sentido.

Ohei o help e não existe nenhum exemplo, apresenta apenas os tipos.

3) Outra dúvida seria, como guardar as informações das 18 células que terei no meu stringrid.Poderia passar todas para o registro, uma a uma, mais acho que isto seria burro.Alguém poderia me mostrar, qual seria o código para passar isto para um txt.Não tenho muita experiência com eles.As células são do tipo cells(i,j).

Agradeceria a ajuda.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Olá Paulo,

1)As strings que são usadas nas células não têm aparentemente

nenhuma propriedade para serem alinhadas dentro delas.

Diretamente creio que não porque Cells[i,j] simplesmente retorna uma string, mas no evento onDrawCell você tem o Rect que é o TRect do Canvas daquela célula mais o ACol e ARow que identificam qual célula está sendo pintada e com isto creio que dê p/ centralizá-la.
Não sei como fazer isto, tentei

stringgrid1.Options(gdEditing):= true;

e não tem o menor sentido.

Na verdade a propriedade Options é um Set de constantes e o correto seria:

stringgrid1.Options := stringgrid1.Options + [goEditing]; // Edita

stringgrid1.Options := stringgrid1.Options - [goEditing]; // Retira a edição

3) Outra dúvida seria, como guardar as informações das 18 células que terei no meu stringrid.Poderia passar todas para o registro, uma a uma, mais acho que isto seria burro.Alguém poderia me mostrar, qual seria o código para passar isto para um txt.Não tenho muita experiência com eles.As células são do tipo cells(i,j).
Bom você pode utilizar um TMemoryStream de auxílio:

// Para salvar
var i:Integer; MS:TMemoryStream;
begin
  MS := TMemoryStream.Create;
  for i := 0 to stringgrid1.RowCount-1 do
    stringgrid1.Rows[i].SaveToStream(MS);
  MS.SaveToFile('c:\temp\stringgrid1.txt');
  MS.Free;
end;
// Para carregar
var i,iPos:Integer; MS:TMemoryStream;
begin
  MS := TMemoryStream.Create;
  MS.LoadFromFile('c:\temp\stringgrid1.txt');
  iPos := 0;
  for i := 0 to stringgrid1.RowCount-1 do
  begin
    MS.Position := iPos;
    stringgrid1.Rows[i].LoadFromStream(MS);
    Inc(iPos, Length(stringgrid1.Rows[i].Text));
  end;
  MS.Free;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, um TMemoryStream basicamente é um objeto de auxílio, assim como o TList(array de ponteiros), TStrings(array de strings), etc...

você não os vê nas guias de componentes, mas eles as vezes estão embutidos nas propriedades de alguns componentes. Um exemplo é a propriedade Rows do TStringGrid que nada mais é que um TStrings; daí você entra no conceito de classes e herança porque Rows herda propriedades, métodos e funções da classe TStrings.

Um TMemoryStream é uma classe que trabalha diretamente com a memória e seu conteúdo fica somente em memória durante seu ciclo de vida. Quando você faz:

MS := TMemoryStream.Create; você apenas instancia o objeto. Quando você faz:

stringgrid1.Rows.SaveToStream(MS); todas as células(strings) daquela linha são salvas em memória e é aí que o TMemoryStream entra com a função de auxílio porque você não se preocupa com alocação de memória; ele já faz isso automaticamente.

Quando você faz MS.Free; não somente é liberada a memória da instância do objeto, mas também toda a memória alocada por ele que no caso seriam as células.

Viu como ele auxilia; você não se preocupa nem com alocação e nem com liberação de memória porque a própria classe já faz isto.

TMemoryStream tb implementa os métodos SaveToFile e LoadFromFile; e aí você consegue salvar e carregar seu stringgrid inteiro.

O Delphi poderia ter implementado SaveToFile e LoadFromFile diretamente no stringgrid e você até pode fazer em tempo de compilação stringgrid1.Rows.SaveToFile, mas dará um erro porque Rows exige indexação e com isto você apenas salva aquela linha ou aquela coluna.

Se você tiver necessidade de carregar e salvar vários stringgrids é mais fácil você criar sua própria classe herdando de TStringGrid e implementando os métodos SaveToFile e LoadFromFile diretamente na classe herdada; daí você apenas faz:

Meu_StringGrid.SaveToFile e Meu_StringGrid.LoadFromFile.

Apenas citei o TMemoryStream p/ ver que o Delphi possui objetos de auxílio, mas um código mais prático seria:

var i,j:Integer; Arq:TextFile;
begin
  AssignFile(Arq, 'c:\temp\stringgrid1.txt');
  Rewrite(Arq);
  for i := 0 to stringgrid1.ColCount-1 do
    for j := 0 to stringgrid1.RowCount-1 do
      Writeln(Arq, stringgrid1.Cells[i,j]);
  CloseFile(Arq);    
end;

E para carregar, o inverso.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Obrigado pelas explicações.

Foi bom você ter dado a opção do TMemoryStream(não que seja a favor do mais complicado), pois assim temos a oportunidade de aprender, também, coisas diferentes e menos óbvias.

Com certeza as pessoas que estiveram interessadas em aprender algo mais

devem ter acompanhado este tópico.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...